【OpenCV-图像处理】图像轮廓3(轮廓属性)——OpenCV官方教程翻译(全网最详细)

OpenCV的imgproc 模块:如何求得一些轮廓属性?这里我们将学习提取物体的一些常用属性,如纵横比、延展度、实度、当量直径、方向、掩膜合像素点、最大值、最小值及其位置、平均颜色或平均强度、极值点等。

  • 一、目标
  • 二、轮廓属性
    • 2.1 纵横比(Aspect Ratio)
    • 2.2 延展度(Extent)
    • 2.3 实度(Solidity)
    • 2.4 当量直径(Equivalent Diameter)
    • 2.5 方向(Orientation)
    • 2.6 掩膜和像素点(Mask and Pixel Points)
    • 2.7 最大值、最小值及其位置( Maximum Value, Minimum Value and their locations)
    • 2.8 平均颜色或平均强度(Mean Color or Mean Intensity)
    • 2.9 极值点(Extreme Points)

一、目标

这里我们将学习提取物体的一些常用属性,如固体度、等效直径、掩模图像、平均强度等。
更多特性可以在Matlab regionprops文档中找到。
(注意:质心、面积、周长等也属于这一类,但我们在上一章已经看到了)

二、轮廓属性

2.1 纵横比(Aspect Ratio)

它是物体的边界矩形的宽与高之比。
在这里插入图片描述

x,y,w,h = cv2.boundingRect(cnt)
aspect_ratio = float(w)/h

2.2 延展度(Extent)

延伸度是指轮廓面积与包围矩形面积之比。
在这里插入图片描述

area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area

2.3 实度(Solidity)

实度是轮廓面积与凸壳面积之比。
在这里插入图片描述

area = cv2.contourArea(cnt)
hull = cv2.convexHull(cnt)
hull_area = cv2.contourArea(hull)
solidity = float(area)/hull_area

2.4 当量直径(Equivalent Diameter)

等值直径是面积与轮廓面积相等的圆的直径。
在这里插入图片描述

area = cv2.contourArea(cnt)
equi_diameter = np.sqrt(4*area/np.pi)

2.5 方向(Orientation)

方向是物体被指向的角度。下面的方法还给出了长轴和短轴的长度。

(x,y),(MA,ma),angle = cv2.fitEllipse(cnt)

2.6 掩膜和像素点(Mask and Pixel Points)

在某些情况下,我们可能需要包含该对象的所有点。
可以做到以下几点:

mask = np.zeros(imgray.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero(mask))
#pixelpoints = cv2.findNonZero(mask)

这里给出了两个方法,一个使用Numpy函数,另一个使用OpenCV函数(最后注释行)来做同样的事情。结果相同,但略有不同。Numpy以**(row, column)格式给出坐标,而OpenCV以(x,y)**格式给出坐标。所以基本上答案是互换的。注意,row = x, column = y。

2.7 最大值、最小值及其位置( Maximum Value, Minimum Value and their locations)

我们可以通过掩膜图像找到这些参数。

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray,mask = mask)

2.8 平均颜色或平均强度(Mean Color or Mean Intensity)

在这里,我们可以找到一个物体的平均颜色。或者它可以是对象在灰度模式下的平均强度。我们再次使用相同的掩膜。

mean_val = cv2.mean(im,mask = mask)

2.9 极值点(Extreme Points)

极值点是指物体的最上、最下、最右和最左的点。

leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])

例如,如果我把它应用到印度地图上,我会得到以下结果:
【OpenCV-图像处理】图像轮廓3(轮廓属性)——OpenCV官方教程翻译(全网最详细)_第1张图片
此外,在matlab的regionprops文档中还保留了一些其它特征。试着去实现它们。

主要参考于OpenCV官方网站:http://www.opencv.org.cn/

目前博主已更新OpenCV平滑处理函数、形态学操作函数的详细介绍,链接如下:
【OpenCV-图像处理】图像平滑处理函数

【OpenCV-图像处理】形态学变换函数

【OpenCV-图像处理】图像阈值处理

【OpenCV-图像处理】如何计算图像梯度,以及如何使用梯度来检测边缘

【OpenCV-图像处理】Canny 边缘检测

【OpenCV-图像处理】图像金字塔

【OpenCV-图像处理】图像轮廓1(寻找、绘制轮廓)

【OpenCV-图像处理】图像轮廓2(轮廓特征)

<后续还会继续翻译和整理【OpenCV-图像处理】相关内容,如果需要,可持续关注我哦~>

<翻译和整理不易,留个赞或评论支持一下我吧^^>

如有疑问,欢迎批评指正^^

你可能感兴趣的:(OpenCV图像处理,opencv,计算机视觉,图像处理,python)