opencv + c++でセピア調変換
c++でのセピア調変換のコードが出てこなかったので。。。
環境
macOS Big Sur 11.2.3Apple clang version 12.0.0
opencvインストール
筆者はmacなので以下macでの方法です。$ brew install opencv
opencvをインクルードしてビルド
ディレクトリ構成
├── sample.cpp├── CMakeLists.txt
├── lenna.jpeg
└── build/
準備
以下のようなcppファイルを用意。opencv2/opencv.hppをインクルードすると全てのopencvのライブラリをインクルードしていることになる。#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { return 0; }
IDEでならもっと簡単に環境構築できるかもしれないが、筆者は差し当たりコマンドラインで実行できるようにした。
cmakeのためのbuildディレクトリを作成。
$ mkdir build
いつも通りg++でcppファイルをコンパイルしようとすると'opencv2/opencv.hpp' file not foundのようなエラーが出るので、cmake経由でビルドする。
$ cd build $ cmake .. . $ make $ cd .. $ ./build/main
参考:
MacにOpenCV(C++)環境を構築する - Qiita
セピア調変換
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat img = imread("lenna.jpeg"); // 画像の読み込み Mat hsv_img, sepia_img; cvtColor(img, hsv_img, COLOR_BGR2HSV, 3); // RGBからHSVに変換 for (int y = 0; y < hsv_img.rows; y++) { for (int x = 0; x < hsv_img.cols; x++) { hsv_img.ptr<uchar>(y)[3*x] = 29; // 色相(H)変更 hsv_img.ptr<uchar>(y)[3*x + 1] = 153; // 彩度(S)変更 } } cvtColor(hsv_img, sepia_img, COLOR_HSV2BGR, 3); // HSVからRGBに変換 imshow("lenna", img); // 画像の表示 imshow("sepia_lenna", sepia_img); // 画像の表示 waitKey(0); // 実行を終了しない return 0; }
RGB→HSV変換をすると、画像の多次元行列のRの部分にH、Gの部分にS、Bの部分にVが入るようになります。
確かにwikiによればセピアとはHSV(29°, 60%, 42%)なので、Hは29°、Sは256 × 60% = 153を代入すると画像がセピア調になります。
画像を表示する際には再びHSV→RGB変換をして元に戻しています。