Matlab模糊滤波器的函数实现
我试图在Matlab中制作一个模糊图像的函数。我正在使用Matlabs演示图像Matlab模糊滤波器的函数实现,matlab,Matlab,我试图在Matlab中制作一个模糊图像的函数。我正在使用Matlabs演示图像peppers.png 以下是我的功能: function g = myfilter(f, h) f = double(f); %convert to double g = zeros(size(f)); %new array (size of f) a = (size(h, 1) - 1) / 2; %padding on edges for row = (a + 1) :
peppers.png
以下是我的功能:
function g = myfilter(f, h)
f = double(f); %convert to double
g = zeros(size(f)); %new array (size of f)
a = (size(h, 1) - 1) / 2; %padding on edges
for row = (a + 1) : (size(f,1) - a)
for col = (a + 1) : (size(f,2) - a)
gxy = 0; %running sum
for m = -a:a
for n = -a:a
gxy = gxy + f(row - m, col - n) + h(m + a+1, n + a+1);
end
end
g(row, col) = gxy;
end
end
g = uint8(g); %convert back to int
以下是我的命令:
>> img = imread('peppers.png');
>> imshow(img)
>> imgGray = rgb2gray(img);
>> imshow(imgGray)
>>
>> filt1 = (1/9)*ones(3)
filt1 =
0.1111 0.1111 0.1111
0.1111 0.1111 0.1111
0.1111 0.1111 0.1111
>> test = myfilter(imgGray, filt1);
>> imshow(test)
它成功地将彩色图像转换为灰色并应用过滤器
不幸的是,过滤器只是创建了一个几乎完整的白色图像(太亮)。。。我简直不明白为什么。。。它应该采取平均每个像素使用3x3过滤器。。。
你们知道为什么会这样吗 您需要查看MATLAB的conv2函数。以下2D卷积函数是从conv2中提取的,对于给定的滤波器非常有用
function c = myfilter(a, b)
[ma, na] = size(a);
[mb, nb] = size(b);
c = zeros( ma+mb-1, na+nb-1 );
for i = 1:mb
for j = 1:nb
r1 = i;
r2 = r1 + ma - 1;
c1 = j;
c2 = c1 + na - 1;
c(r1:r2,c1:c2) = c(r1:r2,c1:c2) + b(i,j) * a;
end
end
c = uint8(c)
简单的算术输入错误
gxy=gxy+f(行-m,列-n)+h(m+a+1,n+a+1)代码>
应该是:gxy=gxy+f(行-m,列-n)*h(m+a+1,n+a+1)代码>
它工作良好,现在创建了一个模糊的图像
它们不是相乘f
和h
,而是在上面的代码中求和,该代码不符合由2D卷积定义的空域图像滤波器。
Matlab正确地执行了该函数,但是引入了异常(或意外结果),即使过滤器使用不同的算术运算符正确运行
问题解决了