2007年2月6日

OpenCV第4回 閾値処理

いわゆる2値化処理。閾値以上の画素かそれ以外かを2つの値で分ける処理。
では、さっそく。


#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

// argv[1] 入力ファイル名
// argv[2] 閾値
int main( int argc, char** argv )
{
if (argc <= 2)
return 0;
//------------------------------
// 画像読込み
//------------------------------
IplImage* image_load = cvLoadImage(argv[1]);

//------------------------------
// 色変換
//------------------------------
IplImage* image_gray = cvCreateImage
(cvSize(image_load->width, image_load->height)
, IPL_DEPTH_8U, 1);
cvCvtColor(image_load, image_gray, CV_BGR2GRAY);

// 閾値取得
int th = atoi(argv[2]);

//------------------------------
// 閾値処理
//------------------------------
IplImage* image_bin = cvCloneImage(image_gray);
cvThreshold(image_gray, image_bin, th, 255, CV_THRESH_BINARY);


//------------------------------
// 画像表示
//------------------------------
// 読込み画像表示
cvNamedWindow(argv[1], 0);
cvShowImage(argv[1], image_load);
// グレー画像表示
cvNamedWindow("Gray", 0);
cvShowImage("Gray", image_gray);
// 閾値処理画像表示
cvNamedWindow("Threshold", 0);
cvShowImage("Threshold", image_bin);


cvWaitKey();


cvDestroyWindow(argv[1]);
cvDestroyWindow("Gray");
cvDestroyWindow("Threshold");
cvReleaseImage(&image_load);
cvReleaseImage(&image_gray);
cvReleaseImage(&image_bin);
return 0;
}


引数で入力ファイル名と閾値を指定してあげる。
cvCvtColor
は、色変換。指定して画像が、カラー画像の場合にグレー画像に変換してあげる。いろいろな色に変換できるようです。ここでは、BGR(カラー画像の場合は青緑赤の順番みたい)からグレースケールに変換してます。本来、色をみて変化する必要があると思います。
cvThreshold
で2値化処理。引数は、cvThreshold(元画像、処理画像、閾値、max値、変換方法)。
変換方法は、ヘルプを見ると、

CV_THRESH_BINARY : 閾値より上はmax値,それ以外は0。
CV_THRESH_BINARY_INV : CV_THRESH_BINARYの逆で、閾値より上は0,それ以外はmax値。
CV_THRESH_TRUNC : 閾値より上は閾値,それ以外は元画素。
CV_THRESH_TOZERO : 閾値より上は元画素,それ以外は0。
CV_THRESH_TOZERO_INV : CV_THRESH_TOZEROと逆で、閾値より上は0,それ以外は元の画素。


実行結果を表示。OpenCVのサンプル画像を使ってます。

左から、元画像、グレースケール変換画像、閾値処理画像(閾値128)。

ブログランキング ドット ネット 人気blogランキングへ にほんブログ村 IT技術ブログへ

0 件のコメント: