九 OpenCV学习笔记——图像轮廓(下)( 四 )


7.8 平均颜色及平均灰度
= cv2.mean(im,mask = mask)
import cv2import numpy as np#--------读取并显示原始图像-----------------o = cv2.imread('ct.png')cv2.imshow("original",o)#--------获取轮廓-----------------gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)image,contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)cnt=contours[2] #coutours[0]、coutours[1]是左侧字母R#--------使用掩模获取感兴趣区域的均值-----------------mask = np.zeros(gray.shape,np.uint8) #构造mean 所使用的掩模(必须是单通道的)cv2.drawContours(mask,[cnt],0,(255,255,255),-1)meanVal = cv2.mean(o,mask = mask) # mask 是一个区域,所以必须是单通道的print("meanVal=\n",meanVal)#--------使用掩模获取感兴趣区域并显示-----------------masko = np.zeros(o.shape,np.uint8)cv2.drawContours(masko,[cnt],-1,(255,255,255),-1)loc=cv2.bitwise_and(o,masko)cv2.imshow("mask",loc)#--------释放窗口-----------------cv2.waitKey()cv2.destroyAllWindows()运行后程序显示如下的运行结果:meanVal= (85.45594913714805, 85.45594913714805, 85.45594913714805, 0.0)
从上述结果可以看出,函数cv2.mean()能够计算各个通道的均值 。上述4个值分别是RGB和A通道(alpha通道)的均值 。本例中,RGB三个通道的值相同,所以计算出的均值也是一样的 。
7.9 极点
有时,我们希望获取某个对象内的极值点,例如最左端、最右端、最上端、最下端的四个点 。提供了相应的函数来找出这些点,通常的语法格式是:
= tuple(cnt[cnt[:,:,0].()][0])= tuple(cnt[cnt[:,:,0].()][0])= tuple(cnt[cnt[:,:,1].()][0])= tuple(cnt[cnt[:,:,1].()][0])
import cv2import numpy as npo = cv2.imread('cs.bmp')#--------获取并绘制轮廓-----------------gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)image,contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)mask = np.zeros(gray.shape,np.uint8)cnt=contours[0]cv2.drawContours(mask,[cnt],0,255,-1)#--------计算极值-----------------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])#--------打印极值-----------------print("leftmost=",leftmost)print("rightmost=",rightmost)print("topmost=",topmost)print("bottommost=",bottommost)#--------绘制说明文字-----------------font=cv2.FONT_HERSHEY_SIMPLEXcv2.putText(o,'A',leftmost, font, 1,(0,0,255),2)cv2.putText(o,'B',rightmost, font, 1,(0,0,255),2)cv2.putText(o,'C',topmost, font, 1,(0,0,255),2)cv2.putText(o,'D',bottommost, font, 1,(0,0,255),2)#--------绘制图像-----------------cv2.imshow("result",o)#--------释放窗口-----------------cv2.waitKey()cv2.destroyAllWindows()运行后程序显示如下的运行结果:leftmost= (202, 135)rightmost= (423, 120)topmost= (369, 69)bottommost= (216, 179)