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爬虫的工作原理
Mar 05 Python
浅谈python中的正则表达式(re模块)
Oct 17 Python
详解python实现线程安全的单例模式
Mar 05 Python
python 信息同时输出到控制台与文件的实例讲解
May 11 Python
Python使用while循环花式打印乘法表
Jan 28 Python
Python使用LDAP做用户认证的方法
Jun 20 Python
Django上线部署之IIS的配置方法
Aug 22 Python
logging level级别介绍
Feb 21 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
Selenium python时间控件输入问题解决方案
Jul 22 Python
分布式全文检索引擎ElasticSearch原理及使用实例
Nov 14 Python
Selenium 配置启动项参数的方法
Dec 04 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 AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
php中防止SQL注入的最佳解决方法
2013/04/25 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
js自定义事件代码说明
2011/01/31 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
JS实现两周内自动登录功能
2017/03/23 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
fetch 如何实现请求数据
2018/12/20 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
python进程类subprocess的一些操作方法例子
2014/11/22 Python
Python中的rfind()方法使用详解
2015/05/19 Python
linux下python使用sendmail发送邮件
2018/05/22 Python
Python Django 页面上展示固定的页码数实现代码
2019/08/21 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
意大利网上药房:Farmacia 33
2020/01/27 全球购物
五年级数学教学反思
2014/02/11 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
员工开除通知书
2015/04/25 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
运动会主持人开幕词
2016/03/04 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
nginx共享内存的机制详解
2022/03/21 Servers