ピクセル単位の処理を行う.アルゴリズムは下記となる.
実行結果は下記.
//02AccessPixels.cpp
#include <iostream>
#include <opencv2/opencv.hpp>
int main() {
//画像を読み込む
cv::Mat img = cv::imread("lenna_inpaint_ns.png");
cv::Mat red_img;
//imgの内容をred_imgにコピー
img.copyTo(red_img);
for (int y = 0; y < red_img.rows; y++){
for (int x = 0; x < red_img.cols; x++) {
//Blueを0
red_img.ptr<uchar>(y)[3 * x] = 0;
//Greenを0
red_img.ptr<uchar>(y)[3 * x + 1] = 0;
//Red
//red_img.ptr<uchar>(y)[3*x+2] = 0;
}
}
imshow("lena", img);
imshow("red_lena", red_img);
cv::waitKey(0);
return 1;
}
主な関数の説明
void Mat::copyTo(Mat& m ) const void Mat::copyTo( Mat& m, const Mat& mask)
行列を別の行列にコピーする
uchar* Mat::ptr(int i=0)
行列の指定された行へのポインタを返す
void imshow(const string& winname, const Mat& image)
指定したウィンドウ内に画像を表示する
int waitKey(int delay=0)
キーが押されるまで待機する
以下の2題に取り組みなさい。
1.上記のソースコードでは,全ての画素を赤チャンネルのみに変換した.次に,ある一領域のみ(例:(Xmin, Ymin) = (100, 120), (Xmax, Ymax) = (250, 300))を赤チャンネルのみに,それ以外を青チャンネルのみに変換するプログラムを作成しよう.
2.入力した画像をセピア風の画像に変換するプログラムを作成しよう。考えられるアルゴリズムは以下となる.