天天看點

python compare函數_Python Opencv中用compareHist函數進行直方圖比較對比圖檔

圖像直方圖

圖像直方圖是反映一個圖像像素分布的統計表,其實橫坐标代表了圖像像素的種類,可以是灰階的,也可以是彩色的。縱坐标代表了每一種顔色值在圖像中的像素總數或者占所有像素個數的百分比。

圖像是由像素構成,因為反映像素分布的直方圖往往可以作為圖像一個很重要的特征。在實際工程中,圖像直方圖在特征提取、圖像比對等方面都有很好的應用。

直方圖比較

1. 圖像相似度比較

如果我們有兩張圖像,并且這兩張圖像的直方圖一樣,或者有極高的相似度,那麼在一定程度上,我們可以認為這兩幅圖是一樣的,這就是直方圖比較的應用之一。

2. 分析圖像之間關系

兩張圖像的直方圖反映了該圖像像素的分布情況,可以利用圖像的直方圖,來分析兩張圖像的關系。

直方圖比較函數

cv2.compareHist(H1, H2, method)

其中:

H1,H2 分别為要比較圖像的直方圖

method - 比較方式

比較方式(method)

相關性比較 (method=cv.HISTCMP_CORREL) 值越大,相關度越高,最大值為1,最小值為0

卡方比較(method=cv.HISTCMP_CHISQR 值越小,相關度越高,最大值無上界,最小值0

巴氏距離比較(method=cv.HISTCMP_BHATTACHARYYA) 值越小,相關度越高,最大值為1,最小值為0

代碼實作

import cv2 as cv

import numpy as np

from matplotlib import pyplot as plt

def create_rgb_hist(image):

""""建立 RGB 三通道直方圖(直方圖矩陣)"""

h, w, c = image.shape

# 建立一個(16*16*16,1)的初始矩陣,作為直方圖矩陣

# 16*16*16的意思為三通道每通道有16個bins

rgbhist = np.zeros([16 * 16 * 16, 1], np.float32)

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 = int(b / bsize) * 16 * 16 + int(g / bsize) * 16 + int(r / bsize)

# 該處形成的矩陣即為直方圖矩陣

rgbhist[int(index), 0] += 1

plt.ylim([0, 10000])

plt.grid(color='r', linestyle='--', linewidth=0.5, alpha=0.3)

return rgbhist

def hist_compare(image1, image2):

"""直方圖比較函數"""

# 建立第一幅圖的rgb三通道直方圖(直方圖矩陣)

hist1 = create_rgb_hist(image1)

# 建立第二幅圖的rgb三通道直方圖(直方圖矩陣)

hist2 = create_rgb_hist(image2)

# 進行三種方式的直方圖比較

match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)

match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)

match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)

print("巴氏距離:%s, 相關性:%s, 卡方:%s" %(match1, match2, match3))

src1 = cv.imread("diff1.PNG")

cv.imshow("diff1", src1)

src2 = cv.imread("diff2.PNG")

cv.imshow("diff2", src2)

plt.subplot(1,2,1)

plt.title("diff1")

plt.plot(create_rgb_hist(src1))

plt.subplot(1,2,2)

plt.title("diff2")

plt.plot(create_rgb_hist(src2))

hist_compare(src1, src2)

plt.show()

cv.waitKey(0)

cv.destroyAllWindows()

python compare函數_Python Opencv中用compareHist函數進行直方圖比較對比圖檔
python compare函數_Python Opencv中用compareHist函數進行直方圖比較對比圖檔

巴氏距離:0.3116175231543461, 相關性:0.8805851455583134,

卡方:154379.82963705878

從計算得到的三個比較值可以發現巴氏距離較低,相關性較高,可以簡單認為這兩幅圖的相似度比較大。

例如下面兩幅圖

python compare函數_Python Opencv中用compareHist函數進行直方圖比較對比圖檔
python compare函數_Python Opencv中用compareHist函數進行直方圖比較對比圖檔

巴氏距離:0.8939676325760126, 相關性:0.03202528698270991,

卡方:503948.24201884575

從計算得到的三個比較值可以發現巴氏距離很高,相關性系數很低,可以簡單認為這兩幅圖的相似度非常小。

總結

到此這篇關于Python Opencv中用compareHist函數進行直方圖比較進行對比圖檔的文章就介紹到這了,更多相關python Opencv compareHist函數直方圖内容請搜尋我們以前的文章或繼續浏覽下面的相關文章希望大家以後多多支援我們!

本文标題: Python Opencv中用compareHist函數進行直方圖比較對比圖檔

本文位址: http://www.cppcns.com/jiaoben/python/306077.html