Python Opencv中用compareHist函數(shù)進(jìn)行直方圖比較對(duì)比圖片
圖像直方圖
圖像直方圖是反映一個(gè)圖像像素分布的統(tǒng)計(jì)表,其實(shí)橫坐標(biāo)代表了圖像像素的種類,可以是灰度的,也可以是彩色的??v坐標(biāo)代表了每一種顏色值在圖像中的像素總數(shù)或者占所有像素個(gè)數(shù)的百分比。
圖像是由像素構(gòu)成,因?yàn)榉从诚袼胤植嫉闹狈綀D往往可以作為圖像一個(gè)很重要的特征。在實(shí)際工程中,圖像直方圖在特征提取、圖像匹配等方面都有很好的應(yīng)用。
直方圖比較
1. 圖像相似度比較
如果我們有兩張圖像,并且這兩張圖像的直方圖一樣,或者有極高的相似度,那么在一定程度上,我們可以認(rèn)為這兩幅圖是一樣的,這就是直方圖比較的應(yīng)用之一。
2. 分析圖像之間關(guān)系
兩張圖像的直方圖反映了該圖像像素的分布情況,可以利用圖像的直方圖,來(lái)分析兩張圖像的關(guān)系。
直方圖比較函數(shù)
cv2.compareHist(H1, H2, method)
其中:
- H1,H2 分別為要比較圖像的直方圖
- method - 比較方式
比較方式(method)
- 相關(guān)性比較 (method=cv.HISTCMP_CORREL) 值越大,相關(guān)度越高,最大值為1,最小值為0
- 卡方比較(method=cv.HISTCMP_CHISQR 值越小,相關(guān)度越高,最大值無(wú)上界,最小值0
- 巴氏距離比較(method=cv.HISTCMP_BHATTACHARYYA) 值越小,相關(guān)度越高,最大值為1,最小值為0
代碼實(shí)現(xiàn)
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
def create_rgb_hist(image):
""""創(chuàng)建 RGB 三通道直方圖(直方圖矩陣)"""
h, w, c = image.shape
# 創(chuàng)建一個(gè)(16*16*16,1)的初始矩陣,作為直方圖矩陣
# 16*16*16的意思為三通道每通道有16個(gè)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]
# 人為構(gòu)建直方圖矩陣的索引,該索引是通過(guò)每一個(gè)像素點(diǎn)的三通道值進(jìn)行構(gòu)建
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):
"""直方圖比較函數(shù)"""
# 創(chuàng)建第一幅圖的rgb三通道直方圖(直方圖矩陣)
hist1 = create_rgb_hist(image1)
# 創(chuàng)建第二幅圖的rgb三通道直方圖(直方圖矩陣)
hist2 = create_rgb_hist(image2)
# 進(jìn)行三種方式的直方圖比較
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, 相關(guān)性:%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()


巴氏距離:0.3116175231543461, 相關(guān)性:0.8805851455583134,
卡方:154379.82963705878
從計(jì)算得到的三個(gè)比較值可以發(fā)現(xiàn)巴氏距離較低,相關(guān)性較高,可以簡(jiǎn)單認(rèn)為這兩幅圖的相似度比較大。
例如下面兩幅圖


巴氏距離:0.8939676325760126, 相關(guān)性:0.03202528698270991,
卡方:503948.24201884575
從計(jì)算得到的三個(gè)比較值可以發(fā)現(xiàn)巴氏距離很高,相關(guān)性系數(shù)很低,可以簡(jiǎn)單認(rèn)為這兩幅圖的相似度非常小。
總結(jié)
到此這篇關(guān)于Python Opencv中用compareHist函數(shù)進(jìn)行直方圖比較進(jìn)行對(duì)比圖片的文章就介紹到這了,更多相關(guān)python Opencv compareHist函數(shù)直方圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python寫的一個(gè)簡(jiǎn)單DNS服務(wù)器實(shí)例
這篇文章主要介紹了Python寫的一個(gè)簡(jiǎn)單DNS服務(wù)器實(shí)例,需要的朋友可以參考下2014-06-06
pandas.DataFrame寫入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方式
這篇文章主要介紹了pandas.DataFrame寫入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Python socket套接字實(shí)現(xiàn)C/S模式遠(yuǎn)程命令執(zhí)行功能案例
這篇文章主要介紹了Python socket套接字實(shí)現(xiàn)C/S模式遠(yuǎn)程命令執(zhí)行功能,涉及Python socket套接字編寫服務(wù)器/客戶機(jī)模式數(shù)據(jù)傳輸相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
python tkinter實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了python tkinter實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Python?數(shù)據(jù)清洗刪除缺失值替換缺失值詳情
這篇文章主要介紹了Python?數(shù)據(jù)清洗刪除缺失值替換缺失值詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Python實(shí)現(xiàn)多進(jìn)程共享數(shù)據(jù)的方法分析
這篇文章主要介紹了Python實(shí)現(xiàn)多進(jìn)程共享數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Python多進(jìn)程共享數(shù)據(jù)的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12
Django多數(shù)據(jù)庫(kù)配置及逆向生成model教程
這篇文章主要介紹了Django多數(shù)據(jù)庫(kù)配置及逆向生成model教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03

