2012年10月5日 星期五

EmguCV Image Process: Counting the Pixels with Histograms part3

再度攜手步入森林

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來做影像偵測

沒有留言:

張貼留言