利用opencv-python 进行图像的不规则裁剪

利用凸包进行裁剪

首先我们进行凸包裁剪,先利用 cv2.convexHull(xy) 函数得到点集xy的凸包顶点。然后利用mask进行提取,并利用截取数组行列的方法得到图像。代码:

def hull_cut(filter_xy,img):hull=cv2.convexHull(filter_xy)col0 =hull[:,:,0]col1 =hull[:,:,1]x1=np.min(col0)y1=np.min(col1)x2=np.max(col0)y2 = np.max(col1)if x1 < 0:x1 = 0if x2 > img.shape[1]:x2 = img.shape[1]if y1 < 0:y1 = 0if y2 > img.shape[0]:y2 = img.shape[0]mask=np.zeros(img.shape,dtype=np.uint8)#创建与原图大小的掩码,这里掩码全为0.mask2 = cv2.fillPoly(mask,[hull],(255,255,255))ROI = cv2.bitwise_and(mask2, img)img_end=ROI[y1:y2,x1:x2]return img_end

裁剪原图(目的就是提取这个蓝色点所占据的建筑)

裁剪结果

进行最小矩形截取,但不对图片进行旋转

首先利用求最小矩形的方法来求矩形框。在以框为mask进行裁剪。其中求最小矩形框采用的是cv2.minAreaRect(xy) 值得细讲。
minAreaRect() 返回了所需区域的最小斜矩形的参数,与包围框直接返回四个顶点的坐标不同,最小外接矩形返回的是矩形的 ((x, y), (w, h), angle),对应了矩形的中心,宽度,高度和旋转角度。

旋转角度angle是水平轴(x轴)逆时针旋转,与碰到的矩形的 第一条边的夹角。并且这个边的边长是width,另一条边边长是height。也就是说,width与height不是按照长短来定义的。

在OpenCV中,坐标系原点在左上角,相对于x轴,逆时针旋转角度为负,顺时针旋转角度为正,所以函数minAreaRect()返回的角度范围时[-90~0)。一个平放的长矩形,调用minAreaRect() 返回的角度为-90度。如果旋转图像,矩形树立起来,这时调用minAreaRect()得到的角度依然是-90度。

参考链接OpenCV Python实现旋转矩形的裁剪
代码如下:

def rect_cut_U(filter_xy,img):#按照最小矩形进行裁剪,但不进行旋转,保留黑色填补rect = cv2.minAreaRect(filter_xy)#得到最小矩形size=tuple(map(int, rect[1]))if size[0] < size[1]:w = size[1]h = size[0]else:w = size[0]h = size[1]if w>1500 or h<224:img_end=Noneelse:box = cv2.boxPoints(rect)#得到矩形的坐标box=np.int0(box)boxed=box.reshape((-1,1,2))col0 =box[:,0]col1 =box[:,1]x1=np.min(col0)y1=np.min(col1)x2=np.max(col0)y2 = np.max(col1)if x1 < 0:x1 = 0if x2 > img.shape[1]:x2 = img.shape[1]if y1 < 0:y1 = 0if y2 > img.shape[0]:y2 = img.shape[0]mask=np.zeros(img.shape,dtype=np.uint8)#创建与原图大小的掩码,这里掩码全为0.mask2 = cv2.fillPoly(mask,[boxed],(255,255,255))ROI = cv2.bitwise_and(mask2, img)img_end=ROI[y1:y2,x1:x2]return img_end

截取结果

利用仿射变换将图像旋转到水平。

这里其实是将整个图像按照求出的矩形偏转角进行旋转,然后利用 cv2.minAreaRect得到的w,h尺寸来截取,代码如下:

def rect_cut_A(filter_xy,img):#基于仿射变换进行horizon = True #是否将截取的图片放平rect = cv2.minAreaRect(filter_xy)#得到最小矩形的中心点(x,y),宽度和高度(w,h),旋转角度angle。center, size, angle = rect[0], rect[1], rect[2]center, size = tuple(map(int, center)), tuple(map(int, size))if horizon:#保证长边为宽,且在水平线上if size[0] < size[1]:angle -= 270w = size[1]h = size[0]else:w = size[0]h = size[1]size = (w, h)if w>1500 or h<224:img_crop=Noneelse:height, width = img.shape[0], img.shape[1]M = cv2.getRotationMatrix2D(center, angle, 1)img_rot = cv2.warpAffine(img, M, (width, height))img_crop = cv2.getRectSubPix(img_rot, size, center)return img_crop

截取结果

采用透视变换进行图像转正(不推荐,因为有时会产生扭曲)

这方法实际是直接将得到的最小矩形顶点进行透视变换,由不水平的面,投影到水平面。涉及到投影,所以计算实际更多,而且有时会出现扭曲变形,因为像素点的位置完全改变了。
代码:

def rect_cut(filter_xy,img):#基于透视变换截取图片rect = cv2.minAreaRect(filter_xy)#得到最小矩形box = cv2.boxPoints(rect)#得到矩形的坐标box=np.int0(box)#标准化坐标到整数#box2= box.reshape((-1, 1, 2))width=int(rect[1][0])height=int(rect[1][1])if width > height:w = widthh = heightelse:w = heighth = widthif w>1500 or h<224:warped=Noneelse:src_pts = box.astype("float32")dst_pts = np.array([[w - 1, h - 1],[0, h - 1],[0, 0],[w - 1, 0]], dtype="float32")M = cv2.getPerspectiveTransform(src_pts, dst_pts)warped = cv2.warpPerspective(img, M, (w, h))return warped

