将图像分割成块是否取决于该图像的大小?

时间:2013-11-23 19:52:21

标签: image image-processing matlab image-segmentation

两天前我问过如何将图像分割成how to segment the image into block中的块。幸运的是,我得到了亲爱的chappjc的最佳答案。

[m,n] = size(Image);
numBlocksX = 10; numBlocksY = 10;
bsX = ceil(n/numBlocksX); bsY = ceil(m/numBlocksY);
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(Image,yBlocks,xBlocks);

我的问题:

我的图片尺寸为160 x 160。 当我尝试将图像分割成8 x 8个块,或10 x 10或12 x 12等时,代码效果很好。

但是当我尝试将图像分割成22 x 22个块时,代码可以工作,但图像被分割成21 x 21而不是22 x 22 !!

分割是否取决于原始图像的大小?因为当我使用更大的图像时,图像被分割成22 x 22.

我只需要您对我的问题的看法(如果细分取决于图像的大小?)

我需要你的帮助!

1 个答案:

答案 0 :(得分:2)

在某种意义上,是的,分割将取决于原始图像的大小,因为可能发生原始图像的X和Y尺寸的大小都不能被MxN完全整除(块的总数)我想最终)。

你想如何处理mod(n,bsX)或mod(m,bsY)非零的情况?让一些边框块的尺寸与其他边框不同,你还可以吗?如果不是,那么你必须改变图像大小,使每个维度的大小完全可以被块数(modulo = 0)整除。

[m,n] = size(image);
numBlocksY = 13; numBlocksX = 11;
resized = imresize(image, [ (numBlocksY*ceil(m/numBlocksY) ), (numBlocksX*ceil(n/numBlocksY)) ]);
[o,p] = size(resized)
mod(o,numBlocksY)
mod(p,numBlocksX)

你会发现mod结果为零。现在,已调整大小的图像的大小可以完全被每个维度中所需的分割(块)数除尽。您剩下要做的就是使用正确的参数在调整大小的图像上调用mat2cell - 但我会留给您。这样你仍然会有MxN块,但它们都是相同的大小。其大小计算如下:

blockXsize = o/numBlocksY;
blockYsize = p/numBlocksX;

您需要以某种方式使用这些大小来正确调用mat2cell。