python實現直方圖的應用


 

目錄:

(一)調節圖片對比度(均衡化)

(1)全局直方圖均衡化------equalizeHist

(2)自適應的局部的直方圖均衡化------createCLAHE

(二)圖片的相似度比較

(三)直方圖反向投影(實現對有顏色物體的跟蹤)

(1)原理

(2)二維直方圖的表示

A.直接顯示

B.使用matplotlib

(3)直方圖反向映射

A. def calcHist函數

B.roihist函數

C.歸一化函數normalize詳解

 

 

 

 

 

正文:

(一)調節圖片對比度(均衡化)

(1)全局直方圖均衡化------equalizeHist

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

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

3.cv2.equalizeHist函數原型:equalizeHist(src[, dst]) -> dst。函數equalizeHist的作用:直方圖均衡化,提高圖像質量。

1 def equalHist_demo(image):  #OpenCV直方圖均衡化都是基於灰度圖像
2     gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
3     dst = cv.equalizeHist(gray) #直方圖均衡化,對比度增強
4     cv.imshow("equalHist_demo",dst)

缺點:對比度太明顯了!

(2)自適應的局部的直方圖均衡化------createCLAHE

1.createCLAHE函數原型:createCLAHE([, clipLimit[, tileGridSize]]) -> retval clipLimit參數表示對比度的大小。 tileGridSize參數表示每次處理塊的大小 。

1 def clahe_demo(image):  #OpenCV直方圖均衡化都是基於灰度圖像
2     gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
3     clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
4     dst = clahe.apply(gray)  #將灰度圖像和局部直方圖相關聯
5     cv.imshow("clahe_demo",dst)

 (二)圖片的相似度比較

 1 def create_rag_hist(image):
 2     h,w,c = image.shape
 3     rgbHist = np.zeros([16*16*16,1],np.float32)
 4     bsize = 256/16  #間隔是16
 5     for row in range(h):
 6         for col in range(w):
 7             b = image[row,col,0]
 8             g = image[row,col,1]
 9             r = image[row,col,2]
10             index = np.int(b/bsize)*16*16 + np.int(g/bsize)*16 + np.int(r/bsize)
11             rgbHist[np.int(index),0] = rgbHist[np.int(index),0] + 1
12     return rgbHist
13 
14 def hist_compare(image1,image2):
15     hist1 = create_rag_hist(image1)
16     hist2 = create_rag_hist(image2)
17     match1 = cv.compareHist(hist1,hist2,cv.HISTCMP_BHATTACHARYYA)   #巴氏距離比較,越小越相似
18     match2 = cv.compareHist(hist1,hist2,cv.HISTCMP_CORREL)   #相關性比較(最大為1):越接近1越相似
19     match3 = cv.compareHist(hist1,hist2,cv.HISTCMP_CHISQR)   #卡方比較,越小越相似
20     print("巴氏:%s    相關性:%s  卡方:%s"%(match1,match2,match3))

(三)直方圖反向投影(實現對有顏色物體的跟蹤)

(1)原理

(2)二維直方圖的表示

A.直接顯示

1 def hist2D_demo(image):
2     hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
3     hist = cv.calcHist([image],[0,1],None,[289,286],[0,289,0,286])
4     cv.imshow("hist2D",hist)

B.使用matplotlib

1 def hist2D_demo(image):
2     hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
3     hist = cv.calcHist([image],[0,1],None,[289,286],[0,289,0,286])
4     plt.imshow(hist,interpolation="nearest")
5     plt.title("2D Histogram")
6     plt.show()

(3)直方圖反向映射

A. def calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None): # real signature unknown; restored from __doc__

images:輸入圖像
channels:需要統計直方圖的第幾通道
mask:掩膜,,計算掩膜內的直方圖 ...Mat()
histSize:指的是直方圖分成多少個區間,就是 bin的個數
ranges: 統計像素值得區間
hist:輸出的直方圖數組
accumulate=false:在多個圖像時,是否累計計算像素值得個數

 1 def back_projection_demo():
 2     sample = cv.imread("./s2.png")
 3     target = cv.imread("./b.png")
 4     roi_hsv = cv.cvtColor(sample,cv.COLOR_BGR2HSV)
 5     tar_hsv = cv.cvtColor(target,cv.COLOR_BGR2HSV)
 6 
 7     cv.imshow("sample",sample)
 8     cv.imshow("target",target)
 9 
10     roihist = cv.calcHist([roi_hsv], [0, 1], None, [324, 356], [0, 324, 0, 356])  #加紅部分越小,匹配越放松,匹配越全面,若是bsize值越大,則要求得越精細,越不易匹配,所以導致匹配出來的比較小
11     cv.normalize(roihist,roihist,0,255,cv.NORM_MINMAX)  #規划到0-255之間
12     dst = cv.calcBackProject([tar_hsv],[0,1],roihist,[0,324,0,356],1)   #直方圖反向投影
13     cv.imshow("back_projection_demo",dst)

 B.roihist = cv.calcHist([roi_hsv], [0, 1], None, [32, 46], [0, 324, 0, 356])  #這是兩個通道,bsize變少了,但是他的匹配更加廣了(對於匹配的局限放寬了)

C.歸一化函數normalize詳解

1. 歸一化就是要把需要處理的數據經過處理后(通過某種算法)限制在你需要的一定范圍內。

歸一化函數cv2.normalize原型:normalize(src, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]]) -> dst 

src參數表示輸入數組。

dst參數表示輸出與src相同大小的數組,支持原地運算。

alpha參數表示range normalization模式的最小值。

beta參數表示range normalization模式的最大值,不用於norm normalization(范數歸一化)模式。

norm_type參數表示歸一化的類型。

norm_type參數可以有以下的取值:

NORM_MINMAX:數組的數值被平移或縮放到一個指定的范圍,線性歸一化,一般較常用。

NORM_INF:歸一化數組的C-范數(絕對值的最大值)。

NORM_L1 :歸一化數組的L1-范數(絕對值的和)。

NORM_L2 :歸一化數組的(歐幾里德)L2-范數。
2.反向投影用於在輸入圖像(通常較大)中查找特定圖像(通常較小或者僅1個像素,以下將其稱為模板圖像)最匹配的點或者區域,也就是定位模板圖像出現在輸入圖像的位置。

函數cv2.calcBackProject用來計算直方圖反向投影。

函數原型:calcBackProject(images, channels, hist, ranges, scale[, dst]) -> dst

images參數表示輸入圖像(是HSV圖像)。傳入時應該用中括號[ ]括起來。

channels參數表示用於計算反向投影的通道列表,通道數必須與直方圖維度相匹配。

hist參數表示輸入的模板圖像直方圖。

ranges參數表示直方圖中每個維度bin的取值范圍 (即每個維度有多少個bin)。

scale參數表示可選輸出反向投影的比例因子,一般取1。

參考:

https://www.cnblogs.com/ssyfj/p/9270608.html

https://www.cnblogs.com/ssyfj/p/9271327.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM