代碼中存在幾個問題,我可以立即看到。最引人注目的是來自最裏面的內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
保持不變。
Turbo C++甚至不存在了。我建議你轉到Visual Studio 2005/2008/2010並獲得免費的* Express *版本。然後開始使用OpenCV(用於圖像處理的跨平臺庫)進行認真的工作。 – karlphillip
我同意你所說的,比什麼都重要。但改變平臺並不是我可以做出的決定。 – Chang