这里我们将学习提取物体的一些常用属性,如固体度、等效直径、掩模图像、平均强度等。
更多特性可以在Matlab regionprops文档中找到。
(注意:质心、面积、周长等也属于这一类,但我们在上一章已经看到了)
x,y,w,h = cv2.boundingRect(cnt)
aspect_ratio = float(w)/h
area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area
area = cv2.contourArea(cnt)
hull = cv2.convexHull(cnt)
hull_area = cv2.contourArea(hull)
solidity = float(area)/hull_area
area = cv2.contourArea(cnt)
equi_diameter = np.sqrt(4*area/np.pi)
方向是物体被指向的角度。下面的方法还给出了长轴和短轴的长度。
(x,y),(MA,ma),angle = cv2.fitEllipse(cnt)
在某些情况下,我们可能需要包含该对象的所有点。
可以做到以下几点:
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。
我们可以通过掩膜图像找到这些参数。
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray,mask = mask)
在这里,我们可以找到一个物体的平均颜色。或者它可以是对象在灰度模式下的平均强度。我们再次使用相同的掩膜。
mean_val = cv2.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])
例如,如果我把它应用到印度地图上,我会得到以下结果:
此外,在matlab的regionprops文档中还保留了一些其它特征。试着去实现它们。
主要参考于OpenCV官方网站:http://www.opencv.org.cn/
目前博主已更新OpenCV平滑处理函数、形态学操作函数的详细介绍,链接如下:
【OpenCV-图像处理】图像平滑处理函数
【OpenCV-图像处理】形态学变换函数
【OpenCV-图像处理】图像阈值处理
【OpenCV-图像处理】如何计算图像梯度,以及如何使用梯度来检测边缘
【OpenCV-图像处理】Canny 边缘检测
【OpenCV-图像处理】图像金字塔
【OpenCV-图像处理】图像轮廓1(寻找、绘制轮廓)
【OpenCV-图像处理】图像轮廓2(轮廓特征)
<后续还会继续翻译和整理【OpenCV-图像处理】相关内容,如果需要,可持续关注我哦~> |
<翻译和整理不易,留个赞或评论支持一下我吧^^>
如有疑问,欢迎批评指正^^