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语言中的按位运算符
Nov 26 Python
Python自动化构建工具scons使用入门笔记
Mar 10 Python
python使用in操作符时元组和数组的区别分析
May 19 Python
Python简单删除目录下文件以及文件夹的方法
May 27 Python
Python的time模块中的常用方法整理
Jun 18 Python
python实现域名系统(DNS)正向查询的方法
Apr 19 Python
Python实现感知器模型、两层神经网络
Dec 19 Python
分数霸榜! python助你微信跳一跳拿高分
Jan 08 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
Python Tkinter模块实现时钟功能应用示例
Jul 23 Python
wxPython:python首选的GUI库实例分享
Oct 05 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
Dec 10 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
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
2011/01/24 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
微信小程序 自定义对话框实例详解
2017/01/20 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
AngularJS下$http服务Post方法传递json参数的实例
2018/03/29 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
2018/05/02 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
python通过索引遍历列表的方法
2015/05/04 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
python中添加模块导入路径的方法
2021/02/03 Python
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
计算机专业学生的自我评价
2013/12/15 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
公安派出所所长四风问题个人对照检查材料
2014/10/04 职场文书
小学大队长竞选稿
2015/11/20 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL
ES6 解构赋值的原理及运用
2021/05/25 Javascript
Pandas加速代码之避免使用for循环
2021/05/30 Python
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python