OpenCV+python:直方图的应用(二)
1,直方圖反向投影的原理
 所謂反向投影就是首先計算某一特征的直方圖模型,然后使用模型去尋找圖像中存在的該特征。
 反向投影可以通過顏色直方圖來理解,我們檢測圖像中某個像素點的顏色是否位于直方圖中,如果位于則將顏色加亮,通過對圖像的檢測,得出結果圖像,結果圖像一定和直方圖像匹配。那么對于圖像顏色的取樣點越多,越能更好的找出目標圖形。這里直方圖的作用在于提供一個比較標準(也就是模版),即對于要檢測的圖像來說,需要給它提供一個模版,用于識別出和模版相應的特征。
反向投影的作用:反向投影用于在輸入圖像(通常較大)中查找特定圖像(通常較小或者僅1個像素,以下將其稱為模板圖像)最匹配的點或者區域,也就是定位模板圖像出現在輸入圖像的位置。
反向投影查找原理:查找的方式就是不斷的在輸入圖像中切割跟模板圖像大小一致的圖像塊,并用直方圖對比的方式與模板圖像進行比較。
直方圖反向投影矩陣的計算方法:
設有原灰度圖像矩陣:
Image=
 1 2 3 4
 5 6 7 7
 9 8 0 1
 5 6 7 6
 將灰度值劃分為如下四個區間:[0,2] [3,5] [6,7] [8,10]
 很容易得到這個圖像矩陣的直方圖hist= 4 4 6 2,接下來計算反向投影矩陣,反向投影矩陣的大小和原灰度圖像矩陣的大小相同,原圖像中坐標為(0,0)的灰度值為1,1位于區間[0,2] 中,區間[0,2] 對應的直方圖值為4,所以反向投影矩陣中中坐標為(0,0)的值記為4
 按上面的計算方法,可以得到Image的直方圖反向投影矩陣為:
back_Projection=
 4 4 4 4
 4 6 6 6
 2 2 4 4
 4 6 6 6
 實際上是原圖像的256個灰度值被置為很少的幾個值了,具體有幾個值,要看把0~255劃分為多少個區間,反向投影矩陣中某點的值就是它對應的原圖像中的點所在區間的灰度直方圖值。所以我們可以看出,一個區間點越多,在反向投影矩陣中就越亮。
我們是先求出原圖像的直方圖,再由直方圖得到反向投影矩陣,由直方圖到反向投影矩陣實際上就是一個反向的過程,所以叫反向。
 2,直方圖反向投影的應用
 源代碼:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltdef back_projection_demo():sample = cv.imread("F:/images/sample.png")target = cv.imread("F:/images/target.png")roi_hsv = cv.cvtColor(sample, cv.COLOR_BGR2HSV)target_hsv = cv.cvtColor(target, cv.COLOR_BGR2HSV)# show imagescv.imshow("sample", sample)cv.imshow("target", target)roiHist = cv.calcHist([roi_hsv], [0, 1], None, [32, 32], [0, 180, 0, 256])cv.normalize(roiHist, roiHist, 0, 255, cv.NORM_MINMAX)      #歸一化處理"""歸一化就是要把需要處理的數據經過處理后(通過某種算法)限制在你需要的一定范圍內。歸一化函數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-范數。"""dst = cv.calcBackProject([target_hsv], [0, 1], roiHist, [0, 180, 0, 256], 1)cv.imshow("backProjectionDemo", dst)
"""
函數原型:calcBackProject(images, channels, hist, ranges, scale[, dst]) -> dstimages參數表示輸入圖像(是HSV圖像)。傳入時應該用中括號[ ]括起來。channels參數表示用于計算反向投影的通道列表,通道數必須與直方圖維度相匹配。hist參數表示輸入的模板圖像直方圖。ranges參數表示直方圖中每個維度bin的取值范圍 (即每個維度有多少個bin)。scale參數表示可選輸出反向投影的比例因子,一般取1
"""def hist2d_demo(image):            #2D直方圖繪制(H[0, 180],S[0, 256])hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)hist = cv.calcHist([image], [0, 1], None, [32, 32], [0, 180, 0, 256]) #[32, 32]bins的個數(H,S)這是兩個通道,bsize變少了,但是他的匹配更加廣了(對于匹配的局限放寬了)plt.imshow(hist, interpolation='nearest')plt.title("2D Histogram")plt.show()src = cv.imread("F:/images/lena.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
hist2d_demo(src)
back_projection_demo()
cv.waitKey(0)cv.destroyAllWindows()運行結果:
 
 
 
 
總結
以上是生活随笔為你收集整理的OpenCV+python:直方图的应用(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: OpenCV+python:直方图的概念
- 下一篇: 银川山羊下水多少钱?大量收够山羊下水,羊
