EmguCV Image Process: Counting the Pixels with Histograms
參考OpenCV 2 Computer Vision Application Programming Cookbook第四章
介紹內容如下:
Computing the image histogram
Applying look-up tables to modify image appearance
Equalizing the image histogram
Backprojecting a histogram to detect specific image content
Using the mean shift algorithm to find an object
上一篇我們有提到
直方圖(histogram)在一張影像的內容中扮演了一個很重要的角色
如果你在一張影像中想要搜尋一個具有特殊紋路的區域
而這個區域的直方圖就可以看作是一個函數的引數
而這個函數回傳一個機率值,一個指定區域與辨識區域的相似機率
這就是這篇要提到的Backprojecting
這裡依舊以同一張影像為例
假設現在要偵測影像中的某一個區塊(上方天空樹枝的區塊)
用白色框圈起來的區塊
void Backingprojecting(Image<Gray,Byte> image) { Rectangle rect=new Rectangle(180,0,50,50); image.ROI = rect; //Detect region DenseHistogram rectHist = GetHistogram(image); image.ROI = Rectangle.Empty; Image<Gray,Byte> probability= rectHist.BackProject(new Image<Gray, Byte>[] { image }); }程式部分很簡單
傳入一張影像後
設定要偵測的區域(樹梢的部分)
利用第一篇介紹的GetHistogram的方法,取得DenseHistogram
然後把影像的區域設定的原始的影像大小
然後利用DenseHistogram提供的方法:BackProject,傳入影像陣列把原始影像塞入
既可得到一張Probability的影像
顏色越亮的部分,就是可能性越高的區域!
這個影像也就提供
原始影像哪些部分有著類似"樹梢"的區域
可以發現亮點大部分都顯示在正確的位置上(影像上方)
這裡一樣可以使用彩色影像來實作
第一篇一樣有介紹到取得彩色影像的直方圖
void Backingprojecting(Image<Bgr,Byte> image) { Rectangle rect=new Rectangle(180,0,50,50); image.ROI = rect; //Detect region DenseHistogram rectHist = GetHistogram(image); image.ROI = Rectangle.Empty; Image<Gray, Byte> probability = rectHist.BackProject(image.Split()); }方法幾乎一樣,只差在傳入BackProject的引數
變成包含三張R、G、B的影像陣列
取得的結果卻變得比較受限了
彩色的偵測結果是有差異的!!
這裡如果把區域設定成地上的綠草
Rectangle rect=new Rectangle(5,335,40,45);綠草的一個區塊
左邊紅色框框的區塊
這時候偵測的結果就會有很大的出入
用灰階影像來做偵測,效果還算不錯!
至少大部分草地都有偵測出來!!
彩色影像卻是一片黑...黑漆漆的!!
現在也可以多嘗試其他區塊來試試看嚕!!
下一篇介紹利用mean shift algorithm來做影像偵測
沒有留言:
張貼留言