カラーをグレーへ変換する
2012年11月5日:OpenCV
カラーの画像を白黒の画像に変換する方法を紹介します。
以前に作ったプログラムを改良する形で進めていくので、自分でプログラムを作りたい場合はそちらを参考にしてください。
さっそくですが、以前に作ったプログラムを以下のように改良します。 (コメント部分の「*****」が追加した部分で、「++++」が変更した部分です)
- (IBAction)Button:(NSButton *)sender { NSOpenPanel *openPanel=[NSOpenPanel openPanel]; //許容ファイルの種類を設定 NSArray *allowedFileTypes=[NSArray arrayWithObjects:@"png",@"PNG",nil]; [openPanel setAllowedFileTypes:allowedFileTypes]; //ダイアローグを開く NSInteger pressButton=[openPanel runModal]; if(pressButton ==NSOKButton) { //OKボタンが押された場合 NSURL * filePath=[openPanel URL]; //パスを取得 NSString* fileName=[filePath path];//形式を変換 const char* path=[fileName UTF8String];//形式を変換 //画像を読み込む IplImage* image; IplImage* gray; //グレー画像用****************追加 image=cvLoadImage(path,CV_LOAD_IMAGE_ANYCOLOR); if(image==NULL) { //読み込めなかったら NSLog(@"Not Read"); //コンソールに表示 }else { //読み込めたら //grayをimageの大きさに合わせ、グレー用として使う***********追加 gray=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1); //imageをgrayへ変換する*********************************追加 cvCvtColor(image,gray,CV_BGR2GRAY); cvNamedWindow("window",1); //ウインドウを表示 cvShowImage("window",gray);//画像を表示++++++++++++変更 cvWaitKey(1000); //1秒待って cvReleaseImage(&gray); //メモリの開放***********変更 cvReleaseImage(&image); //メモリの開放 cvDestroyWindow("window"); //画像を消す } } }
解説
では、プログラムの変更部分を解説します。
まず、当たり前ですが、カラー用のメモリimageのようにグレー用のメモリを確保する必要があります。
それが
IplImage* gray;
です。でもこれでは、カラーなのかグレーなのかがわからないので、メモリ設定をする必要があります。 それが
gray=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);
で、cvGetSize(image)でimageと同じ大きさであるということをいっています。
そして、IPL_DEPTH_8Uで符号なし8bitグレースケールであることを指定します。
最後の1はチャネル数です。 最後に、カラーをグレーへ変換します。
cvCvtColor(image,gray,CV_BGR2GRAY);
これはimageが入力でgrayが出力として、グレーへ変換するという命令です。
最後のCV_BGR2GRAYは BGR(カラー) 2(to) GRAY(グレー) と分解すればわかりやすいです。
カラーからグレーへという意味です。 あとは画像を表示するだけです。
いかがだったでしょうか? 今回はグレーに変換しただけですが、グレーに変換すると画像処理がしやすくなります。
画像処理の基本なのでおさえておきましょう。
命令のまとめ
imageの縦横情報を出力します。数値で入力したい場合はcvSize(int,int)を使います。
size 画面の縦横を設定します。
depth 画素の深さを設定します。
IPL_DEPTH_8U – 符号無し 8 ビット整数
IPL_DEPTH_8S – 符号有り 8 ビット整数
IPL_DEPTH_16U – 符号無し 16 ビット整数
IPL_DEPTH_16S – 符号有り 16 ビット整数
IPL_DEPTH_32S – 符号有り 32 ビット整数
IPL_DEPTH_32F – 単精度浮動小数点数
IPL_DEPTH_64F – 倍精度浮動小数点数
となっています。状況におおじて設定しましょう。
channels チャンネル数です。グレースケールの場合は1です。
グレーとカラーを変換する関数です。
srcに入力画像メモリ、dstに出力画像メモリを設定します。 srcとdstは同じ幅と高さに設定している必要があります。
また、画像の深さも同じである必要があります。
codeにはどう変換したいかの情報をかきます。
著者:安井 真人(やすい まさと)
@yasui_masatoさんをフォロー