【问题标题】:MATLAB: How to apply the colfilt commandMATLAB:如何应用 colfilt 命令
【发布时间】:2014-07-06 12:23:58
【问题描述】:
我有一张 768 x 1024 像素的图像。我想在这个图像上执行一个订单统计过滤器,例如最小值和最大值。为此,我想使用带有 5 x 5 滑动窗口的 colfilt 函数来进行最小过滤。换句话说:
OP = colfilt(IP, [5 5], 'sliding', @min);
但是,我收到了以下错误消息:
???错误使用 ==> reshape 要 RESHAPE 元素的数量不能
改变。
==> colfilt 中的错误在 183 b(i*mb+brows,j*nb+bcols) = ...
我做错了什么?
【问题讨论】:
标签:
matlab
image-processing
filter
filtering
【解决方案1】:
我不确定为什么 colfilt 不适合你。我对使用colfilt 进行了一些测试,它似乎对我有用。你能提供一个链接或在哪里我可以下载图像并测试它吗?
与此同时,您可以做的(几乎)相同的事情是尝试使用im2col 获取每个滑动窗口邻域并将它们放入单独的列中。之后,取每一列的最小值,然后通过执行col2im 将其重构回矩阵。因此,尝试这样做:
- 做
IP2 = im2col(IP, [5 5]);
- 然后做
OP = min(IP2);
- 完成后,请执行以下操作:
OP2 = col2im(OP, [5 5], [768 1024]);
OP2 因此将包含您的(最小)过滤图像。请记住,这将包含图像的裁剪版本,其中消除了沿边界的一些像素,以确保过滤蒙版完全适合图像。因此,您的输出将是 766 x 1022 的图像,因为您的掩码是 5 x 5。如果您想避免这种情况,请考虑沿边界填充您的矩阵,以便获得相同大小的输出在末尾。因为您的遮罩是 5 x 5,所以您将在图像周围有一个 2 像素的边框,该边框保持未处理,以确保遮罩完全包含在图像中。因此,请在执行步骤 #1 - #3 之前尝试这样做:
IPPad = padarray(IP, [2 2], 'replicate');
replicate 选项只会沿着原始图像的边界沿填充图像的边界复制这些像素。这将在您的图像周围创建一个 2 像素的边框。其他选项包括circular 和symmetric。如果您想完全用零填充边框(零填充),也可以不指定 replicate 标志。
希望这会有所帮助!