空域滤波就是二维卷积,计算步骤:
(1) 卷积核绕自己的核心元素顺时针旋转180度(这个千万不要忘了)
(2) 移动卷积核的中心元素,使它位于输入图像待处理像素的正上方
(3) 在旋转后的卷积核中,将输入图像的像素值作为权重相乘
MATALB仿真结果
a =
2 1 3 1
1 2 1 2
2 1 3 2
1 3 1 2
b =
1 1 1
1 1 1
1 1 1
c =
6 10 10 7
9 16 16 12
10 15 17 11
7 11 12 8
d =
2 3 6 5 4 1
3 6 10 10 7 3
5 9 16 16 12 5
4 10 15 17 11 6
3 7 11 12 8 4
(1) 卷积核绕自己的核心元素顺时针旋转180度(这个千万不要忘了)
(2) 移动卷积核的中心元素,使它位于输入图像待处理像素的正上方
(3) 在旋转后的卷积核中,将输入图像的像素值作为权重相乘
(4) 第三步各结果的和做为该输入像素对应的输出像素
卷积核就是滤波器系数
这是原始图像和卷积核:
这是3种情况下的卷积计算图示:
a计算扩充的某点,即第一个像素左上角的那一点,注意并不是计算第一个像素点的滤波值;b是计算中间某点的滤波值;c是计算扩充的某点,即第一行最后一个像素右上角的那一点,注意并不是计算第一行最后一点的滤波值;6*6的图像卷积3*3的核得到8*8的输出
设原始图像M*M,卷积核N*N,先把原始图像右边和下边扩充 N-1 个像素(卷积结果边长=M+N-1),不断平移卷积核,直到没有重叠区域为止;每次只考虑重叠的区域,对应位置相乘,把乘积相加就是当前像素点处的滤波输出,当前像素点永远位于卷积核的正中间。
相关MATALB代码
a=[2 1 3 1;1 2 1 2;2 1 3 2;1 3 1 2];
b=[1 1 1;1 1 1;1 1 1];
c=conv2(a,b,'same');
d=conv2(a,b,'full');
fprintf('\na = \n');
disp(a);
fprintf('\nb = \n');
disp(b);
fprintf('\nc = \n');
disp(c);
fprintf('\nd = \n');
disp(d);
MATALB仿真结果
a =
2 1 3 1
1 2 1 2
2 1 3 2
1 3 1 2
b =
1 1 1
1 1 1
1 1 1
c =
6 10 10 7
9 16 16 12
10 15 17 11
7 11 12 8
d =
2 3 6 5 4 1
3 6 10 10 7 3
5 9 16 16 12 5
4 10 15 17 11 6
3 7 11 12 8 4
1 4 5 6 3 2
matlab中的 imfilter 和 conv2 都能够实现,后者得到的结果直接是卷积结果,长度为M+N-1;但前者默认保持输入输出大小一致,将卷积结果的边界上的(N-1)/2 行(列)的元素舍弃