图像模板匹配
模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。
匹配单个图像
使用函数 cv2.matchTemplate(img, templ, method) 返回结果
templ:模板图像
method:计算匹配程度的方法 (归一化结果更可靠)
TM_SQDIFF:计算平方不同,得出的值越小,越相关
TM_CCORR:计算相关性,得出的值越大,越相关
TM_CCOEFF:计算相关系数,得出的值越大,越相关
TM_SQDIFF_NORMED:计算归一化平方不同,得出的值越接近零,越相关
TM_CCORR_NORMED:计算归一化相关性,得出的值越接近1,越相关
TM_CCOEFF_NORMED:计算归一化相关系数,得出的值越接近1,越相关
找到结果的最小值和最大值的位置,
img =cv2.imread('op.jpg',0)
img1 = img.copy()
template = cv2.imread('op_face.jpg',0)
w,h = template.shape[::-1]
methods = ['cv2.TM_CCOEFF','cv2.TM_CCOEFF_NORMED','cv2.TM_CCORR','cv2.TM_CCORR_NORMED',
'cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']
for meth in methods:
img2 = img1.copy()
method = eval(meth)
res = cv2.matchTemplate(img2,template,method)
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)
if method in [cv2.TM_SQDIFF,cv2.TM_SQDIFF_NORMED]: #平方差取最小值
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0]+w, top_left[1]+h)
cv2.rectangle(img2,top_left,bottom_right,255,3) #画矩形
plt.subplot(121),plt.imshow(res,cmap = 'gray')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(img2,cmap = 'gray')
plt.xticks([]),plt.yticks([])
plt.suptitle(meth)
plt.show()
匹配多个对象 (利用阈值进行处理)
当输入(参数)是一维数组时,返回值是一维索引,只有一组索引数组。
当输入是二维数组时,返回匹配值的位置索引,因此会有两组索引数组表示返回值的位置。
img = cv2.imread('yy.jpg')
img1=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
template = cv2.imread('yy_.jpg',0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img1,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold) #取匹配程度大于80%的
for pt in zip(*loc[::-1]): # *号表示可选参数
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h),(0,255,0), 1)
cv2.imshow('img',img)
直方图
直方图的计算、绘制
计算
绘制
使用函数 plt.hist(img,pixels)
img:这里只能传入一维数组,用img.ravel()可以将原图像的array数组转成一维数组
pixels: 像素一般输入256
img = cv2.imread('op.jpg',0)
hist = cv2.calcHist([img],[0],None,[256],[0,256])
plt.hist(img.ravel(),256)
plt.show()
绘制多通道的直方图
enumerate() 函数用于将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
img = cv2.imread('op.jpg')
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.show()
直方图均衡化
使用掩摸
位与函数:bitwise_and(src1, src2, dst=None, mask=None)
src1、src2:为输入图像或标量,标量可以为单个数值或一个四元组
dst:可选输出变量,使用非None要先定义,且其大小与输入变量相同
mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素
img = cv2.imread('op.jpg',0)
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:400, 100:300] = 255
masked_img = cv2.bitwise_and(img,img,mask = mask)
hist_full = cv2.calcHist([img],[0],None,[256],[0,256])
hist_mask = cv2.calcHist([img],[0],mask,[256],[0,256])
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask,'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()
直方图均衡化
img = cv2.imread('op.jpg',0)
equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)
plt.show()
自适应直方图均衡化
使用函数 .cv2.createCLAHA(clipLimit=8.0, titleGridSize=(8, 8))
clipLimit :颜色对比度的阈值
titleGridSize :进行均衡化的网格大小,即在多少网格下进行直方图的均衡化操作,默认8*8
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
cv2.imshow('zs',cl1)