Page List

Search on the blog

2014年4月18日金曜日

OpenCV日記(3)画像に対する基本操作

 OpenCVで利用するデータの構造や用語について知らなかったので、公式ドキュメントのintroductionを読んだ。

 その後画像に対する基本処理の説明を一通り読んで、
  1. カラー画像をグレースケール画像に変換
  2. カラー画像の赤要素のチャンネルのみを抽出
を行うプログラムを書いてみた。画像の読込、表示、ファイル出力、ピクセル値の参照、ピクセル値の変更という基本的なことは出来るようになった。

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main (int argc, char** argv ) {
    Mat src = imread("img/lena.jpg");
    Mat dest;

    int height = src.size().height;
    int width = src.size().width;

    /// convert to gray scale
    cvtColor(src, dest, CV_BGR2GRAY);    // Now dest has 1 channel.

    namedWindow("gray", CV_WINDOW_AUTOSIZE);
    imshow("gray", dest);
    waitKey();

    imwrite("gray.jpg", dest);

    /// extract only red channel
    dest = src.clone();                  // Now dest has 3 channels.
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            dest.at<Vec3b>(y, x)[0] = 0;                       // blue
            dest.at<Vec3b>(y, x)[1] = 0;                       // green
            dest.at<Vec3b>(y, x)[2] = src.at<Vec3b>(y, x)[2];  // red
        }
    }

    namedWindow("red", CV_WINDOW_AUTOSIZE);
    imshow("red", dest);
    waitKey();

    imwrite("red.jpg", dest);

    return 0;
}

以下ファイル出力された画像。

まず元ネタ。


次にグレースケールに変換した画像。



最後の赤チャネルのみを抽出した画像。


0 件のコメント:

コメントを投稿