python四个坐标点对图片区域最小外接矩形进行裁剪
作者:乱世流星01 发布时间:2022-01-18 02:18:09
标签:python,图片,坐标,裁剪
在图像裁剪操作中,opencv和pillow两个库都具有相应的函数,但是这两个库中的函数仅仅能对与图片平行的矩形进行裁剪操作,如果想要对目标的最小外接矩形进行裁剪该如何操作呢?如下所示:
具体处理该问题的思路如下:
计算最小外接矩形的四个点的坐标,旋转角度
将原图像进行旋转,旋转角度为最小外接矩形的角度
将四个点的坐标进行映射,求出被旋转后图像的四个点的坐标
利用这四个点对图像进行裁剪
图像原图如下:
1 求出该区域的最小外接矩形,并且得到外接矩形的四个点的坐标和旋转角度。
rect = cv2.minAreaRect(self.contours[0])#rect为[(旋转中心x坐标,旋转中心y坐标),(矩形长,矩形宽),旋转角度]
box_origin = cv2.boxPoints(rect)#box_origin为[(x0,y0),(x1,y1),(x2,y2),(x3,y3)]
2 将原图像进行旋转,旋转角度为最小外接矩形的角度,由于防止旋转后目标区域在图像外面,所以我将图像大小扩大为原来的2倍。
M = cv2.getRotationMatrix2D(rect[0],rect[2],1)
dst = cv2.warpAffine(rotateimg,M,(2*rotateimg.shape[0],2*rotateimg.shape[1]))
3 将原四个点的坐标做映射,映射到旋转后的区域,得到新的四个点的坐标。
#逆时针旋转
def Nrotate(angle,valuex,valuey,pointx,pointy):
angle = (angle/180)*math.pi
valuex = np.array(valuex)
valuey = np.array(valuey)
nRotatex = (valuex-pointx)*math.cos(angle) - (valuey-pointy)*math.sin(angle) + pointx
nRotatey = (valuex-pointx)*math.sin(angle) + (valuey-pointy)*math.cos(angle) + pointy
return (nRotatex, nRotatey)
#顺时针旋转
def Srotate(angle,valuex,valuey,pointx,pointy):
angle = (angle/180)*math.pi
valuex = np.array(valuex)
valuey = np.array(valuey)
sRotatex = (valuex-pointx)*math.cos(angle) + (valuey-pointy)*math.sin(angle) + pointx
sRotatey = (valuey-pointy)*math.cos(angle) - (valuex-pointx)*math.sin(angle) + pointy
return (sRotatex,sRotatey)
#将四个点做映射
def rotatecordiate(angle,rectboxs,pointx,pointy):
output = []
for rectbox in rectboxs:
if angle>0:
output.append(Srotate(angle,rectbox[0],rectbox[1],pointx,pointy))
else:
output.append(Nrotate(-angle,rectbox[0],rectbox[1],pointx,pointy))
return output
box = rotatecordiate(rect[2],box_origin,rect[0][0],rect[0][1])
4 利用四个点坐标进行裁剪,如2中图所示,图像经过旋转后已经变为和图片没有旋转角的图像,经过实验观察旋转后的坐标还是有细微差别,但误差已经在千分点甚至万分点左右,对我们裁剪造成的影响可以忽略不计。
def imagecrop(image,box):
xs = [x[1] for x in box]
ys = [x[0] for x in box]
print(xs)
print(min(xs),max(xs),min(ys),max(ys))
cropimage = image[min(xs):max(xs),min(ys):max(ys)]
print(cropimage.shape)
cv2.imwrite('cropimage.png',cropimage)
return cropimage
imagecrop(dst,np.int0(box))
到此,利用4个坐标点对图像进行裁剪操作已经完成。
来源:https://blog.csdn.net/u014662865/article/details/105125361


猜你喜欢
- 1、注意:pool必须在 if __name__ == '__main__' 下面运行,不然会报错2、多进程内出现错误会直接
- 可变参数可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如def testArg(*arg)你可以传入任意多个元
- 本文实例讲述了Python2与Python3的区别。分享给大家供大家参考,具体如下:python2与python3的区别1、性能2、编码格式
- asp之家注:asp中FSO组件的功能很强大,如果没有FSO很难想象ASP会变成什么样。对于学习asp编程的朋友一定会接触到FSO相关的操作
- 在开始安装SQL Server 2005数据库过程中,出现了下面的错误,安装不能继续进行:The SQL Server System Con
- 本篇已得到原作者Steve Dennis的翻译准予,在此Jorux表示感谢!本教程主要参考Creating a CSS Layo
- 1. 使用 in 和 not inin 和 not in 在 Python 中是很常用的关键字,我们将它们归类为 成员运算符。使用这两个成员
- 1.小猫运动游戏源码# @Author : 辣条'''多行注释本程序运行后会有一只小猫向前走安装模块 pip ins
- 数据类型判断在python(版本3.0以上)使用变量,并进行值比较时。有时候会出现以下错误:TypeError: unorderable t
- 在软件开发的初始阶段,开发商们总是想把整个系统的最小的细节设计好了,然后再去单线程的编写代码。这样软件开发完成需要很长时间,但开发商们一直都
- 字符串的表示方式单引号 ' '双引号 " "多引号 """ "&
- 虚拟环境的创建命令行窗口中使用conda create -n 环境名 python=所需python版本即可创建虚拟环境pytorch的gp
- 在处理数据的时候,很多时候会遇到批量替换的情况,如果一个一个去修改效率过低,也容易出错。replace()是很好的方法。源数据1、替换全部或
- 之前我们使用VSCode搭建C#项目,今天写一篇关于django项目的搭建,其实以其说是搭建django框架,不如说是如何通过vscode开
- 前情提要好久没有写Vue了,略有生疏,这个东西还是得多用。下午看到一个需求,选择相册图片作为轮播图显示。接口返回相册列表,用户选一下再扔回去
- 本文实例为大家分享了python策略模式代码,供大家参考,具体内容如下"""策略模式""&
- 本文实例讲述了php tpl模板引擎定义与使用。分享给大家供大家参考,具体如下:tpl.php<?phpnamespace tpl;/
- 安装docker桌面程序从docker官网下载并安装桌面程序。安装好后启动桌面程序。若出现以下错误,说明你的docker 没有启动。1. d
- 一、什么是协程协程拥有自己的寄存器和栈。协程调度切换的时候,将寄存器上下文和栈都保存到其他地方,在切换回来的时候,恢复到先前保存的寄存器上下
- 绘制组合图:组合图就是将多个形状,组合到⼀个图形中,主要作⽤是节约作图的空间,节省读者的时间,从⽽提⾼信息传达的效率。import pand