【问题标题】:Extracting a 3x3 matrix from an image [duplicate]从图像中提取 3x3 矩阵 [重复]
【发布时间】:2013-06-17 15:47:51
【问题描述】:

我需要从图像中提取一个 3x3 矩阵并单独存储,它应该像这样一直持续到图像结束。比如我的图像是如下矩阵:

p = [ 1 2 3 4 5 6 7 8 9; ...
      1 2 3 4 5 6 7 8 9; ...
      1 2 3 4 5 6 7 8 9; ...
      1 2 3 4 5 6 7 8 9; ...
      1 2 3 4 5 6 7 8 9; ...
      1 2 3 4 5 6 7 8 9 ]

输出应该是这样的:

p1 = [1 2 3; 1 2 3; 1 2 3]
p2 = [4 5 6; 4 5 6; 4 5 6]
p3 = [7 8 9; 7 8 9; 7 8 9]

等等……

您能建议我为此编写代码或内置函数吗?

【问题讨论】:

  • @ZoranPlesivčak MATLAB 可以很好地解释矩阵定义,没有省略号。在这种情况下,它们是多余的。
  • @EitanT 我不知道...也许你应该恢复我的更改。
  • @ZoranPlesivčak 这并不重要。如果你愿意,你也可以这样做。
  • -1:我不同意最初的投票。 你能否给我推荐代码或内置函数表明缺乏研究工作。另外:为什么要提取矩阵并生成额外的矩阵?为什么就地索引和执行计算不是一种选择?

标签: matlab matrix matrix-indexing


【解决方案1】:

提取子矩阵的最简单方法:

p1 = img(1:3, 1:3);
p2 = img(4:6, 4:6);
p3 = img(7:9, 7:9);

切片函数。

function imgsl = img_slice( img, ry, rx )
    [ Y X ] = meshgrid(ry, rx);
    imgsl = reshape(img(sub2ind(size(img),Y(:),X(:))),[length(rx) length(ry)]).';

如下使用:

p1 = img_slice( p, 1:3, 1:3 );
p2 = img_slice( p, 4:6, 4:6 );
p3 = img_slice( p, 7:9, 7:9 );

【讨论】:

    【解决方案2】:

    图像处理工具箱有一个im2col函数(link)

    B = im2col(p, [3 3], 'distinct');
    

    那么B的每一列都是一个3x3的块做成一个向量,你可以用reshape(B(:, i), 3, 3)来恢复第i个3x3的块。请注意,p 会填充零。

    【讨论】:

      猜你喜欢
      • 2016-04-06
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      相关资源
      最近更新 更多