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 09 Python
使用Python实现一个简单的项目监控
Mar 31 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
windows系统下Python环境搭建教程
Mar 28 Python
python中如何使用正则表达式的非贪婪模式示例
Oct 09 Python
Python实现的HMacMD5加密算法示例
Apr 03 Python
python使用matplotlib库生成随机漫步图
Aug 27 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
如何使用python操作vmware
Jul 27 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 Python
python性能测量工具cProfile使用解析
Sep 26 Python
Elasticsearch 基本查询和组合查询
Apr 19 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中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
PHP中上传文件打印错误错误类型分析
2019/04/14 PHP
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
利用python计算时间差(返回天数)
2019/09/07 Python
Python实现对word文档添加密码去除密码的示例代码
2020/12/29 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
Viking比利时:购买办公用品
2019/10/30 全球购物
瑞典耳机品牌:URBANISTA
2019/12/03 全球购物
波兰家居饰品和厨房配件网上商店:Maleomi
2020/12/15 全球购物
上海微创软件面试题
2012/06/14 面试题
企业年会主持词
2014/03/27 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
2015年体育部工作总结
2015/04/02 职场文书
中学政教处工作总结
2015/08/13 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书