在图像裁剪操作中,opencv和pillow两个库都具有相应的函数,但是这两个库中的函数仅仅能对与图片平行的矩形进行裁剪操作,如果想要对目标的最小外接矩形进行裁剪该如何操作呢?如下所示:

具体处理该问题的思路如下:

计算最小外接矩形的四个点的坐标,旋转角度

将原图像进行旋转,旋转角度为最小外接矩形的角度

将四个点的坐标进行映射,求出被旋转后图像的四个点的坐标

利用这四个点对图像进行裁剪

图像原图如下:

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)]

2 将原图像进行旋转,旋转角度为最小外接矩形的角度,由于防止旋转后目标区域在图像外面,所以我将图像大小扩大为原来的2倍。

M = cv2.getRotationMatrix2D(rect[0],rect[2],1)

dst = cv2.warpAffine(rotateimg,M,(2*rotateimg.shape[0],2*rotateimg.shape[1]))

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))

到此,利用4个坐标点对图像进行裁剪操作已经完成。

python如何做四象图_Python使用四个坐标点来剪切图像目标区域的最小外接矩形,python,利用,对,图片,进行,裁剪...相关推荐

  1. python如何做四象图_python︱imagehash中的四种图像哈希方式(phash/ahash/dhash/小波hash)...

    code来源:https://github.com/JohannesBuchner/imagehash 外文原文:https://fullstackml.com/wavelet-image-hash- ...

  2. python如何做四象图_(Python)从零开始,简单快速学机器仿人视觉Opencv—第十四节:图像梯度...

    事先说明 图像梯度原理:简单来说就是求导 OpenCV提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr和Laplacian.Sobel和Scharr是求一阶或二阶导数.Schar ...

  3. python怎么做折线图_python怎么画折线图

    匿名用户 1级 2018-01-18 回答 一.环境准备 linux ubuntu 下需安装下面三个包: Numpy, Scipy,Matplotlib 分别输入下面的代码进行安装: [plain]  ...

  4. python怎么变成动图_python可以做动图吗

    ImageMagick 是一套功能强大.稳定而且开源的工具集和开发包,可以用来读.写和处理超过200种基本格式的图片文件,包括PNG,JPEG,GIF,HEIC,TIFF,DPX,EXR,WebP,P ...

  5. python 提取最小外接矩形_python给人脸带上口罩(简单版)

    导读 因为目前公开的口罩人脸数据比较少,如果想训练一个口罩人脸识别模型,必须依赖大量的人脸数据.为了收集到更多的口罩人脸数据,我们只能利用已有的公开人脸数据上通过程序来模拟人脸带口罩.这篇文章向大家介 ...

  6. python外包凹多边形生成_Python实现图片查找轮廓、多边形拟合、最小外接矩形代码...

    1.概述 经常用到轮廓查找和多边形拟合等opencv操作,因此记录以备后续使用.本文代码中的阈值条件对图片没有实际意义,仅仅是为了测试. 原图为: 2.测试代码: import cv2 import ...

  7. python opencv最小外接矩形_Opencv绘制最小外接矩形、最小外接圆

    Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle. minAreaRect方法原型: RotatedRect minAre ...

  8. python+opencv获取最小外接矩形

    python+opencv获取最小外接矩形 环境 代码 效果 环境 python版本:3.8 opencv版本:4.3.0.36 代码 from PIL import Image from pylab ...

  9. python opencv最小外接矩形中心点_Opencv绘制最小外接矩形、最小外接圆

    Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle. minAreaRect方法原型: RotatedRect minAre ...

最新文章

  1. 全检体系结构风格浅谈
  2. acwing算法题--看图做题
  3. 转:思科3750交换机堆叠技术配置向导
  4. java做一个简单的数据库,哪个嵌入式数据库用Java写成一个简单的键/值存储?
  5. spring使用注解@Scheduled执行定时任务
  6. SAP License:SAP财务管理的认识
  7. 电子健康行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  8. [转]html控件、html服务器控件和web服务器控件的区别
  9. 远程连接mysql失败异常,未配置权限,skip-name-resolve以及防火墙
  10. Hive 函数之 Rank 函数案例
  11. RAR压缩包密码如何解密
  12. 回忆真是一个痛苦的过程
  13. Python鼠标模拟
  14. Docker基本概念
  15. 室内定位的电子地图编辑工具
  16. sox和lame音频处理器
  17. UpdateData用法解释
  18. 3dsmax网格重构细分
  19. WebView-WebView简介
  20. 如何在论文中表格和图片变成引用格式,实现ctrl访问

热门文章

  1. Idea的常见插件和快捷键
  2. Docker pull镜像超时,i/o timeout
  3. 计算机怎么看事件管理,【谁登了个人电脑?教你如何查看Windows事件日志】
  4. react-native Unrecognized font family 'xxx'(已解决)
  5. Python - 数据容器set(集合)
  6. 【NX二次开发】移动WCS坐标系
  7. Windows server 2019 VMware 虚拟机安装教程
  8. pivot position_矩阵里的pivot是什么?请解释详细
  9. 使用DigestUtils实现md5加密算法
  10. winform笔记本蓝牙与外部蓝牙设备通信