python四个坐标点对图片区域最小外接矩形进行裁剪


Posted in Python onJune 04, 2021

在图像裁剪操作中,opencv和pillow两个库都具有相应的函数,但是这两个库中的函数仅仅能对与图片平行的矩形进行裁剪操作,如果想要对目标的最小外接矩形进行裁剪该如何操作呢?如下所示:

python四个坐标点对图片区域最小外接矩形进行裁剪

具体处理该问题的思路如下:

  • 计算最小外接矩形的四个点的坐标,旋转角度
  • 将原图像进行旋转,旋转角度为最小外接矩形的角度
  • 将四个点的坐标进行映射,求出被旋转后图像的四个点的坐标
  • 利用这四个点对图像进行裁剪

图像原图如下:

python四个坐标点对图片区域最小外接矩形进行裁剪

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)]

python四个坐标点对图片区域最小外接矩形进行裁剪

2 将原图像进行旋转,旋转角度为最小外接矩形的角度,由于防止旋转后目标区域在图像外面,所以我将图像大小扩大为原来的2倍。

M = cv2.getRotationMatrix2D(rect[0],rect[2],1)
dst = cv2.warpAffine(rotateimg,M,(2*rotateimg.shape[0],2*rotateimg.shape[1]))

python四个坐标点对图片区域最小外接矩形进行裁剪

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))

python四个坐标点对图片区域最小外接矩形进行裁剪

到此,利用4个坐标点对图像进行裁剪操作已经完成。

到此这篇关于python四个坐标点对图片区域最小外接矩形进行裁剪的文章就介绍到这了,更多相关python 图片坐标裁剪内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python的Django框架中if标签的相关使用
Jul 15 Python
Python中selenium实现文件上传所有方法整理总结
Apr 01 Python
python删除服务器文件代码示例
Feb 09 Python
python3 判断列表是一个空列表的方法
May 04 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
Python判断有效的数独算法示例
Feb 23 Python
使用Python控制摄像头拍照并发邮件
Apr 23 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
详解pyinstaller selenium python3 chrome打包问题
Oct 18 Python
Python获取、格式化当前时间日期的方法
Feb 10 Python
python urllib库的使用详解
Apr 13 Python
Python OpenCV 图像平移的实现示例
Python包argparse模块常用方法
Jun 04 #Python
opencv读取视频并保存图像的方法
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 #Python
python opencv旋转图片的使用方法
Python还能这么玩之用Python修改了班花的开机密码
Anaconda安装pytorch及配置PyCharm 2021环境
You might like
PHP中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
php中的Base62类(适用于数值转字符串)
2013/08/12 PHP
不使用XMLHttpRequest实现异步加载 Iframe和script
2012/10/29 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
2014/06/26 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
Vue 进阶教程之v-model详解
2017/05/06 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
python中字典dict常用操作方法实例总结
2015/04/04 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
举例详解Python中yield生成器的用法
2015/08/05 Python
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
python编写猜数字小游戏
2019/10/06 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
python 判断一组数据是否符合正态分布
2020/09/23 Python
澳大利亚宠物食品和用品商店:PETstock
2020/01/02 全球购物
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
Linux上比较文件的命令都有哪些
2013/09/28 面试题
退伍老兵事迹材料
2014/01/31 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
五年后的职业生涯规划
2014/03/04 职场文书
交通事故调解协议书
2014/04/16 职场文书
国际商务专业求职信
2014/07/15 职场文书
2016银行招聘自荐信
2016/01/28 职场文书