截取结果

这个图是截取的正好,没有发生扭曲。加入截取原图中绿色的点就会出现扭曲,如图

所以不推荐使用
参考链接
[1]:https://www.jianshu.com/p/90572b07e48f
[2]:https://blog.csdn.net/qq_32593713/article/details/102653870

利用opencv-python 进行图像的不规则裁剪相关推荐

  1. openCV—Python(6)—— 图像算数与逻辑运算

    openCV-Python(6)-- 图像算数与逻辑运算 一.函数简介 1.add-图像矩阵相加 函数原型:add(src1, src2, dst=None, mask=None, dtype=Non ...

  2. OpenCV python 提取图像内的三色

    OpenCV python 提取图像内的三色 原图 [opencv.jpg] import cv2 import numpy as npdef main():# 1.导入图片img_src = cv2 ...

  3. python中import cv2遇到的错误及安装方法_独家利用OpenCV,Python和Ubidots来构建行人计数器程序(附代码amp;解析)...

    作者:Jose Garcia 翻译:吴振东 校对:张一豪 本文约4000字,建议阅读14分钟. 本文将利用OpenCV,Python和Ubidots来编写一个行人计数器程序,并对代码进行了较为详细的讲 ...

  4. OpenCV+python:图像二值化

    1,图像二值化概念及方法 一个像素点的颜色是由RGB三个值来表现的,所以一个像素点矩阵对应三个颜色向量矩阵,分别是R矩阵,G矩阵,B矩阵,它们也都是同样大小的矩阵. 在图像处理中,用RGB三个分量(R ...

  5. opencv+python实现图像的增强与合成(人像迁移)

    代码链接:图像的增强与合成 最近做了一个小实验,内容是图像的增强与合成,觉着挺有意思,记录一下. 首先效果是这样的: 利用Python和Opencv算法,实现下述功能: 1. 准备本人在纯色背景前的照 ...

  6. OpenCV+python:图像梯度

    1,图像梯度的概念 梯度简单来说就是求导,在图像上表现出来的就是提取图像的边缘(无论是横向的.纵向的.斜方向的等等),所需要的是一个核模板.模板的不同结果也不同.所以能够看到,全部的这些个算子函数,归 ...

  7. 利用OpenCV求取图像的重心

    转自:http://blog.csdn.net/lxiaoxiaot/article/details/6539834 不规则区域的矩,表示把一个归一化的灰度级图像函数理解为一个二维随机变量的概率密度. ...

  8. 利用OpenCV建立视差图像

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...

  9. python opencv 图像切割_【OpenCV+Python】图像的基本操作与算术运算

    图像的基本操作 在上个教程中,我们介绍了使用鼠标画笔的功能.本次教程,我们将要谈及OpenCV图像处理的基本操作. 本次教程的所有操作基本上都和Numpy相关,而不是与OpenCV相关.要使用Open ...

  10. OpenCV—Python PyLibTiff_psd 图像基本操作以及图像格式转换

    文章目录 一.图片 读.写.显示.属性查看 libtiff 包装器 Python 模块 opencv 模块 PIL 模块 直接修改图片格式 大(分辨率大)图片缩小 与上面代码同效 二.PSD图像读取与 ...

最新文章

  1. python创建新文件-如何在python中编辑文件并创建一个新的文件?
  2. 前端交接文档_开发型Web前端和设计型Web前端的区别是什么?
  3. 找工作是一种必须的生活阅历
  4. Sql Server 日志清理 (数据库压缩方法)
  5. PPT 下载 | 神策数据算法专家:推荐系统的实践与思考(上)
  6. bct对oracle影响,Oracle 优化篇+Rman增量备份优化之BCT(块变更追踪)
  7. layui --- [结构优化]参数优化
  8. oracle存储过程写法(一)
  9. jQuery 追加元素的方法如append、prepend、before、after
  10. 一个令你颤抖的flutter动画:Basic Animations
  11. 2020年度20多款主流数据库重大更新及技术要点回顾
  12. elas算法源码赏析(一):PGM格式图片的读取和保存
  13. 破解app 在so层的密钥key
  14. VMware如何开机自动启动虚拟机也启动
  15. 一款阿里的知识管理工具
  16. 苹果电脑表格取消自动计算机,苹果电脑excel序列被隐藏怎么办
  17. REST-assured简介
  18. 南京配眼镜避坑指南,轻松找到高性价比眼镜店
  19. Vue报错:VueCompilerError: Attribute name cannot contain U+0022 (“), U+0027 (‘), and U+003C (<).
  20. 《机器人SLAM导航核心技术与实战》前言

热门文章

  1. 华硕a53s拆机图解_华硕a53s配置 功能与外观描述【图解】
  2. linux内核源码分析之proc文件系统(三)
  3. JavaScript数组对象深拷贝
  4. isolate两三事
  5. 【Unity破事水】如何实现线上试卷选择题的选项
  6. 安全L2-1.4-安全术语介绍
  7. Python学习 - 列表
  8. java 蓝桥杯 分机号
  9. 基于web的木子日记个人博客网站的设计与实现
  10. 糯米网电子商务模式:上线当天销售额600多万元的缘由