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程序设计入门(4)模块和包
Jun 16 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
Mar 30 Python
python 重定向获取真实url的方法
May 11 Python
使用python 写一个静态服务(实战)
Jun 28 Python
Python @property使用方法解析
Sep 17 Python
Python 继承,重写,super()调用父类方法操作示例
Sep 29 Python
python tkinter 设置窗口大小不可缩放实例
Mar 04 Python
python编写俄罗斯方块
Mar 13 Python
15个Pythonic的代码示例(值得收藏)
Oct 29 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 Python
python 递归相关知识总结
Mar 03 Python
python爬虫--selenium模块
Mar 31 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下载远程图片函数 可伪造来路
2013/06/25 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
PHP自定义错误用法示例
2016/09/28 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
jQuery Ajax文件上传(php)
2009/06/16 Javascript
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
js实现简单掷骰子小游戏
2019/10/24 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
[03:48]2014DOTA2 TI专访71DK夺冠不靠小组赛高排名
2014/07/11 DOTA
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
基于python实现在excel中读取与生成随机数写入excel中
2018/01/04 Python
图解Python变量与赋值
2018/04/03 Python
python使用thrift教程的方法示例
2019/03/21 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
基于python3生成标签云代码解析
2020/02/18 Python
详解python datetime模块
2020/08/17 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
公立医院改革实施方案
2014/03/14 职场文书
慈善晚会策划方案
2014/05/14 职场文书
2014年妇委会工作总结
2014/12/10 职场文书
2014年小学数学工作总结
2014/12/12 职场文书
客房领班岗位职责
2015/02/11 职场文书
消夏晚会主持词
2015/06/30 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