更新于2020/11/30,记录Matlab中的imfilter函数在Python下的对应函数。
首先给出结论:
Matlab | Python |
---|---|
imfilter中的’conv’ | scipy.ndimage.convolve |
imfilter中的’corr’ | scipy.ndimage.correlate |
imfilter中的’replicate’选项 | 上述函数中的mode='nearest’选项 |
n × n n\times n n×n的核 | 相同的核 |
n × 1 n\times 1 n×1的核 | 将数值放于 n × n n\times n n×n的核的第 n / 2 + 1 n/2+1 n/2+1列(注意起始下标id=0),其余位置为0 |
1 × n 1\times n 1×n的核 | 将数值放于 n × n n\times n n×n的核的第1列,其余位置为0 |
其中,可以用命令scipy.ndimage.filters.convolve
和scipy.ndimage.filters.correlate
,也可以用scipy.ndimage.convolve
和scipy.ndimage.correlate
,这两个命令是等价的
Conv
核尺寸为n×n时
下面的例子中,输入为:
核函数为:
Matlab命令:
imfilter(img, kernel, 'conv', 'replicate')
对应Python命令:
scipy.ndimage.filters.convolve(input, kernel, mode='nearest')
二者结果对比:
需要注意的是,上述命令中,Matlab下kernel的尺寸可以是列或行向量,但是Python下必须是一个
n
∗
n
n*n
n∗n的矩阵,否则会报错。
核尺寸为n×1时
当核为列向量时,在Matlab中可以直接使用。比如当核为kernel = [1, 0, 1, 2, 1, 2, 3, 7, -1]'
时,Matlab命令:
output_tmp = imfilter(tmp, kernel, 'conv', 'replicate');
的运行结果如下:
此时,如果想要得到相同的运算结果,则需要在Python下将值放置于中心位置,如下图所示:
此时,Python下的计算结果为:
与Matlab相同。
如果核尺寸为偶数,Python核有值的位置为
n
/
2
n/2
n/2(Python中下标从0开始)。比如当
n
=
10
n=10
n=10的时候,需要将第6列变成当前需要的数值(即对应Python下id=5)。例如,Matlab中核为kernel = [1, 0, 1, 2, 1, 2, 3, 7, -1, 1]';
,则Python下的核需要写成:
同样用命令
output_tmp = imfilter(tmp, kernel, 'conv', 'replicate') % Matlab命令
scipy.ndimage.filters.convolve(input, kernel, mode='nearest') # Python命令
得到如下结果:
核尺寸为1×n时
当核为行向量时,在Matlab中可以直接使用。比如当核为kernel = [1, 0, 1, 2, 1, 2, 3, 7, -1]
时,Matlab命令:
output_tmp = imfilter(tmp, kernel, 'conv', 'replicate')
的计算结果如下:
如果想得到同等对应的Python结果,则需要将核变成:
Python下的结果为
对于
n
n
n为偶数的情况也是相同的。如,Matlab下的核为kernel = [1, 0, 1, 2, 1, 2, 3, 7, -1, 1]
时,命令
output_tmp = imfilter(tmp, kernel, 'conv', 'replicate')
的结果为:
此时对应的Python核为:
结果为:
Corr
核尺寸为n×1时和核尺寸为1×n时的对应关系与前文Conv中所述相同,这里不再赘述。
下面的例子中,输入为:
核函数为:
Matlab命令:
imfilter(img, kernel, 'corr', 'replicate')
对应Python命令:
scipy.ndimage.filters.correlate(input, kernel, mode='nearest')