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使用PIL库实现验证码图片的方法
Mar 11 Python
Python实现可自定义大小的截屏功能
Jan 20 Python
Python字符串格式化%s%d%f详解
Feb 02 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
TensorFlow的权值更新方法
Jun 14 Python
pytorch 转换矩阵的维数位置方法
Dec 08 Python
对Python的多进程锁的使用方法详解
Feb 18 Python
详解用Python实现自动化监控远程服务器
May 18 Python
python程序快速缩进多行代码方法总结
Jun 23 Python
使用python模拟命令行终端的示例
Aug 13 Python
pytorch中的卷积和池化计算方式详解
Jan 03 Python
vue.js刷新当前页面的实例讲解
Dec 29 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
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
JS input 数字验证代码
2009/07/30 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
js 通过cookie实现刷新不变化树形菜单
2014/10/30 Javascript
js使用心得分享
2015/01/13 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
2016/04/14 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
Angular6笔记之封装http的示例代码
2018/07/27 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
python实现随机漫步方法和原理
2019/06/10 Python
python脚本和网页有何区别
2020/07/02 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
英语翻译系毕业生求职信
2013/09/29 职场文书
机电专业毕业生推荐信
2013/11/10 职场文书
《十六年前的回忆》教学反思
2014/02/14 职场文书
求职信模板标准格式范文
2014/02/23 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
护理专业求职信
2014/06/15 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
青年志愿者活动感想
2015/08/07 职场文书
JavaScript 对象创建的3种方法
2021/11/17 Javascript
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js