opencv + c++でセピア調変換

c++でのセピア調変換のコードが出てこなかったので。。。

環境

macOS Big Sur 11.2.3
Apple 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変換をして元に戻しています。
f:id:shinter8823:20210704101030p:plain

参考:
Pythonでちょっと真面目に趣あるセピア調写真を作る。 | キャンプ工学
セピア - Wikipedia