imfilter函数:
下面这段是转的翻译:
用法:B = imfilter(A,H)
B = imfilter(A,H,option1,option2,...)
或写作g = imfilter(f, w, filtering_mode, boundary_options, size_options)
其中,f为输入图像,w为滤波掩模,g为滤波后图像。filtering_mode用于指定在滤波过程中是使用“相关”还是“卷积”。boundary_options用于处理边界充零问题,边界的大小由滤波器的大小确定。具体参数选项见下表:
|
选项 |
描述 |
filtering_mode |
‘corr’ |
通过使用相关来完成,该值为默认。 |
|
‘conv’ |
通过使用卷积来完成 |
boundary_options |
‘X’ |
输入图像的边界通过用值X(无引号)来填充扩展 其默认值为0 |
|
‘replicate’ |
图像大小通过复制外边界的值来扩展 |
|
‘symmetric’ |
图像大小通过镜像反射其边界来扩展 |
|
‘circular’ |
图像大小通过将图像看成是一个二维周期函数的一个周期来扩展 |
size_options |
‘full’ |
输出图像的大小与被扩展图像的大小相同 |
|
‘same’ |
输出图像的大小与输入图像的大小相同。这可通过将滤波掩模的中心点的偏移限制到原图像中包含的点来实现,该值为默认值。 |
下面对这些参数进行一些分析,因为上表已经很好地解释了各自的含义,以几个例子更好得理解这些含义:
(下面的例子都是以奇数行和奇数列为准)
(1)参数“full”和“same”
一维:
x=[1 1 1 1 1];
h = [1 1 1];
imfilter(x,h,'full')的结果是 ans1=[1 2 3 3 3 2 1] 其大小size(x)+size(h)-1
imfilter(x,h,'same')的结果是 ans2=[2 3 3 3 2 ] 其大小和x是一样的
所以推广成,如果是参数full,x的最左边的数字和h的最右边的数字对齐;如果参数是same,x的最左边的数字和h的中间数字对齐!
二维:
x=ones[5,5];
h=ones[3,3];
参数是"same"对齐的样子(黄色区域):
我想这样大部分就明白了参数“full”和“same”的含义了吧。
(2)参数‘corr’和“conv”
卷积和相关是这些参数中,最好理解的。卷积就是会将h转180度。而相关是不对h最任何操作的。
当然,关于卷积和相关还有很多一系列关系,当然需要一些数学推导,这里的目的是数字各参数的区别和用法,所以就不强调这个了。
下面是我将冈萨雷斯的书中截下来的,较易懂
(3)参数X(无引号),'replicate','symmetric','circular'
这个参数其实就是如何补外边界的数字
t=[1 2 3 w=[1 1 1
4 5 6 1 1 1
7 8 9]; 1 1 1];
下面看看四种调用方法及其效果(红色为原来的矩阵t,黄色的为补上的外圈,因为w是3*3的矩阵,所以外围加两圈,这里只对左上角进行分析,其他区域完全类似。):
imfilter(t,w,'symmetric') 对称的时候需要注意,左右(2,3)上下(4,7)要对称,斜边也要对称(如5,9,8,6)
imfilter(t,w,'replicate') 可以先加外围一圈(1,4,7,1,2,3)斜边上的(1)就和红色区域的左上角一致就ok!
imfilter(t,w,'circular')(很遗憾,这个我没有搞明白!有知道的可以告诉一声,谢谢!)
(我顿时发现在padarray这个函数中可以找到灵感!具体看下面)
padarray函数
这个函数至多只有四种参数,都可以包括在一个调用格式中
B = padarray(A, padsize, padval, direction)
参数解释:
A:就是一个矩阵(或向量)
padsize:将矩阵A如何扩大。比如pdasize=[2,3]意味着增加上下各增加2行,左右各增加3列。
有没有发现参数padal和imfilter的一些参数完全一样。我们直接看效果,就可以理解了
example:
x = [1 2 3;4 5 6];
A1 = padarray(x,[2,3],'replicate');
A2 = padarray(x,[2,3],'symmetric');
A3 = padarray(x,[2,3],'circular');
A4 = padarray(x,[2,3]);
看结果result(红色为原有矩阵,黑色的就是结果新加上的)
A1 =
1 1 1 1 2 3 3 3 3
1 1 1 1 2 3 3 3 3
1 1 1 1 2 3 3 3 3
4 4 4 4 5 6 6 6 6
4 4 4 4 5 6 6 6 6
4 4 4 4 5 6 6 6 6
A2 =
6 5 4 4 5 6 6 5 4
3 2 1 1 2 3 3 2 1
3 2 1 1 2 3 3 2 1
6 5 4 4 5 6 6 5 4
6 5 4 4 5 6 6 5 4
3 2 1 1 2 3 3 2 1
A3 =
1 2 3 1 2 3 1 2 3
4 5 6 4 5 6 4 5 6
1 2 3 1 2 3 1 2 3
4 5 6 4 5 6 4 5 6
1 2 3 1 2 3 1 2 3
4 5 6 4 5 6 4 5 6
A4 =
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 1 2 3 0 0 0
0 0 0 4 5 6 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
其他的就不讲了,具体看看A3,
具体分析分析x是如何变成A3的
1 2 3 行的有顺序复制 1 2 3
4 5 6 —————————》 4 5 6 ——————》然后是列的有顺序的复制就是A3
1 2 3
4 5 6
1 2 3
4 5 6
是不是就明白了,A3的由来!那是不是就可以推导出imfilter参数的circular是相同的方法了!
这里再讲下,因为这里的x是2*3的矩阵,而padsize碰巧是[2,3],刚刚好是整数倍那如果padsize是[1,1]呢
结果是
ans =
6 4 5 6 4
3 1 2 3 1
6 4 5 6 4
3 1 2 3 1
下边和右边的复制归为一类,上边和左边的复制归为一类。
为什么呢?我相信大家都应该看得出来吧。就是下边和右边的复制是从上到下从左到右的,而左边和上边的复制是从下到上从右到左的!(语文水平实在差,表述不好,希望各位可以理解!)
关于另一个参数direction,更好理解啦!
“post”只复制右边和下边;
“pre”只复制上边和左边;而默认的情况就是“both”四周都复制!
example更好理解:
x = [1 2 3;4 5 6];
A1 = padarray(x,[2,3],'pre');
A2 = padarray(x,[2,3],'post');
A3 = padarray(x,[2,3],'both'); %相当于padarray(x,[2,3]);
result:
A1 =
A2 =
1 2 3 0 0
4 5 6 0 0
0 0 0 0 0
0 0 0 0 0
A3 =
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 1 2 3 0 0
0 0 4 5 6 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0