では、さっそく。
#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 件のコメント:
コメントを投稿