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进行TCP网络编程的教程
Apr 29 Python
Pythont特殊语法filter,map,reduce,apply使用方法
Feb 27 Python
python利用正则表达式提取字符串
Dec 08 Python
Python使用wxPython实现计算器
Jan 30 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 Python
python3之模块psutil系统性能信息使用
May 30 Python
使用django-guardian实现django-admin的行级权限控制的方法
Oct 30 Python
Python使用微信接入图灵机器人过程解析
Nov 04 Python
Python 实现Serial 与STM32J进行串口通讯
Dec 18 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
基于Django快速集成Echarts代码示例
Dec 01 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
构建简单的Webmail系统
2006/10/09 PHP
利用PHP制作简单的内容采集器的原理分析
2008/10/01 PHP
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
PHP实现的sqlite数据库连接类
2014/12/12 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
php实现异步数据调用的方法
2015/12/24 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
jQuery中:reset选择器用法实例
2015/01/04 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
基于zTree树形菜单的使用实例
2017/12/25 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
python导入坐标点的具体操作
2019/05/10 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
python画蝴蝶曲线图的实例
2019/11/21 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
党建工作先进材料
2014/05/02 职场文书
店长岗位职责
2015/02/11 职场文书
企业法人任命书
2015/09/21 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
python实现监听键盘
2021/04/26 Python