2013-10-03 48 views
1

讓說我有一個基於二維數組,這樣下面的座標圖像:如何基於二維陣列上裁剪圖像

{ 
     { ' ', ' ', ' ', ' ' }, 
     { ' ', ' ', 'x', ' ' }, 
     { ' ', 'x', ' ', ' ' }, 
     { ' ', 'x', 'x', ' ' } 
}; 

想將它裁剪成更小的陣列,例如:

{ 
     { ' ', 'x' }, 
     { 'x', ' ' }, 
     { 'x', 'x' } 
}; 

我該怎麼做?有任何想法嗎?

+1

請分享你的想法。 – Maroun

+0

我的第一個想法是:找到角落像素(迭代 - >最小/最大),然後使用由彼此距離最遠的對角線創建的矩形。 –

回答

1

迭代數組一次。

雖然迭代,找到最left列(列,其中x第一次出現)和最right(列,其中x最後一次出現)。 2行相同:top上的一個,bottom上的一個。這4行爲您的圖像提供了界限。

   left right 
     { ' ', ' ', ' ', ' ' }, 
top { ' ', ' ', 'x', ' ' }, 
     { ' ', 'x', ' ', ' ' }, 
bottom { ' ', 'x', 'x', ' ' } 

僞代碼:

int left = INT_MAX, right = -1, top = INT_MAX, bottom = -1 
for (int y = 0; y < Y; y++) 
    for (int x = 0; x < X; x++) 
    if (t[x][y] == 'x') 
    { 
     if (left > x) left = x 
     if (right < x) right = x 
     if (top > y) top = y 
     bottom = y // we don't need if! :) 
    } 

鑑於你輸入例如,將會產生這樣的指數:

left == 1 
right == 2 
top == 1 
bottom == 3 

以子矩陣與該邊界包括將給你的示例性的輸出圖像。