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基础教程项目五之虚拟茶话会
Apr 02 Python
python读取txt文件中特定位置字符的方法
Dec 24 Python
python中aioysql(异步操作MySQL)的方法
Apr 11 Python
利用Python查看微信共同好友功能的实现代码
Apr 24 Python
python用match()函数爬数据方法详解
Jul 23 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
Python中six模块基础用法
Dec 08 Python
python sorted函数原理解析及练习
Feb 10 Python
python ETL工具 pyetl
Jun 07 Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 Python
Pytorch中Softmax和LogSoftmax的使用详解
Jun 05 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 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对文件进行hash运算的方法
2015/04/03 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
PHP封装的简单连接MongoDB类示例
2019/02/13 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
一些Python中的二维数组的操作方法
2015/05/02 Python
使用python实现生成用户信息
2017/03/20 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
pandas数据处理进阶详解
2019/10/11 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
pycharm2020.1.2永久破解激活教程,实测有效
2020/10/29 Python
详解Python利用configparser对配置文件进行读写操作
2020/11/03 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
美国儿童玩具、装扮和玩偶商店:Magic Cabin
2018/09/02 全球购物
诺思信科技(南京)有限公司.NET笔试题答案
2013/07/06 面试题
初中地理教学反思
2014/01/11 职场文书
教学改革实施方案
2014/03/31 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
加强作风建设工作总结
2014/10/23 职场文书
爱国电影观后感
2015/06/19 职场文书