度回転させて,彩度を 1.0(最大値)としたのちに,RGB に変換した結果を出力せよ.元の画像で輝度 が低い部分で何が起きているのかを中心に,HSV 変換について考察せよ.
という、C++の課題なのですが、C++を全く授業でやったことがないのに画像処理の講義を取ったため、このプログラムが何をしているか全くわかりません。どなたか解説をお願いしたいです、よろしくお願いします。
#include "common.h"
cv::Mat change_param(cv::Mat_<cv::Vec3b> image)
{
cv::Mat_<cv::Vec3b> dst;
std::vector<cv::Mat> planes;
cv::cvtColor(image, dst, CV_BGR2HSV); //RGBからHSVに変換
cv::split(dst, planes); //3チャネルを分割して
cv::imshow("v", planes[2]); //HSVの3チャネル目であるplanes[2]を画面に表示
cv::waitKey();
cv::imwrite("v.jpg", planes[2]); //このコメントを外せばV画像を出力可
for (int i = 0; i < dst.rows; ++i)
{
for (int j = 0; j < dst.cols; ++j)
{
int tmp = dst(i, j)[0] -15;
if (tmp > 180) tmp -= 180; //HSVの色相Hに30度足す.
//ただし,Hは0から359が1から180にマッピングされていることに注意
//http://opencv.jp/opencv-2.1/cpp/miscellaneous_image_transformations.html
//のcv::cvtColorの項目を確認してください
dst(i, j)[0] = tmp;
dst(i, j)[1] = 255; //彩度Sを最大値にする.Hと同様に仕様を確認して適切な値に変更する
}
}
cv::cvtColor(dst, dst, CV_HSV2BGR); //RGBに戻す
return dst;
}
int main(int argc, char* argv[])
{
cv::Mat_<cv::Vec3b> image, out;
if (argc > 1)
{
image = cv::imread(argv[1]);
}
else {
image = cv::imread("C:¥¥opencv32¥¥sources¥¥samples¥¥data¥¥baboon.jpg");
}
cv::imshow("input", image);
cv::waitKey();
out=change_param(image);
cv::imshow("Change Hue ", out);
cv::waitKey();
return 0;
}