OpenCV-Python教程:20.轮廓属性

我们要得到一些目标有用的属性,比如当量直径

1.高宽比

这是目标的边界矩形的宽高比


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

2.Extent

Extent是轮廓面积和边界矩形面积的比率


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

3.Solidity

是轮廓面积和凸形外壳面积的比率


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

4.等价半径

是面积和轮廓面积一样的圆的半径


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

5.方向

目标的方向角度。下面的方法可以得到长轴和短轴长度

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

6.

在某些情况下,我们可能需要构成目标的所有点。

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

7.最大值,最小值以及他们的位置

参数使用了mask image

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

8.平均颜色和平均强度

我们可以得到目标的平均颜色。或者是灰度模式下的平均亮度。再次使用了mask image

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

9.端点

端点表示最高点,最低点,最左和最右点。

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-Python教程:20.轮廓属性_第1张图片

END

你可能感兴趣的:(OpenCV-Python教程:20.轮廓属性)