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 相关文章推荐
Python3实现从文件中读取指定行的方法
May 22 Python
python使用logging模块发送邮件代码示例
Jan 18 Python
用TensorFlow实现lasso回归和岭回归算法的示例
May 02 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 Python
python cv2截取不规则区域图片实例
Dec 21 Python
Pytorch之finetune使用详解
Jan 18 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
Feb 19 Python
python中shell执行知识点
May 06 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
如何在python中处理配置文件代码实例
Sep 27 Python
教你怎么用Python监控愉客行车程
Apr 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
开源SNS系统-ThinkSNS
2008/05/18 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
2017/05/20 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
JAVASCRIPT keycode总结
2009/02/04 Javascript
JavaScript用Number方法实现string转int
2014/05/13 Javascript
jQuery消息提示框插件Tipso
2015/05/04 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
JavaScript的Vue.js库入门学习教程
2016/05/23 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
图解javascript作用域链
2019/05/27 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
解决$store.getters调用不执行的问题
2019/11/08 Javascript
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
2020/11/06 Javascript
python 链接和操作 memcache方法
2017/03/04 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
Python实现的redis分布式锁功能示例
2018/05/29 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
如何用python写一个简单的词法分析器
2018/12/18 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
区分python中的进程与线程
2020/08/13 Python
python使用多线程查询数据库的实现示例
2020/08/17 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
下面关于"联合"的题目的输出是什么
2013/08/06 面试题
请解释流与文件有什么不同
2016/07/29 面试题
2013年研究生毕业感言
2014/02/06 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
标准的毕业生自荐信
2014/04/20 职场文书
书法社团活动总结
2015/05/07 职场文书
python字典进行运算原理及实例分享
2021/08/02 Python