タイトル: RGB カラー表現から HSV カラー表現に変換します。
国際標準のテスト画像 Lena を使用しています。
H(色相)色度:赤、青、緑など、通常呼ばれる色の名前です。色相と値は次の表に対応しています。
赤 | 黄色 | 緑 | 緑 | 青 | 赤紫色 | 赤 |
---|---|---|---|---|---|---|
0°0\度0° | 60 ° 60\度60° | 120 ° 120\度120° | 180° 180\度180° | 240 ° 240\度240° | 300 ° 300\度300° | 360° 360\度360° |
S (彩度) 彩度: 色の純度を表し、彩度が低いほど色が濃くなります。0 ≤ S ≤ 1 0\le S\le10≤S≤1 .
V(明度) 明るさ:色の明暗を表す 座標の原点の値を0、円錐の頂点の値を1 RGBでは3つの値で色が
決まるたとえば、黄色は (255,255 ,0) です。HSV では、黄色は色相 = 60 という 1 つの値によってのみ決定されます。
HSV 表色系は RGB 表色系に変換でき、変換式は次のとおりです。
- RGB カラー システムから HSV カラー システムへ
RGB を HSV カラー システムに変換する前に、R、G、B の 3 つのチャネルを 0-1 に正規化する必要があります。
V = 最大 ( R 、 G 、 B ) V = 最大 (R、G、B)Ⅴ=最大x ( R ,G 、B )
S = { [ V − min ( R , G , B ) ] / VV > 0 0 V = 0 S = \begin{cases} \lbrack V-min(R,G,B)\rbrack/V & V >0 \\ 0 &V=0 \end{ケース}S={ [ V−分( R ,G 、B )] / V0Ⅴ>0Ⅴ=0
H = { 60 ( G − B ) / SVV = R 60 [ 2 + ( B − R ) / SV ] V = G 60 [ 4 + ( R − G ) / SV ] V = B 0 V = 0 H + 360 H < 0 H = \begin{cases} 60(GB)/SV & V=R \\ 60\lbrack 2+(BR)/SV\rbrack & V=G\\ 60\lbrack 4+(RG)/SV \rbrack & V=B\\ 0 & V=0 \\ H+360 &H<0 \end{cases}H=⎩ ⎨ ⎧60 (ガ−B ) / S V60 [ 2+( B−R ) / S V ]60 [ 4+( R−G ) / S V ]0H+360Ⅴ=RⅤ=GⅤ=BⅤ=0H<0 - HSV カラー システムを RGB カラー システムに変換する式は次のとおりです。
0 < H ≤ 60 { R = VB = R − S ⋅ VG = S ⋅ V ⋅ H / 60 + B 0<H\le60 \begin{cases} R= V & \\ B=RS\cdot V \\ G=S\cdot V \\cdot H/60+B \end{cases}0<H≤60⎩ ⎨ ⎧R=ⅤB=R−S⋅ⅤG=S⋅Ⅴ⋅H /60+B
300 < H ≤ 360 { R = VB = R − S ⋅ VG = G − S ⋅ V ⋅ ( H − 360 ) / 60 300<H\le360 \begin{cases} R=V & \\ B=RS\cdot V \\ G=GS \cdot V\cdot(H-360)/60 \end{cases}300<H≤360⎩ ⎨ ⎧R=ⅤB=R−S⋅ⅤG=G−S⋅Ⅴ⋅( H−360 ) / 60
60 < H ≤ 120 { G = VB = G − S ⋅ VR = B − S ⋅ V ⋅ ( H − 120 ) / 60 60<H\le120 \begin{cases} G=V & \\ B=GS\cdot V \\ R=BS \cdot V\cdot(H-120)/60 \end{cases}60<H≤120⎩ ⎨ ⎧G=ⅤB=G−S⋅ⅤR=B−S⋅Ⅴ⋅( H−120 ) / 60
120 < H ≤ 180 { G = VR = G − S ⋅ VB = R + S ⋅ V ⋅ ( H − 120 ) / 60 120<H\le180 \begin{cases} G=V & \\ R=GS\cdot V \\ B=R+S \cdot V\cdot(H-120)/60 \end{cases}120<H≤180⎩ ⎨ ⎧G=ⅤR=G−S⋅ⅤB=R+S⋅Ⅴ⋅( H−120 ) / 60
180 < H ≤ 240 { B = VR = B − S ⋅ VG = R − S ⋅ V ⋅ ( H − 240 ) / 60 180<H\le240 \begin{cases} B=V & \\ R=BS\cdot V \\ G=RS \cdot V\cdot(H-240)/60 \end{cases}180<H≤240⎩ ⎨ ⎧B=ⅤR=B−S⋅ⅤG=R−S⋅Ⅴ⋅( H−240 ) / 60
240 < H ≤ 360 { B = VG = B − S ⋅ VR = G + S ⋅ V ⋅ ( H − 240 ) / 60 240<H\le360 \begin{cases} B=V & \\ G=BS\cdot V \\ R=G+S \cdot V\cdot(H-240)/60 \end{cases}240<H≤360⎩ ⎨ ⎧B=ⅤG=B−S⋅ⅤR=G+S⋅Ⅴ⋅( H−240 ) / 60
RGB 色空間の 3 つの色のさまざまな組み合わせによって、他のほとんどすべての色を形成できます。色は 3 つの色成分の線形結合で表されます. どの色もこの 3 つの成分に関連しており、これらの 3 つの成分は高い相関関係にあるため、色を連続的に変更することは直感的ではありません.イメージ、変更する必要があります。これらの 3 つのコンポーネントで十分です。
ただし、これら 3 つの色成分に対する人間の目の感度は異なります。モノクロでは、人間の目は赤に対して最も感度が低く、青に対して最も感度が高くなります。したがって、RGB 色空間は均一性の低い色空間です。特定の色について、より正確な 3 成分の数値表現を推測することは困難です。したがって、RGB 色空間はディスプレイ システムには適していますが、画像処理には適していません。
C++ コードは次のとおりです。
cv::Mat RGB2HSV(cv::Mat img)
{
cv::Mat hsv(img.size(), CV_32FC3);
float r=0.0, g=0.0, b = 0.0;
float _max = 0.0, _min = 0.0;
float h = 0.0, s = 0.0, v = 0.0;
for (int row = 0; row < img.rows; row++)
{
cv::Vec3b *currentData = img.ptr<cv::Vec3b>(row);
for (int col = 0; col < img.cols; col++)
{
r = (*(currentData + col))[2] / 255;
g = (*(currentData + col))[1] / 255;
b = (*(currentData + col))[0] / 255;
_max = max(r, max(g, b));
_min = min(r, min(g, b));
v = _max;
if (v == 0)
{
s = 0;
}
else
{
s = (v - _min) / v;
}
if (v == r)
{
h = 60 * (g - b) / (s*v);
}
else if (v == g)
{
h = 60 * (2 + (b - r) / (s*v));
}
else if (v == b)
{
h = 60 * (4 + (r - g) / (s*v));
}
else if (v == 0)
{
h = 0;
}
else
{
h = h + 360;
}
hsv.at<cv::Vec3f>(row, col)[0] = h;
hsv.at<cv::Vec3f>(row, col)[1] = s;
hsv.at<cv::Vec3f>(row, col)[2] = v;
}
}
return hsv;
}
参考ブログ:https://blog.csdn.net/jinking01/article/details/120224251
https://zh.wikipedia.org/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD% A9%E7%A9%BA%E9%97%B4