OpenCV C++の画像処理プログラミングについての質問です。 入力した画像をセピア風の画像に変換するプログラムを作成するという課題が出たのですが、
OpenCV C++の画像処理プログラミングについての質問です。 入力した画像をセピア風の画像に変換するプログラムを作成するという課題が出たのですが、 HSVの値をチャンネル別に調整する方法がわかりません。 検索して出てきたコードをそのまま入力してみても上手くいきませんでした。 (プログラミングに関しては超初心者です…) 以下に作成途中のコードを貼っておくので、 どなたか詳しい方がいれば、ご教授のほどよろしくお願いします。 //////////////////////////////////////////// #include <iostream> #include <opencv2/opencv.hpp> int main() { cv::Mat img = cv::imread("lenna_inpaint_ns.png"); cv::Mat hsv_img; cv::Mat bgr_img; img.copyTo(hsv_img); cv::cvtColor(img, hsv_img, cv::COLOR_BGR2HSV); //ここでHSV値の変更をしたい cv::cvtColor(hsv_img, bgr_img, cv::COLOR_HSV2BGR); imshow("lena", img); imshow("red_lena", hsv_img); imshow("red_lena", bgr_img); cv::waitKey(0); return 1; }
ベストアンサー
いろいろと方法はありますが、HSV で画像をセピア調にするには、H を 15 に、S を 153 に固定し、V にグレースケール化した元の画像をセットするとできるようです。 参考 : https://campkougaku.com/2020/03/16/sepia/ グレースケール化した画像が必要となりますが、以下のようにすればできるかと思います。 //ここでHSV値の変更をしたい cv::Mat gray; //グレースケール画像 cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); for (int y = 0; y < img.rows; ++y) { for (int x = 0; x < img.cols; ++x) { hsv_img.at<cv::Vec3b>(y, x)[0] = 15; //H hsv_img.at<cv::Vec3b>(y, x)[1] = 153; //S hsv_img.at<cv::Vec3b>(y, x)[2] = gray.at<uchar>(y, x); //V } } 他の部分は変更なしです。
質問者からのお礼コメント
ありがとうございました!
お礼日時:6/30 17:54