图像轮廓
边缘检测虽然能够检测出边缘,但边缘时不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体,用于后续计算。
轮廓的查找与绘制
轮廓查找
mode:
cv2.RETR_EXTERNAL 只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓
cv2.RETR_TREE建立一个等级树结构的轮廓
method:
cv2.CHAIN_APPROX_NONE存储所有的轮廓点
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。
import cv2
import numpy as np
img = cv2.imread('shape.jpg') #读取图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转为灰度值图
ret, binary = cv2.threshold(gray,220,255,cv2.THRESH_BINARY) #转为二值图
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,\
cv2.CHAIN_APPROX_NONE) #寻找轮廓
n=len(contours) #轮廓个数
print(n)
print(len(contours[0])) #轮廓0像素数目
print(len(contours[1])) #轮廓1像素数目
print(len(contours[2])) #轮廓2像素数目
print(len(contours[3])) #轮廓3像素数目
轮廓绘制
cv2.imshow("img",img) #显示原图像
img2 = cv2.drawContours(img,contours,1,(0,165,255),-1) #绘制轮廓,1表示绘制第几个轮廓
cv2.imshow("contours",img2) #显示轮廓
cv2.waitKey()
cv2.destroyAllWindows()
使用矩特征计算轮廓的面积及长度
计算图像的矩特征
import cv2
import numpy as np
img = cv2.imread('shape.jpg') #读取图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转为灰度值图
ret, binary = cv2.threshold(gray,220,255,cv2.THRESH_BINARY) #转为二值图
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,\
cv2.CHAIN_APPROX_NONE) #寻找轮廓
n=len(contours) #轮廓个数
contoursImg=[]
for i in range(n):
temp=np.zeros(img.shape,np.uint8) #生成黑背景
contoursImg.append(temp)
contoursImg[i]=cv2.drawContours(contoursImg[i],contours,i,(255,255,255), 3) #绘制轮廓
cv2.imshow("contours[" + str(i)+"]",contoursImg[i]) #显示轮廓
print("计算图像的矩特征:")
for i in range(n):
moment=cv2.moments(contours[i])
print(f"轮廓{i}的矩:\n{moment}")
cv2.waitKey()
cv2.destroyAllWindows()
计算面积
for i in range(n):
area=cv2.moments(contours[i])["m00"]
print(f"轮廓{i}的面积:\n{area}")
计算轮廓面积
import cv2
import numpy as np
img = cv2.imread('shape.jpg') #读取图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转为灰度值图
ret, binary = cv2.threshold(gray,220,255,cv2.THRESH_BINARY) #转为二值图
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,\
cv2.CHAIN_APPROX_NONE) #寻找轮廓
n=len(contours) #轮廓个数
contoursImg=[]
for i in range(n):
area = cv2.contourArea(contours[i])
print(f"轮廓{i}的面积:\n{area}")
轮廓0的面积:
249001.0
轮廓1的面积:
15321.0
轮廓2的面积:
28559.0
轮廓3的面积:
17753.0
© Fu Xianjun. All Rights Reserved.