【问题标题】:Segment the image into blocks将图像分割成块
【发布时间】:2013-12-05 05:42:24
【问题描述】:

让我们考虑一个大小为 512x512 的图像 Y。

下面的代码用于将图像 Y 分割成块,每个块的大小为 8x8。

Matlab Code:

for m = 1:64
    for n = 1:64
        subX = Y(8*(m-1)+1:8*m,8*(n-1)+1:8*n);
    end
end

我在这个问题中需要解决以下两个问题:

1) 将图像 X 分割成 8 x 8 的块数(不是大小为 8x8,但块数必须为 8x8)。在这种情况下,图像将被分割成 64 个块,每个块包含 512/64 像素 =8 像素。

2) 与 1) 的概念相同,但在这种情况下,我想将图像分割成 10x10 的块数。因此图像将被分割成 100 个块。但是我们现在可以注意到每个块包含 512/100 = 5.12 像素!所以它是浮动的!

请帮助我编写一个可以同时解决我的两个问题的独特代码。

最好的问候,

克里斯蒂娜。

【问题讨论】:

  • 抱歉,我看不出真正的问题。在这两种情况下,在我看来,用适当的常量替换你拥有的硬编码常量就足够了(可能在地板操作之后)。

标签: image-processing matlab image-segmentation


【解决方案1】:

尝试使用mat2cell 将图像分成块:

bsX = 10; bsY = 10;
[m,n] = size(Y);
numFullBlocksX = floor(n/bsX); numFullBlocksY = floor(m/bsY);
xBlocks = [repmat(bsX,numFullBlocksX,1); mod(n,bsX)*ones(mod(n,bsX)>0)];
yBlocks = [repmat(bsY,numFullBlocksY,1); mod(m,bsY)*ones(mod(m,bsY)>0)];
blockCell = mat2cell(Y,yBlocks,xBlocks)

要改为从块数到块大小,请以这两行代替 bsX = 10; bsY = 10;:

numBlocksX = 10; numBlocksY = 10;
bsX = ceil(n/numBlocksX); bsY = ceil(m/numBlocksY);

【讨论】:

  • 首先非常感谢您的回答。好的,我测试了你的代码,它运行良好。您的代码用于将图像分割成 10x10 块,对吗?所以每个块就像一个子矩阵对吗? blockcell 是将图像分割成 10x10 块吗?如何将每个子矩阵设置为数组单元?那么如何选择一个特定的块来应用一些转换呢?
  • @Christina 要访问第 2 行和第 8 列的块,blockCell{2,8}(请注意花括号)为您提供 10x10 块。 blockCell 的最后一行和最后一列中的块当然会小于或等于其他块的大小,具体取决于bs
  • 啊,所以blockCell是图像分割的完整结果。换句话说,blockCell 是将图像分割成 10x10 块,要访问特定的块,我们必须写 blockCell {...,...} 对吗?提前致谢! :)
  • @Christina 没错。在使用floor 计算每个方向上的完整大小块的数量后,如果需要,通过附加一个大小为mod(n,bs) 的额外更小的块来创建一个块大小的向量(xBlocks)(ones(mod(n,bs)>0) 避免了一个更小的块不需要时)。
  • 但我认为您的代码将图像分割成块,每个块的大小为 10x10。但我需要将图像分割成 10x10 块(块数为 10x10),而不是每个块的大小为 10x10
猜你喜欢
  • 1970-01-01
  • 2014-04-11
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
相关资源
最近更新 更多