我已经编写了 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)
如果您有 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
的函数,这将产生意想不到的后果。
关于matlab - 平均滤波器Matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31025506/