OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
色変換

cv::cvtColorおよびcv::ColorConversionCodesを参照

TODOTodo
その他の変換モードについて記載する

RGB <-> GRAY

アルファチャンネルの追加・削除、チャンネル順序の反転、16ビットRGBカラー(R5:G6:B5 または R5:G5:B5)との相互変換といったRGB空間内での変換、および以下を用いたグレースケールとの相互変換が行える。

\[\text{RGB[A] to Gray:} \quad Y \leftarrow 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot B\]

および

\[\text{Gray to RGB[A]:} \quad R \leftarrow Y, G \leftarrow Y, B \leftarrow Y, A \leftarrow \max (ChannelRange)\]

RGB画像からグレーへの変換は次のように行う。

cvtColor(src, bwsrc, cv::COLOR_RGB2GRAY);

より高度なチャンネルの並べ替えはcv::mixChannelsでも行える。

参照
cv::COLOR_BGR2GRAY, cv::COLOR_RGB2GRAY, cv::COLOR_GRAY2BGR, cv::COLOR_GRAY2RGB

RGB <-> CIE XYZ.Rec 709(D65白色点)

\[\begin{bmatrix} X \\ Y \\ Z \end{bmatrix} \leftarrow \begin{bmatrix} 0.412453 & 0.357580 & 0.180423 \\ 0.212671 & 0.715160 & 0.072169 \\ 0.019334 & 0.119193 & 0.950227 \end{bmatrix} \cdot \begin{bmatrix} R \\ G \\ B \end{bmatrix}\]

\[\begin{bmatrix} R \\ G \\ B \end{bmatrix} \leftarrow \begin{bmatrix} 3.240479 & -1.53715 & -0.498535 \\ -0.969256 & 1.875991 & 0.041556 \\ 0.055648 & -0.204043 & 1.057311 \end{bmatrix} \cdot \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}\]

\(X\)、\(Y\)、\(Z\)は値域全体をカバーする(浮動小数点画像の場合、\(Z\)は1を超えることがある)。

参照
cv::COLOR_BGR2XYZ, cv::COLOR_RGB2XYZ, cv::COLOR_XYZ2BGR, cv::COLOR_XYZ2RGB

RGB <-> YCrCb JPEG(YCCとも)

\[Y \leftarrow 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot B\]

\[Cr \leftarrow (R-Y) \cdot 0.713 + delta\]

\[Cb \leftarrow (B-Y) \cdot 0.564 + delta\]

\[R \leftarrow Y + 1.403 \cdot (Cr - delta)\]

\[G \leftarrow Y - 0.714 \cdot (Cr - delta) - 0.344 \cdot (Cb - delta)\]

\[B \leftarrow Y + 1.773 \cdot (Cb - delta)\]

ここで

\[delta = \left \{ \begin{array}{l l} 128 & \mbox{for 8-bit images} \\ 32768 & \mbox{for 16-bit images} \\ 0.5 & \mbox{for floating-point images} \end{array} \right .\]

Y、Cr、Cbは値域全体をカバーする。

参照
cv::COLOR_BGR2YCrCb, cv::COLOR_RGB2YCrCb, cv::COLOR_YCrCb2BGR, cv::COLOR_YCrCb2RGB

RGB <-> YUV(サブサンプリングあり)

8ビット値のみサポートされる。係数はBT.601規格に対応し、結果の値はY [16, 235]、UおよびV [16, 240]で128を中心とする。

2つのサブサンプリング方式がサポートされる: 4:2:0 (Fourccコード NV12, NV21, YV12, I420 およびその同義語)と4:2:2 (Fourccコード UYVY, YUY2, YVYU およびその同義語)。

どちらのサブサンプリング方式でもY値は各ピクセルごとに書き込まれるため、Yプレーンは実質的に元画像をスケーリングしバイアスをかけたグレー版となる。

4:2:0方式では、UおよびV値が2x2の正方形ごとに平均化される。すなわち4ピクセルごとに1つのU値と1つのV値だけが保存される。UおよびV値はインターリーブされて別個のプレーンに(NV12, NV21)、あるいは2つの別個のセミプレーンに(YV12, I420)保存される。

4:2:2方式では、U値とV値はピクセルのペアごとに水平方向に平均化される。つまり、2ピクセルにつきU値1つとV値1つのみが保存される。U値とV値は、Fourccコードに従って両ピクセルのY値とインターリーブして保存される。

速度や互換性の都合により、変換ごとに異なる精度で処理が行われる点に注意。たとえばRGBからYUV 4:2:2への変換は14ビット固定小数点演算を用いるが、他の変換は20ビットを用いる。

\[R \leftarrow 1.164 \cdot (Y - 16) + 1.596 \cdot (V - 128)\]

\[G \leftarrow 1.164 \cdot (Y - 16) - 0.813 \cdot (V - 128) - 0.391 \cdot (U - 128)\]

\[B \leftarrow 1.164 \cdot (Y - 16) + 2.018 \cdot (U - 128)\]

\[Y \leftarrow (R \cdot 0.299 + G \cdot 0.587 + B \cdot 0.114) \cdot \frac{236 - 16}{256} + 16 \]

\[U \leftarrow -0.148 \cdot R_{avg} - 0.291 \cdot G_{avg} + 0.439 \cdot B_{avg} + 128 \]

\[V \leftarrow 0.439 \cdot R_{avg} - 0.368 \cdot G_{avg} - 0.071 \cdot B_{avg} + 128 \]

参照
cv::COLOR_YUV2RGB_NV12, cv::COLOR_YUV2RGBA_YUY2, cv::COLOR_BGR2YUV_YV12 などが該当する

RGB <-> HSV

8ビットおよび16ビット画像の場合、R、G、Bは浮動小数点形式に変換され、0から1の範囲に収まるようスケーリングされる。

\[V \leftarrow max(R,G,B)\]

\[S \leftarrow \fork{\frac{V-min(R,G,B)}{V}}{if \(V \neq 0\)}{0}{otherwise}\]

\[H \leftarrow \forkfour{{60(G - B)}/{(V-min(R,G,B))}}{if \(V=R\)} {{120+60(B - R)}/{(V-min(R,G,B))}}{if \(V=G\)} {{240+60(R - G)}/{(V-min(R,G,B))}}{if \(V=B\)} {0}{if \(R=G=B\)}\]

\(H<0\) の場合は \(H \leftarrow H+360\) とする。出力時には \(0 \leq V \leq 1\)、\(0 \leq S \leq 1\)、\(0 \leq H \leq 360\) となる。

続いて、これらの値は出力先のデータ型に変換される。

  • 8ビット画像: \(V \leftarrow 255 V, S \leftarrow 255 S, H \leftarrow H/2 \text{(to fit to 0 to 255)}\)
  • 16ビット画像: (現在サポートされていない) \(V \leftarrow 65535 V, S \leftarrow 65535 S, H \leftarrow H\)
  • 32ビット画像: H、S、Vはそのまま保持される
参照
cv::COLOR_BGR2HSV, cv::COLOR_RGB2HSV, cv::COLOR_HSV2BGR, cv::COLOR_HSV2RGB

RGB <-> HLS

8ビットおよび16ビット画像の場合、R、G、Bは浮動小数点形式に変換され、0から1の範囲に収まるようスケーリングされる。

\[V_{max} \leftarrow {max}(R,G,B)\]

\[V_{min} \leftarrow {min}(R,G,B)\]

\[L \leftarrow \frac{V_{max} + V_{min}}{2}\]

\[S \leftarrow \fork { \frac{V_{max} - V_{min}}{V_{max} + V_{min}} }{if \(L < 0.5\) } { \frac{V_{max} - V_{min}}{2 - (V_{max} + V_{min})} }{if \(L \ge 0.5\) }\]

\[H \leftarrow \forkfour {{60(G - B)}/{(V_{max}-V_{min})}}{if \(V_{max}=R\) } {{120+60(B - R)}/{(V_{max}-V_{min})}}{if \(V_{max}=G\) } {{240+60(R - G)}/{(V_{max}-V_{min})}}{if \(V_{max}=B\) } {0}{if \(R=G=B\) }\]

\(H<0\) の場合は \(H \leftarrow H+360\) とする。出力時には \(0 \leq L \leq 1\)、\(0 \leq S \leq 1\)、\(0 \leq H \leq 360\) となる。

続いて、これらの値は出力先のデータ型に変換される。

  • 8ビット画像: \(V \leftarrow 255 \cdot V, S \leftarrow 255 \cdot S, H \leftarrow H/2 \; \text{(to fit to 0 to 255)}\)
  • 16ビット画像: (現在サポートされていない) \(V \leftarrow 65535 \cdot V, S \leftarrow 65535 \cdot S, H \leftarrow H\)
  • 32ビット画像: H、S、Vはそのまま保持される
参照
cv::COLOR_BGR2HLS, cv::COLOR_RGB2HLS, cv::COLOR_HLS2BGR, cv::COLOR_HLS2RGB

RGB <-> CIE L*a*b*

8ビットおよび16ビット画像の場合、R、G、Bは浮動小数点形式に変換され、0から1の範囲に収まるようスケーリングされる。

\[\vecthree{X}{Y}{Z} \leftarrow \vecthreethree{0.412453}{0.357580}{0.180423}{0.212671}{0.715160}{0.072169}{0.019334}{0.119193}{0.950227} \cdot \vecthree{R}{G}{B}\]

\[X \leftarrow X/X_n, \text{where} X_n = 0.950456\]

\[Z \leftarrow Z/Z_n, \text{where} Z_n = 1.088754\]

\[L \leftarrow \fork{116*Y^{1/3}-16}{for \(Y>0.008856\)}{903.3*Y}{for \(Y \le 0.008856\)}\]

\[a \leftarrow 500 (f(X)-f(Y)) + delta\]

\[b \leftarrow 200 (f(Y)-f(Z)) + delta\]

ここで

\[f(t)= \fork{t^{1/3}}{for \(t>0.008856\)}{7.787 t+16/116}{for \(t\leq 0.008856\)}\]

および

\[delta = \fork{128}{for 8-bit images}{0}{for floating-point images}\]

この出力は \(0 \leq L \leq 100\)、\(-127 \leq a \leq 127\)、\(-127 \leq b \leq 127\) となる。続いて、これらの値は出力先のデータ型に変換される。

  • 8ビット画像: \(L \leftarrow L*255/100, \; a \leftarrow a + 128, \; b \leftarrow b + 128\)
  • 16ビット画像: (現在サポートされていない)
  • 32ビット画像: L、a、bはそのまま保持される
参照
cv::COLOR_BGR2Lab, cv::COLOR_RGB2Lab, cv::COLOR_Lab2BGR, cv::COLOR_Lab2RGB

RGB <-> CIE L*u*v*

8ビットおよび16ビット画像の場合、R、G、Bは浮動小数点形式に変換され、0から1の範囲に収まるようスケーリングされる。

\[\vecthree{X}{Y}{Z} \leftarrow \vecthreethree{0.412453}{0.357580}{0.180423}{0.212671}{0.715160}{0.072169}{0.019334}{0.119193}{0.950227} \cdot \vecthree{R}{G}{B}\]

\[L \leftarrow \fork{116*Y^{1/3} - 16}{for \(Y>0.008856\)}{903.3 Y}{for \(Y\leq 0.008856\)}\]

\[u' \leftarrow 4*X/(X + 15*Y + 3 Z)\]

\[v' \leftarrow 9*Y/(X + 15*Y + 3 Z)\]

\[u \leftarrow 13*L*(u' - u_n) \quad \text{where} \quad u_n=0.19793943\]

\[v \leftarrow 13*L*(v' - v_n) \quad \text{where} \quad v_n=0.46831096\]

この出力は \(0 \leq L \leq 100\)、\(-134 \leq u \leq 220\)、\(-140 \leq v \leq 122\) となる。

続いて、これらの値は出力先のデータ型に変換される。

  • 8ビット画像: \(L \leftarrow 255/100 L, \; u \leftarrow 255/354 (u + 134), \; v \leftarrow 255/262 (v + 140)\)
  • 16ビット画像: (現在サポートされていない)
  • 32ビット画像: L、u、vはそのまま保持される

整数値のLuv画像をRGBに変換する際、中間値であるX、Y、Zの値はホワイトポイントの制約に収めるため \( [0, 2] \) の範囲に切り詰められる点に注意。これにより、特異なXYZ値を持つ色が正しく表現されない場合がある。

RGBと各種色空間との間で変換する上記の式は、ウェブ上の複数の情報源、主にCharles Poyntonのサイト http://www.poynton.com/ColorFAQ.html から引用したものである。

参照
cv::COLOR_BGR2Luv, cv::COLOR_RGB2Luv, cv::COLOR_Luv2BGR, cv::COLOR_Luv2RGB

Bayer -> RGB

Bayerパターンは、CCDおよびCMOSカメラで広く用いられている。これにより、R、G、Bのピクセル(特定の成分のセンサ)が次のようにインターリーブされた単一プレーンからカラー画像を得ることができる。

Bayer patterns (BGGR, GBRG, GRBG, RGGB)

ピクセルの出力RGB成分は、同じ色を持つ1個、2個、または4個の近傍ピクセルから補間される。

覚え書き
OpenCVのBayerパターン命名と古典的なBayerパターン命名の対応については、以下を参照のこと。
Bayer pattern

上記のパターンには、パターンを1ピクセル左へ、または1ピクセル上へずらすことで得られるいくつかの変種がある。変換定数 CV_Bayer \(C_1 C_2\) 2BGR および CV_Bayer \(C_1 C_2\) 2RGB に含まれる2つの文字 \(C_1\) と \(C_2\) は、具体的なパターンの種類を示す。これらはそれぞれ2行目の2列目および3列目の成分である。たとえば上記のパターンは、非常に一般的な「BG」型である。

参照
cv::COLOR_BayerRGGB2BGR, cv::COLOR_BayerGRBG2BGR, cv::COLOR_BayerBGGR2BGR, cv::COLOR_BayerGBRG2BGR, cv::COLOR_BayerRGGB2RGB, cv::COLOR_BayerGRBG2RGB, cv::COLOR_BayerBGGR2RGB, cv::COLOR_BayerGBRG2RGB cv::COLOR_BayerBG2BGR, cv::COLOR_BayerGB2BGR, cv::COLOR_BayerRG2BGR, cv::COLOR_BayerGR2BGR, cv::COLOR_BayerBG2RGB, cv::COLOR_BayerGB2RGB, cv::COLOR_BayerRG2RGB, cv::COLOR_BayerGR2RGB