C++とOpenCVで色空間を変換する方法!cvtColor()関数の使い方を解説
色空間とは
色空間(Color Space)とは、色を表現するためのモデルのことです。色の記述方法にはさまざまな種類があり、代表的なものとしてRGB、CMYK、HSV、グレースケールなどが挙げられます。
imgproc.hppヘッダーについて
本記事では、「imgproc.hpp」というヘッダーを使用します。この名前は「Image Processing(画像処理)」の略です。OpenCVで色空間を変換するには、「cvtColor()」関数を使用する必要があります。この関数は「imgproc」ヘッダーファイル内で定義されているため、あらかじめ「imgproc.hpp」をインクルードしておきましょう。
cvtColor()関数の基本的な使い方
まず、画像の読み込みと表示のために、2つのMat(行列)と2つのウィンドウを宣言します。続いて、「cat.jpg」という画像を「myImage」行列に読み込みます。その後、次のコードを実行します。
cvtColor(myImage, myImage_Converted, COLOR_RGB2GRAY)
この1行で、「myImage」のRGB色空間がグレースケールに変換され、結果が「myImage_Converted」行列に格納されます。
「cvtColor()」関数の基本構文は以下の通りです。
cvtColor(ソース行列, 変換先行列, 色空間変換コード)
このプログラムでは、ソース行列が「myImage」、変換先行列が「myImage_Converted」、色空間変換コードが「COLOR_RGB2GRAY」に相当します。
サンプルプログラム
以下のプログラムは、OpenCVを使ってRGB画像をグレースケール画像に変換する例です。
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main(int argc, const char** argv) {
Mat myImage;//画像を読み込むための行列を宣言//
Mat myImage_Converted;//変換後の画像を格納する行列を宣言//
namedWindow("Actual_Image");//元の画像を表示するウィンドウを宣言//
namedWindow("Converted_Image");//変換後の画像を表示するウィンドウを宣言//
myImage = imread("cat.jpg");//myImage行列に画像を読み込む//
cvtColor(myImage,myImage_Converted, COLOR_RGB2GRAY);//RGBからグレースケールへ変換//
imshow("Actual_Image",myImage);//元の画像を表示//
imshow("Converted_Image",myImage_Converted);//変換後の画像を表示//
waitKey(0);//キー入力を待機//
destroyAllWindows();//すべてのウィンドウを閉じる//
return 0;
}
実行結果

その他の主な色空間変換コード
「cvtColor()」関数では、第3引数の変換コードを変更するだけで、さまざまな色空間への変換が可能です。よく使われる変換コードの例は以下の通りです。
- COLOR_BGR2GRAY:BGRからグレースケールへ変換
- COLOR_BGR2HSV:BGRからHSVへ変換
- COLOR_GRAY2BGR:グレースケールからBGRへ変換
- COLOR_BGR2YCrCb:BGRからYCrCbへ変換
なお、OpenCVではimread()で画像を読み込む際、チャンネルの並びがBGR順になる点に注意してください。そのため、実務ではCOLOR_BGR2GRAYが使用されることも多くあります。
-
C++とOpenCVでバイナリ画像(二値画像)を作成する方法を解説
バイナリ画像(二値画像)とは、黒と白の2色のみで表現されるデジタル画像のことです。画像処理の観点から見ると、バイナリ画像は「0」と「1」という2つの値しか持たないピクセルで構成されています。ピクセルの値が0の場合は純粋な黒を、値が1の場合は純粋な白を表します。グレースケール画像では、各ピクセルが256段階の異なる値を持つのに対し、バイナリ画像では2つの値しか存在しません。このシンプルさゆえに、バイナリ画像はさまざまな用途で活用されています。例えば、モルフォロジー変換(形態学的処理)ではバイナリ画像が必要であり、背景から物体の形状を抽出する処理にもバイナリ画像が用いられます。OpenCVを使用す
-
Javaで画像をネガティブ(反転)に変換する方法|アルゴリズムと実装コードをわかりやすく解説
画像をネガティブに変換するアルゴリズムカラー画像をネガティブ(階調反転)画像に変換する仕組みは非常にシンプルです。基本となる手順は以下の4ステップです。各ピクセルの赤(R)・緑(G)・青(B)の値を取得するそれぞれの色の値を255から引き算し、新しい色の値として保存する変更後の3つの色の値から、新しいピクセル値を生成するその新しい値を元のピクセルに設定するこの「255からの減算」により、明るい部分は暗く、暗い部分は明るくなり、写真のネガフィルムのような反転画像が完成します。Javaによる実装手順Javaでは、標準ライブラリの ImageIO クラスや Color クラスを利用することで、Ope