いわゆる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)。
0 件のコメント:
コメントを投稿