OpenCV学习笔记-直方图应用

直方图均衡化 就是调整图像的对比度,让图像显示更清晰,一般有两种方法:全局调整和局部自适应,局部自适应的数值一般是2**n

直方图均衡化都是基于灰度图

 
  

#全局调整
def equalizeHist_demo(img):
    gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    dst = cv.equalizeHist(gray)
    cv.imshow( 'equalizeHist_demo',dst)
OpenCV学习笔记-直方图应用_第1张图片
 
   
#局部自适应
def clahe_dome(img):
    gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    clahe = cv.createCLAHE( clipLimit= 5.0, tileGridSize=( 8, 8))
    #clipLimit 的值默认是40 值越大对比度越大  
    dst = clahe.apply(gray)
    cv.imshow( 'clahe_dome',dst)
OpenCV学习笔记-直方图应用_第2张图片

可以看出来,全局均衡化,对比度提升的太大,容易造成一些地方与背景同化,所以一般用局部自适应均衡化

另一种应用是直方图比较,比较两张图片的相似度

直方图的比较方法有四种:按照图像顺序排列:卡方、相关性、交叉、巴氏距离

OpenCV学习笔记-直方图应用_第3张图片
在进行直方图比较前,先做一个rgb的直方图

 
  

#做一个rgb的直方图
def create_rgb_hist(img):
    h, w, c = img.shape
    rgbHist = np.zeros([ 16* 16* 16, 1],np.float32) # blue 16个 green 16个 red16个
    bsize = 256/ 16 # 直方图有256个bins 除以16 =16  
    for row in range(h):
        for col in range(w):
        b = img[row, col, 0]
        g = img[row, col, 1]
        r = img[row, col, 2]
        index = np.int(b/bsize)* 16* 16 + np.int(g/bsize)* 16 + np.int(r/bsize) #降维操作 把256*256*256 转成16*16*16
        rgbHist[np.int(index), 0] += 1    
    return rgbHist
之后再进行RGB直方图的比较
def hist_compare(img1,img2):
    hist1 = create_rgb_hist(img1)
    hist2 = create_rgb_hist(img2)
    match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA) # 巴氏距离 越小图片的相似度越高
    match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL) # 相关性 越大图片的相似度越高
    match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR) # 卡方 越小图片相似度越高
    match4 = cv.compareHist(hist1, hist2, cv.HISTCMP_INTERSECT)
    #巴氏距离和相关性数值都在0 1之间 所以一般用他们两个来比较
    print('巴氏距离: %s, 相关性: %s, 卡方: %s, 交叉: %s' % (match1,match2,match3,match4))

你可能感兴趣的:(OpenCV学习笔记-直方图应用)