天天看點

【OpenCV3.3+Python3.6】圖像直方圖的應用

直方圖的應用

直方圖均衡化

如果一副圖像的像素占有很多的灰階級而且分布均勻,那麼這樣的圖像往往有高對比度和多變的灰階色調。直方圖均衡化就是一種能僅靠輸入圖像直方圖資訊自動達到這種效果的變換函數。它的基本思想是對圖像中像素個數多的灰階級進行展寬,而對圖像中像素個數少的灰階進行壓縮,進而擴充像元取值的動态範圍,提高了對比度和灰階色調的變化,使圖像更加清晰。

直方圖局部均衡化

全局直方圖均衡化可能得到是一種全局意義上的均衡化,但是有的時候這種操作并不是很好,會把某些不該調整的部分給調整了。Opencv中還有一種直方圖均衡化,它是一種局部直方圖均衡化,也就是是說把整個圖像分成許多小塊(比如按10*10作為一個小塊),那麼對每個小塊進行均衡化。

直方圖比較

利用巴氏距離,相關性,卡方來比較兩張圖檔的相似性

巴氏距離越小越相似    cv2.compareHist(hist1,hist2,cv2.HISTCMP_CORREL)

相關性越大越相似       cv2.compareHist(hist1,hist2,cv2.HISTCMP_CORREL)

卡方越小越相似           cv2.compareHist(hist1,hist2,cv2.HISTCMP_CHISQR)

看代碼

# 直方圖應用:統計圖檔中的屬性值的頻次,比如RGB三色值出現的次數
#     直方圖均衡化    : 調整圖像的對比度 讓暗的地方更暗,讓亮的地方更亮
#     直方圖比較
#        巴氏距離,相關性,卡方


import cv2
import numpy as np

def equalHist_demo(image):   #直方圖均衡化
    gray =cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#轉灰階圖 ,opencv的直方圖均衡化要基于單通道灰階圖像
    cv2.imshow("gray",gray)#灰階圖的顯示
    dst =cv2.equalizeHist(gray)#圖檔直方圖均衡化   自動調整圖像對比度,把圖像變得更清晰
    cv2.imshow("equalHist_demo", dst)#均衡後的圖檔顯示

def clahe_demo(image):   # 分塊局部均衡化
    gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#轉灰階圖
    clahe=cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    # createCLAHE([, clipLimit[, tileGridSize]])
    # clipLimit參數表示對比度的大小。
    # tileGridSize參數表示每次處理塊的大小
    dst=clahe.apply(gray)  #應用
    cv2.imshow("clahe_demo", dst)

def create_rgb_hist(image):
    h, w, c = image.shape
    rgbHist = np.zeros([16*16*16, 1],np.float32)#直方圖初始化,16,16,16指的3通道的數量
    bsize = 256 / 16
    for row in range(h):
        for col in range(w):
            b = image[row, col, 0]
            g = image[row, col, 1]
            r = image[row, col, 2]
            index = np.int(b/bsize)*16*16+np.int(g/bsize)*16+np.int(g/bsize) #
            rgbHist[np.int(index), 0]=rgbHist[np.int(index), 0]+1
    return rgbHist


def hist_campare(image1,image2):  #直方圖的比較
    hist1=create_rgb_hist(image1)  #直方圖1
    hist2=create_rgb_hist(image2)   #直方圖1
    match1=cv2.compareHist(hist1,hist2,cv2.HISTCMP_BHATTACHARYYA)#擷取巴氏距離,越小越相似
    match2=cv2.compareHist(hist1,hist2,cv2.HISTCMP_CORREL) #擷取相關性,越大越相似
    match3=cv2.compareHist(hist1,hist2,cv2.HISTCMP_CHISQR) #擷取卡方,越大越不相似
    print("巴氏距離:%s, 相關性: %s,  卡方: %s"%(match1,match2,match3))


print("------Hello------")
src=cv2.imread("mi.png")
src1=cv2.imread("lena.jpg")
src2=cv2.imread("lena_tmpl.jpg")
cv2.imshow("source_image1",src1)
cv2.imshow("source_image2",src2)

hist_campare(src1,src2)

equalHist_demo(src)
clahe_demo(src1)

cv2.waitKey(0)
cv2.destroyAllWindows()
           

(1)原圖

【OpenCV3.3+Python3.6】圖像直方圖的應用

(2)灰階圖

【OpenCV3.3+Python3.6】圖像直方圖的應用

(3)直方圖均衡化

【OpenCV3.3+Python3.6】圖像直方圖的應用

(4)直方圖局部均衡化

【OpenCV3.3+Python3.6】圖像直方圖的應用

(5)直方圖的比較

【OpenCV3.3+Python3.6】圖像直方圖的應用
【OpenCV3.3+Python3.6】圖像直方圖的應用

(6)兩張相同圖檔的直方圖的比較

【OpenCV3.3+Python3.6】圖像直方圖的應用
【OpenCV3.3+Python3.6】圖像直方圖的應用