平均滤波器 Matlab

Average filter Matlab

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

密码是

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

提前致谢

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

如果你想使用循环,至少要去掉内部循环:

[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'));

最有可能发生的情况是,当代码专门用于灰度时,您提供的是 彩色 图像。你看到 "three" 的原因是当你这样做来分配你的输出过滤图像时:

[x,y] = size(noisy_image)

如果您有 3D 矩阵,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,这将产生意想不到的后果。