【问题标题】:How to correctly use the col2im function?如何正确使用 col2im 功能?
【发布时间】:2020-03-04 15:24:57
【问题描述】:

这个函数使用起来很混乱,而且总是给我一个错误:

要重塑元素的数量不能改变。

这是我的代码:

im=im2col(zeros(300,300),[3 3]);
im(:,9)=ones(9,1);
im=col2im(im,[3 3],[300 300]);

基本上,此代码只是获取索引 6 处的块,将其替换为 1,然后将其重新组合回原始图像。这段代码有什么问题?

【问题讨论】:

  • 请告诉我们想要的最终结果是什么。也许有人可以提出一种更好的方法来实现它,而无需使用“令人困惑”的功能。这可能是XY Problem 的情况。此外,您提到的错误不是您的代码给出的错误 - 在我的情况下(R2019b)它是:无法执行分配,因为左侧的大小是 9×1 和右侧的大小是 6×1。.
  • 另外,提供的代码在第二行崩溃,因为您在左侧有9x1,在右侧有6x1 - 而且,这与您提到的错误不同。
  • 对不起!那是错字,是 3x3,已编辑。
  • 看看distinct参数。
  • 这会给你一个The column size of b not consistent with BLK2COL size.的新错误

标签: matlab matrix


【解决方案1】:

您似乎想从输入数组中创建不同的块,更改单个块并重新排列它们。 (您的目标大小与输入数组大小相同。)因此,您必须在im2colcol2im 中都使用distinct 参数:

blk_size = [3, 3];
im = zeros(9, 9)
temp = im2col(im, blk_size, 'distinct');
temp(:, 3) = ones(prod(blk_size), 1);
im2 = col2im(temp, [3 3], size(im), 'distinct')

输出:

im =
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0

im2 =
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0
   1   1   1   0   0   0   0   0   0
   1   1   1   0   0   0   0   0   0
   1   1   1   0   0   0   0   0   0

im2colsliding 参数一起使用时,这也是默认值,如果根本没有设置参数,结果中的列将比重新排列为输入数组大小的列多得多,参看。 Tips 上的 im2col 部分。

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多