2011-07-03 32 views
0

RGB画像をグレースケール画像に変換しようとしています。 RGB画像は160 * 120 * 4、グレースケールは160 * 120 * 1です。しかし、それは私にはわかりませんが、ちょうど普通の黒と私に与える、それは非常に長い時間がかかります。これは私が書いたワットです、助けてください。ありがとうグレースケール画像変換ターボ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

すぐにわかるコードにはいくつかの問題があります。最も印象的なループのための最も内側の内から来る:

ここ
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は固定されたままです。

+0

ああ、私はポインタの部分を取得します。しかし、私はrgbの値を持っているので、平均的な部分私はかなりdunそれを得る、各ピクセルは4値、赤のx amt、青のx amt、緑のx amt、そして最後にNULLを保持します。 – Chang

+0

各ピクセルに4つの値があるとします。それらは単一のunsigned intまたは何かの内部に格納されていますか?イメージはどのくらい正確に実装されていますか? –

+0

宛先グレースケールイメージのソースRGBイメージの輝度を一致させることができます。次の標準式を使用してください。 Y = 0.299 * R + 0.587 * G + 0.114 * B –

関連する問題