2-1. 上記のソースコードでは,全ての画素を赤チャンネルのみに変換した.次に,ある一領域のみ(例:(Xmin, Ymin) = (100, 120), (Xmax, Ymax) = (250, 300))を赤チャンネルのみに,それ以外を青チャンネルのみに変換するプログラムを作成しよう.
解答例-1
//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++) {
if (100 <= x && x <= 250 && 120 <= y && y <= 300) { // 青字新規
//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;
}
else {
//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;
}
解答例-2
青領域と赤領域を長方形で順に作る。
//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 < 120; 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;
}
}
for (int y = 120; y < 301; y++) {
for (int x = 0; x < 100; 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;
}
}
for (int y = 120; y < 301; y++) {
for (int x = 251; 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;
}
}
for (int y = 301; 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;
}
}
for (int y = 120; y < 301; y++) {
for (int x = 100; x < 251; 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;
}