2012年12月28日 星期五

EmguCV Image Process: Filtering the Images part 2

中正大學夕陽
EmguCV Image Process: Filtering the Images

參考OpenCV 2 Computer Vision Application Programming Cookbook第六章

介紹內容如下:

Filtering images using low-pass filters

Eiltering images using a median filter

Applying directional filters to detect edges

Computing the Laplacian of an image

上一篇介紹了一些low-pass filters

而那些是屬於所謂的linear filters

而在影像處理中non-linear filters也是相當重要且常見的

例如這次要介紹的:median filter

Median filter的功用可用來消除著名的salt-and-pepper noise(胡椒鹽雜訊)

這裡先來實作如何把影像加入salt-and-pepper noise

這裡設計一個方法,將來源影像以及要產生的雜訊數傳入

然後將來源影像畫上雜訊

private void SaltPepperNoise(Image<Bgr,byte> image, int n)
{
    //random number generator
    Random random=new Random();
    for (int k = 0; k < n; k++)
    {
        //random pixel to set white color
        int w = random.Next() % image.Width;
        int h = random.Next() % image.Height;
        image[h, w] = new Bgr(255, 255, 255);
    }
}
加入雜訊的方法

利用隨機的方式取出影像的位置

把此位置設定成白色(new Bgr(255, 255, 255))

處理的結果如下:

隨機分布的蠻平均的,看起來像是下雪

這時候再將此圖透過median filter來處理:

Image<Bgr, Byte> image = new Image<Bgr, Byte>(@"image.jpg");
//call function to add noise
SaltPepperNoise(image, 3000);
//call median filtering function to remove noise
Image<Bgr, Byte> medianBlur = image.SmoothMedian(3);
這裡設定的median filter的kernel size為3

處理結果如下:

結果是不是很驚人,所有的白點都不見了呢!!

不過這畢竟是經過處理過的影像

看起來的畫面會比較模糊、銳利度較低

但在雜訊的處理上效果相當顯著


由於median filter並非linear filter所以無法透過kernel matrix來做表示

雖然如此

但處理的結果還是根據基準點的鄰近點來計算

找出鄰近點的median(中位數),並取代原來的基準點

這時也可以透過mean filter來處理看看

將kernel size也設為3X3

處理結果如下:

雜訊似乎有比較沒那麼明顯

但與median filter的結果相比

效果就差很多了!!


所以在對付不同的雜訊狀況時,要採用相對應的filter來處理

才會有良好的效果!!


下一篇將介紹該如何用filter做邊緣偵測呢?!

沒有留言:

張貼留言