2013-11-23 67 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