本文将学习提取对象的一些常用属性,如密实度、等效直径、掩膜与像素点、平均强度等。 更多功能可以在Matlab regionprops documentation文档中找到。 (注意:质心、面积、周长等也属于这一类,但在上一章中已经看到)。
纵横比
纵横比是对象边界矩形的宽度与高度之比。
$$Aspect \; Ratio = \frac{Width}{Height}$$
%matplotlib inline
import matplotlib.pyplot as plt
import cv2
import numpy as np
img = cv2.imread('/data/cvdata/star.png', 0)
ret,thresh = cv2.threshold(img,127,255,0)
contours,hierarchy = cv2.findContours(thresh, 1, 2)
for cnt in contours:
area = cv2.contourArea(cnt)
print(area)
4.0 4.0 2.0 2.0 8.5 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 76185.5
x,y,w,h = cv2.boundingRect(cnt)
aspect_ratio = float(w)/h
aspect_ratio
3.282051282051282
area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area
extent
0.6104607371794872
area = cv2.contourArea(cnt)
hull = cv2.convexHull(cnt)
hull_area = cv2.contourArea(hull)
solidity = float(area)/hull_area
solidity
0.7952723438902691
area = cv2.contourArea(cnt)
equi_diameter = np.sqrt(4*area/np.pi)
equi_diameter
np.float64(311.45206908193876)
(x,y),(MA,ma),angle = cv2.fitEllipse(cnt)
mask = np.zeros(img.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero(mask))
#pixelpoints = cv.findNonZero(mask)
pixelpoints
array([[205, 323], [205, 324], [206, 322], ..., [399, 637], [399, 638], [399, 639]], shape=(76909, 2))
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(img,mask = mask)
mean_val = cv2.mean(img,mask = mask)
mean_val
(160.09079561559767, 0.0, 0.0, 0.0)
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])
例如,如果将其应用于印度地图,会得到以下结果: