python OpenCV学习笔记(十八):轮廓属性

官方文档 – https://docs.opencv.org/3.4.0/d1/d32/tutorial_py_contour_properties.html


纵横比

它是物体的边界矩形的宽度与高度的比值。
这里写图片描述

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

Extent

Extent是轮廓面积和矩形边界面积的比值
这里写图片描述

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

Solidity

Solidity是轮廓面积和凸包面积的比值
这里写图片描述

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

等效直径

等效直径是指,与轮廓面积一样的圆的直径
这里写图片描述

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

方向

方向是指向物体的角度。下面的方法也给出了主轴和小轴的长度。

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

遮罩和像素点

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

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

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

最大值,最小值和它们的位置

我们可以使用遮罩图像找到这些参数。

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

平均色或平均强度

在这里,我们可以找到一个物体的平均颜色。也可以是灰度模式下物体的平均强度。我们还是用同样的遮罩来做这件事。

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

极端点

极端点指的是物体的最上面、最下方、最右边和最左边的点。

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

例如,如果我把它应用到印度地图上,我得到如下结果:
python OpenCV学习笔记(十八):轮廓属性_第1张图片

你可能感兴趣的:(OpenCV)