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做邊緣偵測呢?!
沒有留言:
張貼留言