【问题标题】:Is there a way to filter an image with a VARIABLE filter (pixels of another image) in MATLAB without using nested for loops?有没有办法在 MATLAB 中使用 VARIABLE 过滤器(另一个图像的像素)过滤图像而不使用嵌套的 for 循环?
【发布时间】:2014-04-23 21:56:07
【问题描述】:

我有一个图像 U,当我想用​​盒子过滤器对它进行卷积时:

0  1  0
1 -4  1
0  1  0

我使用带有常量二维数组的 imfilter 函数,没有问题。但是,当我进行以下操作时:

u(i,j) = v(i-1,j)^2 * u(i-1,j) + v(i+1,j)^2 * u(i+1,j) + v(i, j+1)^2 * u(i,j+1) + v(i,j-1)^2 * u(i,j-1)

(我的过滤器的简化版本)。换句话说,我要在图像 U 上使用的过滤器与图像 V 的像素值相关,但在应用过滤器的同一位置。有没有办法在 MATLAB 中实现这样的操作,而不使用每个像素的嵌套 for 循环?

【问题讨论】:

  • 您不希望获取u.*(v.^2),然后将其与适当的过滤器进行卷积吗?
  • 您可以考虑使用具有 [1 1] 块大小和适当边框大小的 BLOCKPROC。在回调中,您将获得从 v 中查找像素的索引。实现起来应该很快,但运行起来很慢。查找 blockproc 并尝试一下,如果遇到困难,请回复。旁白:您可能对mathworks.com/help/images/ref/imguidedfilter.html 感兴趣
  • 如果您打算遵循@Ashish 的建议,请小心:块处理〜= 移动过滤器!从这一点出发,我支持在过滤之前将两个图像相乘的方法。
  • 吉格,就是这样。使用带有 BorderSize 的块大小为 [1 1] 会导致滑动窗口过滤器。 stackoverflow.com/questions/15195030/…

标签: matlab matrix filtering


【解决方案1】:

您可以使用im2colcol2im 解决它,如下所示:

% 使用 B 过滤 A

mA = randn(10, 10); mB = randn(10, 10);

mACol = im2col(mA, [3, 3], '滑动'); mBCol = im2col(mB, [3, 3], '滑动');

mAColFilt = sum(mACol .* (mBCol .^ 2));

mAFilt = col2im(mAColFilt, [3, 3], [10, 10]);

我跳过了以获得正确的系数(在你的情况下,它们中的几个为零,其余的提高到 2 的幂,我只提高了所有的 2 的幂)。

注意过滤后的图像更小(过滤器的边界)。
您应该根据需要填充它。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2011-09-15
    • 2021-03-22
    • 2011-10-13
    • 1970-01-01
    • 2018-12-17
    相关资源
    最近更新 更多