1. 程式人生 > 程式設計 >Python Opencv中用compareHist函式進行直方圖比較對比圖片

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,1]
   r = image[row,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,cv.HISTCMP_CORREL)
 match3 = cv.compareHist(hist1,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)
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函式進行直方圖比較進行對比圖片的文章就介紹到這了,更多相關python Opencv compareHist函式直方圖內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!