2013-11-23 69 views
0

两天前我问过如何将图像分块为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×160 代码工作以及当尝试将图像分割成8×8的块数,或10×10,或12 x 12,...等

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

分割是否依赖于原始图像的大小?因为当我与较大的图像工作时,图像被分割成22×22

我只需要你对我的问题的意见(如果分割取决于图像的大小?)

请我需要你的帮助!

+1

您是否尝试过逐行检查代码,看看您是否理解它的作用? –

+0

真诚的不,我不明白所有的线,但它效果不错:) – Christina

回答

2

从某种意义上说,分割将取决于原始图像的大小,因为它可能发生原始图像的X和Y维度的大小不能完全被MxN整除(块的总数最后你想拥有)。

如何处理mod(n,bsX)或mod(m,bsY)非零的情况?你有一些边界块的尺寸与其他尺寸不同吗?如果不是,那么您必须更改图像大小,以便每个维度的大小可以完全除以块的数量(模数= 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。

+0

谢谢你的答案! :) ,,désolé它是“进入”而不是“int”,这是从我的键盘错误..所以有办法修改代码,以便有可能将图像分割成更多的块? – Christina

+2

是的,当然。但这取决于你希望达到的最终结果。每个区块的尺寸必须相同吗?我会这样认为的。在这种情况下,您必须先调整图像大小。那么一切都更容易。 – Falimond

+0

你的意思是我必须调整我的原始图像,以获得更大的图像,并可以分割成更多的块? – Christina