影像上有時會發現出現一點一點的雜訊,此種雜訊稱之為胡椒鹽雜訊(Salt and pepper noise),此類雜訊可以透過Median Filter過濾雜訊,使得影像較為接近原始的狀態。
以3*3的 「遮罩」為例,透過「Spatial Convolution」對整張影像進行處理。
取得遮罩之像素矩陣後透過排序演算法排序後,取其中間的像素值。處理流程如下圖所示。
此種演算邏輯可以有效的去除影像中較為極端的訊號(雜訊)
本實驗針對一張附加上胡椒鹽雜訊(Salt and pepper noise)的影像進行"Median Filter"之成果如下所示 :
C#
private Bitmap Process(Bitmap bitmap)
{
int width = bitmap.Width, height = bitmap.Height;
int w = 3, h = 3;
//IComparer revComparer = new ReverseComparer();
Bitmap dstBitmap = new Bitmap(bitmap);
byte[,] pix = ImageExtract.getimageArray(bitmap);
byte[,] resPix = new byte[3, width * height];
for (int y = 1; y < (height - 1); y++)
{
for (int x = 1; x < (width - 1); x++)
{
//b,g,r
for (int c = 0; c < 3; c++)
{
//mask
int current = x + y * width;
byte[] mask = new byte[w * h];
for (int my = 0; my < h; my++)
for (int mx = 0; mx < w; mx++)
{
int pos = current + (mx - 1) + ((my - 1) * width);
mask[mx + my * w] = pix[c, pos];
}
Heap heap = new Heap(mask, mask.Length);
heap.heapsort();
resPix[c, current] = (byte)heap.get()[(w * h) / 2];
}
}
}
ImageExtract.writeImageByArray(resPix, dstBitmap);
return dstBitmap;
}
完整程式碼 (連結)
文章標籤
全站熱搜

不好意思請教以下~我把遮罩範圍改成5*5後發生mask的地方出現"索引在陣列的界限之外"請大大可以幫我解答一下嗎?
5*5 (mx - 1) + ((my - 1) 要改成 (mx - 2) + ((my - 2),這樣跑回圈時才會是5*5。 在處理時要檢查圖片邊界,處理方式又分為略過與補值。 此部分範例皆是採用略過處理。
謝謝大大的教導~我有嘗試修改後~還是一樣會有"索引在陣列的界限之外"的問題~不過還是謝謝大大的指教~我在研究看看!!
如果只是要測試效果,可以使用github的專案。 該專案已經模組化能有效的抽取適當的遮罩大小,進行運算。 如果是自我練習,可能要有code比較能夠明確幫確認詳細問題的發生點。 建議可以利用中斷點或螢幕輸出資訊的方法,檢查索引的變化是否有超出預期的狀況。