OpenCV_透過データありの 4 チャンネル を CV_8UC1 にしたらおかしい

チャンネル数を 1 にすればグレースケール!ではないらしい。
CV_8UC1 にするなら convertTo だ…。

 

↓を実行しても想定通りの結果が出なかった。

    cv::Mat gray
    cv::cvtColor(mat, gray, CV_8UC1);
    //mat は cv::Mat 型の 4 チャンネル。透過データあり。

黒 ( 0 ) のみの画像を変換したら、
0, 0, 0, 255,0, 0, 0, 255,0, 0, 0, 255 …となった。

 

↓ で上手くいった。

    cv::cvtColor(mat, gray, CV_BGR2GRAY);

 

透過は不要だったから CV_BGRA2GRAY でなくともいけたのかと。
なお、グレースケール化する時、CV_BGR2GRAY は B と G と R の平均だが
CV_BGRA2GRAY は、A をどう計算しているか不明のもよう。

 

cvtColor
色空間を変換
BGR から HSV やら YUV にしたり。

 

convertTo
ビット深度を変換する。
出力 Mat ( 行列 ) のチャンネル数は元の行列と同じ。

 

ビット深度
1 ピクセル当りに割り当てるデータ量
ex )
24 bit の場合、 1 ピクセルに 24 bit ( 3 byte )割り当てられている。

 


変換コードは、cv::COLOR_BGR2GRAY など書いてあったが、
己環境ではCV_BGR2GRAY と書けば通った。 己環境バージョン 3.0 だけどなんでだろ。

 

こちらから。
https://stackoverflow.com/questions/36005750/cv-8uc4-convertto-cv-8uc1-doesnt-work
http://opencv.jp/opencv-2.1/cpp/miscellaneous_image_transformations.html#cv-cvtcolor
https://docs.opencv.org/3.3.0/d7/d1b/group__imgproc__misc.html#ga4e0972be5de079fed4e3a10e24ef5ef0
http://opencv.jp/opencv-2.1/cpp/basic_structures.html#cv-mat-convertto
http://aviutl.info/color-depth/

 

以上。