2015-06-24 142 views
3

我写过3x3的平均滤波器。它工作正常,但它显示三次相同的输出图像,而不是一个。如何解决问题?平均滤波器Matlab

的代码是提前

function [filtr_image] = avgFilter(noisy_image) 

    [x,y] = size(noisy_image); 
    filtr_image = zeros(x,y); 
    for i = 2:x-1 
     for j =2:y-1 
      sum = 0; 
      for k = i-1:i+1 
       for l = j-1:j+1 
        sum = sum+noisy_image(k,l); 
       end 
      end 
      filtr_image(i,j) = sum/9.0; 
      filtr_image = uint8(filtr_image); 

     end 
    end 

end 

感谢

+1

http://stackoverflow.com/questions/13445334/3x3-average-filter-in-matlab?rq=1 – dasdingonesin

+1

是您的图像**颜色**或**灰度**?此代码假定您的图像是灰度。 – rayryeng

回答

1

我不明白为什么你的代码会重复图像(除非它是由一个整数溢出的模式原因:/),但这里有一些建议:

如果要使用循环,至少降内环

[x,y] = size(noisy_image); 
filtr_image = zeros(x,y); 
for i = 2:x-1 
    for j =2:y-1 
     % // you could do this in 1 line if you use mean2(...) instead 
     sub = noisy_image(i-1:i+1, j-1:j+1); 
     filtr_image = uint8(mean(sub(:))); 
    end 
end 

但是你知道卷积吗? MATLAB有一个内置的功能是:

filter = ones(3)/9; 
filtr_image = uint8(conv2(noisy_image, filter, 'same')); 
1

什么是最有可能发生的事情是,你提供一个彩色图像时的代码是专指灰度的事实。让我们从这个教训中盲目地从源代码中复制代码,而不是首先完全理解代码。

为什么你看到的“三”是因为当你这样做来分配你的输出滤波图像的原因:如果你有一个三维矩阵

[x,y] = size(noisy_image) 

,通过size报告列数将是y = size(noisy_image,2)*size(noisy_image,3);。因此,当您迭代图像中的每个像素时,按列主要顺序,每个平面将彼此并排放置。你应该做的是要么将您的图像从RGB转换为灰度,要么单独过滤每个平面。

另外,您在循环中执行了不必要的转换。只需在循环之外执行一次。

选项#1 - 每架飞机的筛选

function [filtr_image] = avgFilter(noisy_image) 
[x,y,z] = size(noisy_image); 
filtr_image = zeros(x,y,z,'uint8'); 
for a = 1 : z 
    for i = 2:x-1 
     for j =2:y-1 
      sum = 0; 
      for k = i-1:i+1 
       for l = j-1:j+1 
        sum = sum+noisy_image(k,l,a); 
       end 
      end 
      filtr_image(i,j,a) = sum/9.0; 
     end 
    end 
end 
end 

然后你会被称之为:

filtr_image = avgFilter(noisy_image); 

选项#2 - 转换为灰度

filtr_image = avgFilter(rgb2gray(noisy_image)); 

小注

您正在使用sum作为一个变量。这是一个非常糟糕的选择。 sum是MATLAB中的一个实际功能,你可能会用变量掩盖这个函数。如果您有其他功能依赖sum进行后续操作,则会产生意想不到的后果。