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文本操作相关模块
Jun 22 Python
Python数据结构之栈、队列的实现代码分享
Dec 04 Python
python 读入多行数据的实例
Apr 19 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
python写入数据到csv或xlsx文件的3种方法
Aug 23 Python
Python Gluon参数和模块命名操作教程
Dec 18 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
TensorFlow获取加载模型中的全部张量名称代码
Feb 11 Python
Python print不能立即打印的解决方式
Feb 19 Python
如何使用scrapy中的ItemLoader提取数据
Sep 30 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 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 smarty的预保留变量总结
2008/12/04 PHP
php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
2011/01/07 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
JS 控件事件小结
2012/10/31 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
Angularjs 基础入门
2014/12/26 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
学习vue.js计算属性
2016/12/03 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
Vue3 中的数据侦测的实现
2019/10/09 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
详解pandas赋值失败问题解决
2020/11/29 Python
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
一套Delphi的笔试题一
2016/02/14 面试题
大学生家政服务项目创业计划书
2014/01/30 职场文书
学生违纪检讨书200字
2014/10/21 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
创业计划书之干洗店
2019/09/10 职场文书
python glom模块的使用简介
2021/04/13 Python
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis