2011-07-03 45 views
0

我想將RGB圖像轉換爲灰度圖像。 RGB圖像是160 * 120 * 4,而我的灰度是160 * 120 * 1。然而,它不會讓我流淚,但只是普通的黑色,它需要很長時間。這是我寫的笏,請諮詢。謝謝灰度圖像轉換Turbo C++

int i, j, sum; 
Image = new unsigned char [ 160 * 120 * 1 ]; 
for(int j = 0; j < 120; j++) { 

    for(int i = 0; i < 160; i++) { 
    sum=0; 
     sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
     sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
     sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
     sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
     *Image = sum/4; 

     PaintBox2->Canvas->Pixels[ i ][ j ] = *Image; 
     Image++; 
    } 
} 
+1

Turbo C++甚至不存在了。我建議你轉到Visual Studio 2005/2008/2010並獲得免費的* Express *版本。然後開始使用OpenCV(用於圖像處理的跨平臺庫)進行認真的工作。 – karlphillip

+0

我同意你所說的,比什麼都重要。但改變平臺並不是我可以做出的決定。 – Chang

回答

1

代碼中存在幾個問題,我可以立即看到。最引人注目的是來自最裏面的內for循環:

sum=0; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ]; 
*Image = sum/4; 

在這裏,您只是在添加了相同的價值sum四次,然後除以4。這使得這六行相當於

*Image = PaintBox1->Canvas->Pixels[ i ][ j ]; 

顯然,你實際上想要平均每個通道。如果您的RGB圖像被作爲一個三維數組實現的,這可能會是這個樣子:

sum = 0; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 0 ]; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 1 ]; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 2 ]; 
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 3 ]; 
*Image = sum/4; 

不過,從你的代碼示例,它看起來像你的RGB圖像作爲一個二維數組實際上實施(聯合國)簽署的整數。在這種情況下,下面的代碼就足夠了(前提整數是你的機器上的四個字節):

sum = 0; 
unsigned int pixel = PaintBox1->Canvas->Pixels[ i ][ j ]; 
for(int k = 0; k < 4; ++k) 
{ 
    sum += pixel & 0xFF; 
    pixel >>= 1; 
} 
*Image = sum/4; 

我看到的另一個主要問題是,你沒有一個指針存到自己的灰度陣列的開始。你初始化它作爲

Image = new unsigned char[ 160 * 120 * 1 ]; 

這是很好的。但隨後每循環一次,你寫

Image++; 

相反,你應該保持一個指向數組的開頭,並有一個臨時的指針,它作爲一個迭代器:

// before the for loops 
Image = new unsigned char[ 160 * 120 * 1 ]; 
unsigned char * temp = Image; 

// at the end of the inner for loop: 
temp++; 

所以你只能在temp指針上移動,而Image保持不變。

+0

哦,我得到指針的一部分。但平均部分我相當瞭解,因爲我有rgb值,每個像素可以保存4個值,紅色x,藍色x,綠色x,最後是NULL。 – Chang

+0

你說每個像素都有4個值。他們存儲在一個單一的無符號整數或什麼?你的圖像究竟是如何實現的? –

+0

您可能希望匹配目標灰度圖像中源RGB圖像的亮度。使用以下標準公式: Y = 0.299 * R + 0.587 * G + 0.114 * B –