您好,登錄后才能下訂單哦!
本篇內容介紹了“Python Opencv中用compareHist函數怎么實現用直方圖比較對比圖片”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Python是一種編程語言,內置了許多有效的工具,Python幾乎無所不能,該語言通俗易懂、容易入門、功能強大,在許多領域中都有廣泛的應用,例如最熱門的大數據分析,人工智能,Web開發等。
圖像直方圖
圖像直方圖是反映一個圖像像素分布的統計表,其實橫坐標代表了圖像像素的種類,可以是灰度的,也可以是彩色的。縱坐標代表了每一種顏色值在圖像中的像素總數或者占所有像素個數的百分比。
圖像是由像素構成,因為反映像素分布的直方圖往往可以作為圖像一個很重要的特征。在實際工程中,圖像直方圖在特征提取、圖像匹配等方面都有很好的應用。
直方圖比較
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) # 進行三種方式的直方圖比較 match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA) match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL) match4 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR) print("巴氏距離:%s, 相關性:%s, 卡方:%s" %(match2, match3, match4)) 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, 相關性:0.8805851455583134,
卡方:154379.82963705878
從計算得到的三個比較值可以發現巴氏距離較低,相關性較高,可以簡單認為這兩幅圖的相似度比較大。
例如下面兩幅圖
巴氏距離:0.8939676325760126, 相關性:0.03202528698270991,
卡方:503948.24201884575
從計算得到的三個比較值可以發現巴氏距離很高,相關性系數很低,可以簡單認為這兩幅圖的相似度非常小。
總結
“Python Opencv中用compareHist函數怎么實現用直方圖比較對比圖片”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。