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 BeautifulSoup设置页面编码的方法
Apr 03 Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
pycharm配置pyqt5-tools开发环境的方法步骤
Feb 11 Python
对python中if语句的真假判断实例详解
Feb 18 Python
详解Python基础random模块随机数的生成
Mar 23 Python
python爬虫神器Pyppeteer入门及使用
Jul 13 Python
python随机数分布random均匀分布实例
Nov 27 Python
详解Pycharm出现out of memory的终极解决方法
Mar 03 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 Python
Python使用Kubernetes API访问集群
May 30 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的加密方式及原理
2012/06/14 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
Python 面向对象 成员的访问约束
2008/12/23 Python
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
2017/07/10 Python
基于Python的XSS测试工具XSStrike使用方法
2017/07/29 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
Python缓存技术实现过程详解
2019/09/25 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
LN-CC日本:高端男装和女装的奢侈时尚目的地
2019/09/01 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
移动通信专业自荐信范文
2013/11/12 职场文书
公司市场部岗位职责
2013/12/02 职场文书
学校食堂采购员岗位职责
2013/12/05 职场文书
简单而又朴实的个人求职信分享
2013/12/12 职场文书
区域销售经理职责
2013/12/22 职场文书
小区文明倡议书
2014/05/16 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
地震捐款简报
2015/07/21 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js