すぐにわかるコードにはいくつかの問題があります。最も印象的なループのための最も内側の内から来る:
ここ
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;
、あなたは単純に4倍以上sum
に同じ値を追加し、その後、4で割っています。これにより、これらの6行は、
*Image = PaintBox1->Canvas->Pixels[ i ][ j ];
と同等になります。明らかに、実際には各チャンネルの平均を求めていました。あなたのRGB画像を3次元配列として実装された場合、これはおそらくのようになります。あなたの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;
しかし、あなたのコードの例から、それが見えます(un)符号付き整数。その場合には、次のコードは、(提供整数はあなたのマシン上に4つのバイトをしている)で十分です:
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 ];
として初期化します。
// before the for loops
Image = new unsigned char[ 160 * 120 * 1 ];
unsigned char * temp = Image;
// at the end of the inner for loop:
temp++;
:しかし、その後、それぞれの時間は、ループを通じて、あなたは配列の先頭へのポインタを維持し、イテレータとして働き、一時的なポインタを持っている必要があり、
Image++;
むしろ書きました
temp
ポインタの周りを移動するだけです。Image
は固定されたままです。
Turbo C++はもはや存在しません。私はあなたがVisual Studio 2005/2008/2010に移動し、* Express *版を無料で入手することをお勧めします。次に、深刻な作業を行うためにOpenCV(画像処理用のクロスプラットフォームライブラリ)を使い始める。 – karlphillip
私は、何よりも、あなたが言ったことに同意します。しかし、プラットフォームを変更することは私が決定を下すことができるものではありません。 – Chang