2014-04-13 123 views
-1

我寫了一段代碼here來將圖像與給定的內核進行卷積。根據我在頁面底部收到的建議,與使用conv2函數相比,我設法獲得[幾乎]完全相同的圖片。幾乎我的意思是當imshow顯示圖像看起來相同時,但輸出圖像中的值有所不同,但是。但是,當我將高斯內核與圖像進行卷積時,它會變得更糟。那麼我自己和conv2函數的輸出差異很大!這是爲什麼?你能告訴我我的代碼有什麼問題嗎?應用高斯濾波器內核後的卷積

原來我犯了一個錯誤。我已經對imageFilter()做了一些修改,但沒有注意到它們存在兩天直到現在!

您可以看到imageFilter()代碼here

gaussKernel = fspecial('gaussian', 3, 2); 
testImage1 = imageFilter(image, gaussKernel); 
testImage2 = conv2(image, gaussKernel); 

謝謝

+0

什麼是'imageFilter'? –

+0

此外,「差異很大」不是一個有用的描述。請提供一個具體的例子。 –

+0

當你說外部圖片時,你的意思是朝向外邊緣的像素,例如那些功能的支持與邊緣重疊的像素?此外,與您的問題無關,但您的支持對於2的西格瑪來說顯得非常小。 – timbo

回答

1

有2個原因:

  1. 精密: 在你imageFilter方法的最後一行要轉換到uint8數據類型(這是一個8位整數),所以你基本上是對你的結果進行四捨五入:

    finalImg = uint8(finalImg);

    本地方法conv2然而呈現數據類型double的矩陣gaussKernel,這確實卷積在雙打,因此在研磨器的精度。

  2. 邊界條件conv2有第三個參數(見docs)具有與結果的形狀做什麼。在你的方法中,你計算的卷積結果的零填充相同的大小作爲原始圖像,而conv2默認情況下計算全卷積。

所以一個簡單的修改將產生相同的結果:

gaussKernel = fspecial('gaussian', 3, 2); 
testImage1 = imageFilter(im, gaussKernel); 
testImage2 = uint8(conv2(im, gaussKernel, 'same'));