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的汉字转GBK码实现代码
Feb 19 Python
c++生成dll使用python调用dll的方法
Jan 20 Python
python提取内容关键词的方法
Mar 16 Python
Python django实现简单的邮件系统发送邮件功能
Jul 14 Python
python Flask实现restful api service
Dec 04 Python
Python排序搜索基本算法之归并排序实例分析
Dec 08 Python
Python实现提取XML内容并保存到Excel中的方法
Sep 01 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
对django 模型 unique together的示例讲解
Aug 06 Python
tensorflow模型保存、加载之变量重命名实例
Jan 21 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
Python通过Schema实现数据验证方式
Nov 12 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中函数的形参与实参的问题说明
2010/09/01 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
JS中substring与substr的用法
2016/11/16 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
Python实现基于HTTP文件传输实例
2014/11/08 Python
Python实现的数据结构与算法之双端队列详解
2015/04/22 Python
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
用python写测试数据文件过程解析
2019/09/25 Python
Python线程threading模块用法详解
2020/02/26 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
给男朋友的道歉信
2014/01/12 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
故意杀人案辩护词
2015/05/21 职场文书
财务年终工作总结大全
2019/06/20 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技
Spring boot实现上传文件到本地服务器
2022/08/14 Java/Android