我尝试将2d图像转换为1d和滤镜以及我希望使用1d滤镜过滤该图像并获得与2d卷积相同的像素响应。
我已经完成了
I1 = I(:)
filter1 = filter(:);
response = imfilter(I1,filter1,'conv')
response2d = imfilter(I,filter,'conv');
但response
和response2d
与匹配的条目不同。
怎么能解决这个问题?有什么建议吗?
答案 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 。