カラーをグレーへ変換する

グレースケール変換

カラーの画像を白黒の画像に変換する方法を紹介します。

以前に作ったプログラムを改良する形で進めていくので、自分でプログラムを作りたい場合はそちらを参考にしてください。

「選択した画像を表示するプログラム」

さっそくですが、以前に作ったプログラムを以下のように改良します。 (コメント部分の「*****」が追加した部分で、「++++」が変更した部分です)

- (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(グレー) と分解すればわかりやすいです。

カラーからグレーへという意味です。 あとは画像を表示するだけです。

いかがだったでしょうか? 今回はグレーに変換しただけですが、グレーに変換すると画像処理がしやすくなります。

画像処理の基本なのでおさえておきましょう。

命令のまとめ

cvSize cvGetSize(image)

imageの縦横情報を出力します。数値で入力したい場合はcvSize(int,int)を使います。

cvCreateImage(cvSize size,int depth,int channels);

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です。

cvCvtColor(const CvArr* src,const CvArr* dst,int code);

グレーとカラーを変換する関数です。

srcに入力画像メモリ、dstに出力画像メモリを設定します。 srcとdstは同じ幅と高さに設定している必要があります。

また、画像の深さも同じである必要があります。

codeにはどう変換したいかの情報をかきます。

著者:安井 真人(やすい まさと)