Opencv笔记(十七)——轮廓性质

边界矩形的宽高比

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

Extent

Extent就是轮廓面积与边界矩形面积的比。

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

Solidity

Solidity就是轮廓面积与凸包面积的比。

area = cv2.contourArea(cnt)
hull = cv2.convexHull(cnt)#计算出凸包形状
hull_area = cv2.contourArea(hull)#计算凸包的面积
solidity = float(area)/hull_area

Equivalent Diameter

Equivalent Diameter就是与轮廓面积相等的圆形的直径。

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

方向

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

(x,y),(MA,ma),angle = cv2.fitEllipse(cnt)#MA,ma 分别为长轴短轴长度

掩模和像素点

有时我们需要构成对象的所有像素点,我们可以这样做:

# coding=utf-8
import cv2
import numpy as np

img = cv2.imread("/home/wl/10.jpeg")
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转灰度图
mask = np.zeros(img_gray.shape,np.uint8) #依据图像的大小建立一个全黑的模板
ret, thresh = cv2.threshold(img_gray, 175, 255, 0) #灰度图像二值化处理
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[1]
cv2.drawContours(mask,[cnt],0,255,-1) #num为希望进行掩模显示的轮廓, # 这里一定要使用参数-1, 绘制填充的的轮廓
while(1):
    cv2.imshow("mask",mask)
    cv2.imwrite("/home/wl/baocun1.jpg", mask)
    k = cv2.waitKey(1) & 0XFF
    if k==ord('q'):
        break;
cv2.destroyAllWindows()

效果图:

轮廓最大值和最小值及它们的位置

我们可以使用掩模图像得到这些参数。

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

平均颜色及平均灰度

我们也可以使用相同的掩模求一个对象的平均颜色或平均灰度。

mean_valCol = cv2.mean(img,mask = mask) #彩色图像的平均颜色
mean_valGray=cv2.mean(imgray,mask = mask) #平均灰度

轮廓极点

一个对象最上面,最下面,最左边,最右边的点。

cnt=cnts[num] ##首先从所有的轮廓中选择其中的一个轮廓
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])

posted @ 2018-08-01 16:23  龙~白  阅读(376)  评论(0编辑  收藏  举报