美文网首页图像处理系列
opencv求多边形外接正方形

opencv求多边形外接正方形

作者: Brucezh_b171 | 来源:发表于2019-04-28 23:08 被阅读0次
Lena.jpeg

先解释下,我为什么选择上面这张女神的图片作为专题封面,因为太具代表性了,怎么说呢,上面的女神大家习惯的艺名是Lena,在深学图像领域,可以说绝大部分同学接触到的方法都能找到这位女神的影子,至于为什么是女神,还请大家自己谷歌一下把,毕竟我在这废话太多了是要被嫌弃的,emmmmmmm...

今天要总结的一个方法是,如何求多边形的外接正方形.什么叫做外接正方形呢?简单来说,就是任意一个封闭的多边形,都能够找到一个矩形把这个多边形包含在里面,这个矩形就叫做多边形的外接矩形,自然,外接正方形就是把外接矩形稍微处理一下,保证对多边形区域在一个正方形区域内,而不是矩形区域.那为什么一定要处理成正方形呢?矩形不可以吗?当然可以,只是最好是正方形,因为神经网络的输入通常需要统一的大小,如果是正方形resize为统一大小(比如224x224),就不至于导致数据被挤压的很过分,再为什么神经网络需要统一的输入大小呢,这个就要讲到计算机视觉的起源那了,我就不废话了

今天用到的一个模块是opencv,这里着重区分下opencv两个版本的差异:opencv3和opencv4

  • 求出所有封闭区域的点的轮廓
img = cv2.imread("Lena.jpeg")
# 转换为gray灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
bimg, contours, hier = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

关于函数的参数解释,推荐个简单的opencv中文网站opencv入门

  • 求轮廓的外接矩形
x0, y0, w, h = cv2.boundingRect(contours)
  • 求外接正方形:想一下,矩形是长宽不一致,而正方形是边长相等,所以,要求外接正方形,我们获取外接矩形的长宽中的最大值就可以,简单吧(如果是求长宽的最小值,则外接正方形不会包含整个多边形区域)
 for cidx,cnt in enumerate(contours):  #使用for循环是因为图像中可能包含多个多边形
        x0, y0, w, h = cv2.boundingRect(cnt)
        size= max(w, h)

下面附上我做的结果,岂能空口说白话(别嫌丑啊,中用)..


image.png

这就是所有步骤哦,另外opencv3和opencv4在cv2.findContours函数的返回值上有区别,下面分别附上opencv3opencv4的完整代码

opencv3:

img = cv2.imread("Lena.jpeg")
# 转换为gray灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
bimg, contours, hier = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
 for cidx,cnt in enumerate(contours):  #使用for循环是因为图像中可能包含多个多边形
        x0, y0, w, h = cv2.boundingRect(cnt)
        size = max(w, h)

opencv4:

img = cv2.imread("Lena.jpeg")
# 转换为gray灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 contours, hier = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
 for cidx,cnt in enumerate(contours):  #使用for循环是因为图像中可能包含多个多边形
        x0, y0, w, h = cv2.boundingRect(cnt)
        size = max(w, h)

附加:如果一张图有很多多边形,我们实际中可能只需要面积最大的那个多变形的外界正方形,肿么办啊,直接上代码:

img = cv2.imread("Lena.jpeg")
gray = cv2.cvtColor(mask_arr, cv2.COLOR_BGR2GRAY)
 # 寻找轮廓
bimg, contours,c= cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)    
coor = []
for cidx,cnt in enumerate(contours):
    x0, y0, w, h = cv2.boundingRect(cnt)
    crop_size = max(w, h)
    coor.append(list((x0,y0, crop_size)))
    coors = np.array(coor)

results =  list(coors[np.argmax(coors[:,2], axis=0), :])  # 返回面积最大的那一组坐标
x0=results[0]
y0 = results[1]
size =  results[2]  # 外接正方形边长

效果是这样的:


image.png 打赏.png

相关文章

  • opencv求多边形外接正方形

    先解释下,我为什么选择上面这张女神的图片作为专题封面,因为太具代表性了,怎么说呢,上面的女神大家习惯的艺名是Len...

  • Postgis 获取图层范围

    Postgis 获取图层范围 获取外接盒子 获取外接范围多边形 获取外接坐标极值 xminyminxmaxymax...

  • Opencv绘制多边形不显示

    Opencv绘制多边形不显示 如果图片是由torch.Tensor转换而来,直接使用Opencv进行多边形绘制(或...

  • OpenCV 之ios 多边形测试

    OpenCV 之ios 多边形测试 目的 本教程指导用户: 使用OpenCV函数 pointPolygonTest...

  • 5. 内切圆和外接圆

    展示正方向的内切圆和外接圆。 要求: 正方形宽度占页面整体宽度的10% 以此正方形为参照来画出内切圆和外接圆

  • OpenCV Python实现旋转矩形的裁剪

    环境 Python 3.8 OpenCV 4.4 最小外接矩形 矩形操作是我们在OpenCV里最常用的操作,其中最...

  • opencv+python -- 对象测量

    Code 获取图像的外接矩形boundingRect和几何距moments 多边形逼近approxPolyDP A...

  • 10.13

    输出 输出小数 求正方形面积 求正方形面积2 求三个数的平均数

  • 作业17-10-13

    输出 输出小数 求正方形面积 求正方形面积2 求三个数的平均数

  • 17-10-13

    输出 输出小数 求正方形的面积 求正方形面积(2) 求三个数的平均数

网友评论

    本文标题:opencv求多边形外接正方形

    本文链接:https://www.haomeiwen.com/subject/nhjsnqtx.html