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


从以上运行结果可以看出,函数cv2.()以不同形式返回的值是相同的 。
7.6 掩模和像素点
有时,我们希望获取某对象的掩模图像及其对应的点 。1.3 节介绍了将函数cv2.()的轮廓宽度参数设置为“-1”,即可获取特定对象的实心轮廓,即特定对象的掩模 。另外,我们可能还希望获取轮廓像素点的具体位置信息 。本节介绍如何获取轮廓(实心、空心)的像素点位置信息 。
提供了函数cv2.()用于查找非零元素的索引 。该函数的语法格式为:
idx = cv2.( src )
#使用OpenCV 函数cv2.findNonZero()获取一个数组内的非零值 。import cv2import numpy as np#------------生成一个元素都是零值的数组a-------------------a=np.zeros((5,5),dtype=np.uint8)#-------随机将其中10 个位置上的值设置为1------------#---times 控制次数#---i,j 是随机生成的行、列位置#---a[i,j]=1,将随机挑选出来的位置上的值设置为1for times in range(10):i=np.random.randint(0,5)j=np.random.randint(0,5)a[i,j]=1#-------打印数组a,观察数组a 内值的情况-----------print("a=\n",a)#------查找数组a 内非零值的位置信息------------loc = cv2.findNonZero(a)#-----输出数组a 内非零值的位置信息------------print("a 内非零值的位置:\n",loc)运行上述程序,会显示如下的运行结果:a=[[0 0 0 0 0][0 0 0 0 1][0 0 1 1 1][1 1 0 0 1][1 1 0 0 0]]a 内非零值的位置:[[[4 1]][[2 2]][[3 2]][[4 2]][[0 3]][[1 3]][[4 3]][[0 4]][[1 4]]]
#使用OpenCV 函数cv2.findNonZero()获取一个图像内的轮廓点的位置 。import cv2import numpy as np#-----------------读取原始图像----------------------o = cv2.imread('cc.bmp')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[0]#-----------------绘制空心轮廓------------------------mask1 = np.zeros(gray.shape,np.uint8)cv2.drawContours(mask1,[cnt],0,255,2)pixelpoints1 = cv2.findNonZero(mask1)print("pixelpoints1.shape=",pixelpoints1.shape)print("pixelpoints1=\n",pixelpoints1)cv2.imshow("mask1",mask1)#-----------------绘制实心轮廓---------------------mask2 = np.zeros(gray.shape,np.uint8)cv2.drawContours(mask2,[cnt],0,255,-1)pixelpoints2 = cv2.findNonZero(mask2)print("pixelpoints2.shape=",pixelpoints2.shape)print("pixelpoints2=\n",pixelpoints2)cv2.imshow("mask2",mask2)#-----------------释放窗口------------------------cv2.waitKey()cv2.destroyAllWindows()#运行后程序显示如下的运行结果:pixelpoints1.shape= (1400, 1, 2)pixelpoints1=[[[292 106]][[293 106]][[294 106]]...[[222 180]][[223 180]][[224 180]]]pixelpoints2.shape= (7892, 1, 2)pixelpoints2=[[[293 107]][[294 107]][[295 107]]...[[221 179]][[222 179]][[223 179]]]
7.7 最大值和最小值及它们的位置
, , ,= cv2.(,mask = mask)
import cv2import numpy as npo = 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#--------使用掩模获取感兴趣区域的最值-----------------#需要注意函数minMaxLoc 处理的对象为灰度图像,本例中处理的对象为灰度图像gray#如果希望获取彩色图像的最值,需要提取各个通道图像,为每个通道独立计算最值mask = np.zeros(gray.shape,np.uint8)mask=cv2.drawContours(mask,[cnt],-1,255,-1)minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(gray,mask = mask)print("minVal=",minVal)print("maxVal=",maxVal)print("minLoc=",minLoc)print("maxLoc=",maxLoc)#--------使用掩模获取感兴趣区域并显示-----------------masko = np.zeros(o.shape,np.uint8)masko=cv2.drawContours(masko,[cnt],-1,(255,255,255),-1)loc=cv2.bitwise_and(o,masko)cv2.imshow("mask",loc)#显示灰度结果#loc=cv2.bitwise_and(gray,mask)#cv2.imshow("mask",loc)#--------释放窗口-----------------cv2.waitKey()cv2.destroyAllWindows()程序显示如下的运行结果:minVal= 42.0maxVal= 200.0minLoc= (87, 90)maxLoc= (90, 110)