2017-12-10 33 views
0

OpenCVを使ってC++でRGBカラー画像をグレースケールに変換しようとしていますが、唯一取得できるのは青色のスケール画像です。
Original
"Converted"opencv:RGBからグレースケールへの変換だけが青色になる

Vec3b simpleAveraging(Vec3b color){ 
    Vec3b gray = ((float)color[0] + (float)color[1] + (float)color[2])/3.0; 

    return gray; 
} 

Vec3b weightedAverage1(Vec3b color){ 
    Vec3b gray = 0.3 * (float)color[2] + 0.59 * (float)color[1] + 0.11 * (float)color[0]; 

    return gray; 
} 

Vec3b weightedAverage2(Vec3b color){ 
    Vec3b gray = 0.2126 * (float)color[2] + 0.7152 * (float)color[1] + 0.0722 * (float)color[0]; 

    return gray; 
} 

Vec3b weightedAverage3(Vec3b color){ 
    Vec3b gray = 0.299 * (float)color[2] + 0.587 * (float)color[1] + 0.114 * (float)color[0]; 

    return gray; 
} 

... 

for(int i = 0; i < 12; i++){ 
    for(int y = 0; y < img[i].rows; y++){ 
     for(int x = 0; x < img[i].cols; x++){ 
      color = img[i].at<Vec3b>(Point(x, y)); 

      img[i].at<Vec3b>(Point(x, y)) = weightedAverage3(color); 
     } 
    } 
} 

それは大学のプロジェクトのためのものであり、私の教授は、私がCV_RGB2GRAYを使用することはできませんので、これらのアルゴリズムを使用するように私に言いました。
私はあらゆる方法で青い縮尺を取得します。

+1

いずれかがCV_8UC1(グレースケール)にIMGの種類を設定したり、初期3channelの全3つのチャネルを設定しますweightedAverage3(カラー)に画像を変換します。今は青色の最初のチャンネルだけを設定しています。 –

+2

グレースケール画像は単一のチャンネルのみで構成されているので、 'cv :: Vec3b'を返すことは意味をなさないので、' uint8_t'でなければなりません。 –

答えて

0

あなたは3つのチャンネルしか持っていませんか?とにかくその場合

uint8_t weightedAverage3(Vec3b color){ 
    uint8_t gray = 0.301 * (float)color[0] + 0.587 * (float)color[1] + 0.114 * (float)color[2]; 

    return gray; 
} 

for(int i = 0; i < 12; i++){ 
    for(int y = 0; y < img[i].rows; y++){ 
     for(int x = 0; x < img[i].cols; x++){ 
      color = img[i].at<Vec3b>(Point(x, y)); 

      img[i].at<uchar>(Point(x, y)) = weightedAverage3(color); 
     } 
    } 
} 

0はRであると仮定すると、1はGであり、2は、B

ある
+1

これはOP問題にはまったく対応していません。ここで等号の右辺は単一の値であり、あなたはそれを 'Vec3b'に割り当てて' Vec3b'として返していることに注意してください。 –

+0

あなたは正しいと私は編集しました – farbiondriven

+1

これは基本的に正しいと思われますが、3チャンネルの画像に対して1つの 'uchar'値を割り当てています。私が思う新しいシングルチャンネルの「Mat」に割り当てるのが最善でしょうか? –

関連する問題