模板匹配&直方图均衡化


 图像模板匹配

模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。

和卷积一样,它也是用模板图像在输入图像上滑动,并在每一个位置对模板图像和与其对应的输入图像的子区域进行差别比较。
如果输入图像的大小是(A xB), 模板的大小是( axb), 输出的结果的大小就是(A -a+1 ,B -b+1)


 匹配单个图像

使用函数 cv2.matchTemplate(img, templ, method)                返回结果
        templ:模板图像
        method:计算匹配程度的方法        (归一化结果更可靠)

                TM_SQDIFF:计算平方不同,得出的值越小,越相关

                TM_CCORR:计算相关性,得出的值越大,越相关

                TM_CCOEFF:计算相关系数,得出的值越大,越相关

                TM_SQDIFF_NORMED:计算归一化平方不同,得出的值越接近零,越相关

                TM_CCORR_NORMED:计算归一化相关性,得出的值越接近1,越相关

                TM_CCOEFF_NORMED:计算归一化相关系数,得出的值越接近1,越相关


使用函数 cv2.minMaxLoc( img )                 返回  min_val, max_val, min_loc, max_loc
找到结果的最小值和最大值的位置,

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()

 


 匹配多个对象         利用阈值进行处理)

使用函数where()能够获取模板匹配位置的集合。不同的输入,返回的值是不同的。
        当输入(参数)是一维数组时,返回值是一维索引,只有一组索引数组。
        当输入是二维数组时,返回匹配值的位置索引,因此会有两组索引数组表示返回值的位置。
使用函数zip()将可迭代的对象作为参数
        将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
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)


直方图

直方图的 x 轴是灰度值( 0 255 ),y 轴是图片中具有同一个灰度值的点的数目

直方图的计算、绘制


  计算

使用函数 cv2.calcHist(images,channels,mask,histSize,ranges)
返回值是一个256*1的矩阵,每一个值代表了每个灰度值对应的像素点数目
        
        images: 原图像, 当传入函数时应该用中括号 [ ] 括起来
         channels: 同样需要用中括号括起来,它会告诉函数我们要统计那幅图像的直方图。如果输入图像是灰度图,它的值就是 [0]。彩色图像的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R
        
         mask: 掩模图像。要统计整幅图像的直方图就把它设为 None。但是如果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并使用它
         histSize: BIN 的数目,也用中括号括起来,256分为多少个小组就是多少bin
         ranges: 像素值范围,通常为 [0 256]

绘制

使用函数        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 循环当中

plt.xlim(xmin, xmax) 设置x轴的取值范围
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()


直方图均衡化

通常情况下这种操作会改善图像的对比度
使用函数 cv2.equalizeHist(img)               
将要均衡化的原图像(灰度图像)作为参数传入
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

实例化均衡直方图函数后使用 .apply进行均衡化操作
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
cv2.imshow('zs',cl1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

onlywishes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值