如何将1d图像阵列卷积为2d滤波得到相同的结果

时间:2013-03-19 09:33:43

标签: matlab image-processing filtering

我尝试将2d图像转换为1d和滤镜以及我希望使用1d滤镜过滤该图像并获得与2d卷积相同的像素响应。

我已经完成了

I1 = I(:)
filter1 = filter(:);
response = imfilter(I1,filter1,'conv')
response2d = imfilter(I,filter,'conv');

responseresponse2d与匹配的条目不同。

怎么能解决这个问题?有什么建议吗?

2 个答案:

答案 0 :(得分:1)

在数学上,卷积2D信号与卷积1D信号不相等。所以它不能产生相同的结果。

例如,如果您有一个均值过滤器,请说:

A = [1/9 1/9 1/9;
    1/9 1/9 1/9;
    1/9 1/9 1/9]

然后对于像素P(i,j),结果强度将受以下值影响:

R(i,j) = 
1/9 * 
( P(i-1,j-1) + P(i-1,j) + P(i-1,j+1) +
P(i,j-1) + P(i,j) + P(i,j+1) +
P(i+1,j-1) + P(i+1,j) + P(i,j+1) 
)

如果你将滤波器内核和信号分布在列中,那么,如果我们说(为简单起见)像素P(i,j)位于行的中间某个位置,而不是靠近末尾,那么新的价值将是:

R(i,j) = 
1/9 * (
R(i-4,j) + R(i-3,j) + R(i-2,j) + R(i-1,j) +
R(i,j) +
R(i+1,j) + R(i+2,j) + R(i+3,j) + R(i+4,j)
)
当然,在新的1D信号中,索引不是二维的 R(i,j)变为R( i + j*imageHeight ),因为信号已展开。

很明显,第二种情况下每个像素的值是使用不同的邻居进行计算,因此任何图像都不能相等,可能仅适用于具有特定周期信号的特殊场合。

答案 1 :(得分:1)

一般情况下是不可能的。 然而,对于一类非常重要的过滤内核,它不仅可行,而且非常有效。这是所谓的可分离内核的类,它包括平均值(也称为盒子模糊)滤镜,高斯模糊以及矩阵 K 可以包含的所有其他内核表示为两个向量的外积 K = u * v,即列向量 u 的乘积,行数与K一样,行向量 v 包含与 K 一样多的列。

如果是这种情况,图像 I 与内核 K 的2D卷积在数学上等于两个1D卷积的序列,即卷积的使用 u I 列,然后使用第一个卷积结果的 v 进行卷积。查看有关可分离过滤器的更多信息here

如果您使用的是通用2D内核 K ,并且不知道它是否可分,那么测试它的方法是计算其奇异值分解(SVD K = U * S * V ,您可以使用任意多个库。然后,您可以看到矩阵 S 的所有对角项( K 奇异值)是否几乎为零,除了第一个S (1,1)。 SVD库通常会按照从最大到最小的排序顺序生成奇异值,因此您只需要验证 S(1,1)> 0 S(2,2)/ S(1,1)<< 1 。 如果是这种情况,则它是 u == U(:,1) U 的第一列, v == V(1, :),矩阵的第一行 V