python四个坐标点对图片区域最小外接矩形进行裁剪
作者:乱世流星01 时间:2022-01-18 02:18:09
在图像裁剪操作中,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
标签:python,图片,坐标,裁剪
0
投稿
猜你喜欢
使用 Python 获取 Linux 系统信息的代码
2022-04-15 06:32:12
Python万字深入内存管理讲解
2021-06-30 15:49:33
JavaScript中诡异的delete操作符
2024-04-10 16:15:33
如何设计具可用性的网页表单?
2010-03-20 21:57:00
如何利用Python随机从list中挑选一个元素
2023-08-04 00:05:54
python_mask_array的用法
2022-05-10 06:25:27
Vue+Java+Base64实现条码解析的示例
2024-05-02 17:08:27
用 Python 绘制全国鸿星尔克门店分布图
2022-03-07 11:26:12
java 查询oracle数据库所有表DatabaseMetaData的用法(详解)
2024-01-16 02:31:33
升级SQL Server 2014的四个要点要注意
2024-01-18 09:58:01
详解Mysql如何实现数据同步到Elasticsearch
2024-01-23 04:39:57
argparse 模块简介
2023-05-27 10:19:36
python MySQLdb使用教程详解
2024-01-28 06:29:51
Python 列表映射后的平均值
2021-12-25 19:02:39
Python 命令行非阻塞输入的小例子
2023-12-09 19:48:29
Python机器学习应用之基于决策树算法的分类预测篇
2021-10-28 20:53:14
JavaScript中实现块作用域的方法
2024-04-16 10:38:39
分析SQL Server中数据库的快照工作原理
2009-01-19 14:03:00
TypeScript入门-接口
2024-06-07 15:55:26
Python3 Tkinter选择路径功能的实现方法
2022-03-12 19:39:28