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 相关文章推荐
详解PyTorch批训练及优化器比较
Apr 28 Python
浅谈Python中重载isinstance继承关系的问题
May 04 Python
利用Python查看微信共同好友功能的实现代码
Apr 24 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
Python生成一个迭代器的实操方法
Jun 18 Python
pandas通过字典生成dataframe的方法步骤
Jul 23 Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
Dec 29 Python
matplotlib交互式数据光标实现(mplcursors)
Jan 13 Python
Python机器学习之KNN近邻算法
May 14 Python
Windows安装Anaconda3的方法及使用过程详解
Jun 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初学者们头痛的十四个问题
2007/01/15 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
一个实用的图片切换支持点击切换和自动轮播
2014/09/09 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
JS建造者模式基本用法实例分析
2015/06/30 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
vue 移动端适配方案详解
2018/11/15 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
Python socket编程实例详解
2015/05/27 Python
十条建议帮你提高Python编程效率
2016/02/16 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
使用Django和Python创建Json response的方法
2018/03/26 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
2018/04/17 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
pandas数据集的端到端处理
2019/02/18 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
荷兰电脑专场:Paradigit
2018/05/05 全球购物
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
银行求职推荐信范文
2013/11/30 职场文书
考试退步检讨书
2014/01/15 职场文书
成考报名单位证明范本
2014/01/16 职场文书
班级道德讲堂实施方案
2014/02/24 职场文书
村长贪污检举信
2014/04/04 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python