二値化処理

二値化

二値化の方法について解説します。

二値化とは、例えば1から255までの数字の列

23,145,27,98,1,255

があった際に、100以上か100以内かにわけるのが二値化です。

この場合は二値化すると 1,255,1,1,1,255 となります。

100以内のは1にして、100以上のは255になります。

 

これを画像の各画素でやるのが二値化処理です。

 

では解説をはじめます。

プログラムは基本的に前に作ったプログラムに付け加える形で行います。

プログラムを組む際は

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

を参考にしてください。

プログラムと解説

以下にプログラムを書いておきます。 長いですが前回のプログラムに一行付け加えただけです。 (*****追加の部分)


- (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);
            //二値化処理する
            cvThreshold(gray,gray,120,255,CV_THRESH_BINARY); //*******追加

            cvNamedWindow("window",1);  //ウインドウを表示
            cvShowImage("window",gray);//画像を表示
            cvWaitKey(1000);            //1秒待って
            cvReleaseImage(&gray);     //メモリの開放
            cvReleaseImage(&image);    //メモリの開放
            cvDestroyWindow("window");  //画像を消す
        }
    }
}

では解説します。

 

cvThreshold(gray,gray,120,255,CV_THRESH_BINARY);

これで、二値化を行なっています。

grayが2つあります。

前者が入力で後者が出力となります。

そして、120が閾値で、255が閾値を超えた場合の最大値となります。

この場合はもし120を超えたら255(白)になります。

CV_THRESH_BINARY は白か黒かどちらかにわけるという意味です。

 

実際に処理をすると次のようになります。

ちなみに、閾値を超えた際の最大値を130にすると

となります。白の部分(255)が暗く(130)なるんですね。

文法まとめ

cvThreshold(const cvArr* src,const cvArr* dst,double threshold,double max,int thre_type);

src,dst srcが入力画像で、dstが出力画像となります。

threshold 閾値です。

max 閾値を超えた際の値を設定します。

there_type 二値化するさいのタイプを入力します。

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