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基础教程之循环介绍
Aug 29 Python
python脚本内运行linux命令的方法
Jul 02 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
Dec 05 Python
解决python3 pika之连接断开的问题
Dec 18 Python
Python3.5装饰器典型案例分析
Apr 30 Python
python3中替换python2中cmp函数的实现
Aug 20 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
Mar 09 Python
浅谈Python中range与Numpy中arange的比较
Mar 11 Python
Python如何把Spark数据写入ElasticSearch
Apr 18 Python
python如何使用腾讯云发送短信
Sep 17 Python
pytorch简介
Nov 11 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制作新闻系统的思路
2006/10/09 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
php使用mkdir创建多级目录入门例子
2014/05/10 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
PHP连接MYSQL数据库实例代码
2016/01/20 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
当jQuery1.7遇上focus方法的问题
2014/01/26 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
Vue实现简单的留言板
2020/10/23 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
在Python中使用异步Socket编程性能测试
2014/06/25 Python
python实现超简单端口转发的方法
2015/03/13 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
matplotlib中legend位置调整解析
2017/12/19 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
对python中dict和json的区别详解
2018/12/18 Python
Python中print和return的作用及区别解析
2019/05/05 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
python3中确保枚举值代码分析
2020/12/02 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
党员干部承诺书范文
2014/03/25 职场文书
委托公证书范本
2014/04/03 职场文书
单位员工收入证明样本
2014/10/09 职场文书
小学四年级学生评语
2014/12/26 职场文书
工程部文员岗位职责
2015/02/04 职场文书
企业文化学习心得体会
2016/01/21 职场文书