記事ディレクトリ
画像の前処理
コンピューター ビジョン画像の前処理とは、その後の画像処理と分析を容易にするために、画像処理の前に画像を一連の処理と変換することを指します。その主な目的は、可能な限り有用な情報を保持しながら、コンピュータによる画像の認識、処理、分析を可能にすることです。
今日は主に色空間変換について説明しますが、その他については、画像強調アルゴリズムと鮮明化アルゴリズムで説明します。
色空間変換
色空間変換とは、画像の表現をある色空間から別の色空間に変換するプロセスを指します。一般的な色空間には、RGB、HSV、CMYK などが含まれます。一般的な色空間変換方法をいくつか示します。
RGBからHSVへの変換
RGB カラー スペースには、赤、緑、青の 3 つのコンポーネントが含まれますが、HSV カラー スペースには、色相 (Hue)、彩度 (Saturation)、および値 (Value) の 3 つのコンポーネントが含まれます。変換方法は以下のとおりです。
- 最大値と最小値を計算します: max_val = max(R, G, B)、min_val = min(R, G, B)。
- 色相を計算する:
如果max_val = min_val,则Hue = 0(定义为红色)
如果max_val = R,则Hue = (G - B) / (max_val - min_val)
如果max_val = G,则Hue = 2 + (B - R) / (max_val - min_val)
如果max_val = B,则Hue = 4 + (R - G) / (max_val - min_val)
- 彩度を計算します。
如果max_val = 0,则Saturation = 0
否则,Saturation = (max_val - min_val) / max_val
-
計算値(Value): Value = max_val
-
Pythonの実装
def rgb_to_hsv(r, g, b):
r, g, b = r / 255.0, g / 255.0, b / 255.0
max_val = max(r, g, b)
min_val = min(r, g, b)
hue, saturation, value = 0, 0, 0
# 计算色调
if max_val == min_val:
hue = 0
elif max_val == r:
hue = 60 * (0 + (g - b) / (max_val - min_val))
elif max_val == g:
hue = 60 * (2 + (b - r) / (max_val - min_val))
elif max_val == b:
hue = 60 * (4 + (r - g) / (max_val - min_val))
# 计算饱和度
if max_val != 0:
saturation = (max_val - min_val) / max_val
# 计算值
value = max_val
- C++の実装
void RGBtoHSV(int r, int g, int b, double& h, double& s, double& v) {
double red = r / 255.0;
double green = g / 255.0;
double blue = b / 255.0;
double maxVal = std::max({
red, green, blue });
double minVal = std::min({
red, green, blue });
double delta = maxVal - minVal;
// 计算色调 (Hue)
if (delta == 0) {
h = 0; // 无色彩,色调为0
}
else if (maxVal == red) {
h = 60 * ((green - blue) / delta);
}
else if (maxVal == green) {
h = 60 * ((blue - red) / delta + 2);
}
else if (maxVal == blue) {
h = 60 * ((red - green) / delta + 4);
}
if (h < 0) {
h += 360; // 调整为0到360度之间
}
// 计算饱和度 (Saturation)
if (maxVal == 0) {
s = 0;
}
else {
s = delta / maxVal;
}
// 计算值 (Value)
v = maxVal;
}
HSVからRGBへの変換
HSV 色空間の色相 (Hue)、彩度 (Saturation)、値 (Value) を、RGB 色空間の赤、緑、青の成分に変換できます。変換方法は以下のとおりです。
- 彩度 = 0 の場合、R = G = B = 値
- それ以外の場合は、色相の値に基づいて対応する間隔を計算し、対応する計算を実行します。
将Hue乘以6得到一个角度值,记为H
将H向下取整得到一个整数部分,记为I
计算H减去I后的小数部分,记为F
计算P = Value × (1 - Saturation)
计算Q = Value × (1 - Saturation × F)
计算T = Value × (1 - Saturation × (1 - F))
根据I的值选择相应的计算公式计算R、G、B的值:
如果I = 0,则R = Value,G = T,B = P
如果I = 1,则R = Q,G = Value,B = P
如果I = 2,则R = P,G = Value,B = T
如果I = 3,则R = P,G = Q,B = Value
如果I = 4,则R = T,G = P,B = Value
如果I = 5,则R = Value,G = P,B = Q
- Pythonの実装
def hsv_to_rgb(h, s, v):
if s == 0:
r = g = b = v
else:
h /= 60
i = int(h)
f = h - i
p = v * (1 - s)
q = v * (1 - s * f)
t = v * (1 - s * (1 - f))
if i == 0:
r, g, b = v, t, p
elif i == 1:
r, g, b = q, v, p
elif i == 2:
r, g, b = p, v, t
elif i == 3:
r, g, b = p, q, v
elif i == 4:
r, g, b = t, p, v
else:
r, g, b = v, p, q
- C++の実装
void HSVtoRGB(double h, double s, double v, int& r, int& g, int& b) {
if (s == 0) {
r = g = b = v * 255;
return;
}
h /= 60;
int i = static_cast<int>(h);
double f = h - i;
double p = v * (1 - s);
double q = v * (1 - s * f);
double t = v * (1 - s * (1 - f));
switch (i) {
case 0:
r = static_cast<int>(v * 255);
g = static_cast<int>(t * 255);
b = static_cast<int>(p * 255);
break;
case 1:
r = static_cast<int>(q * 255);
g = static_cast<int>(v * 255);
b = static_cast<int>(p * 255);
break;
case 2:
r = static_cast<int>(p * 255);
g = static_cast<int>(v * 255);
b = static_cast<int>(t * 255);
break;
case 3:
r = static_cast<int>(p * 255);
g = static_cast<int>(q * 255);
b = static_cast<int>(v * 255);
break;
case 4:
r = static_cast<int>(t * 255);
g = static_cast<int>(p * 255);
b = static_cast<int>(v * 255);
break;
default:
r = static_cast<int>(v * 255);
g = static_cast<int>(p * 255);
b = static_cast<int>(q * 255);
break;
}
}
色相は 0 ~ 360、彩度と値は 0 ~ 1 である必要があることに注意してください。返される RGB 値は 0 ~ 255 です。
RGBからCMYKへの変換
RGB 色空間の赤、緑、青の成分は、CMYK 色空間のシアン、黄、マゼンタ、黒の成分に変換できます。変換方法は以下の通りです。
- シアンの計算: シアン = 1 - (赤 / 255)
- 计算Magenta:Magenta = 1 - (Green / 255)
- 黄色の計算: 黄色 = 1 - (青 / 255)
- 计算Black:Black = min(Cyan, Magenta, Yellow)
- Pythonの実装
def rgb_to_cmyk(r, g, b):
r, g, b = r / 255.0, g / 255.0, b / 255.0
k = 1 - max(r, g, b)
if k == 1:
return 0, 0, 0, 1
c = (1 - r - k) / (1 - k)
m = (1 - g - k) / (1 - k)
y = (1 - b - k) / (1 - k)
- C++の実装
void RGBtoCMYK(int r, int g, int b, double& c, double& m, double& y, double& k) {
double red = r / 255.0;
double green = g / 255.0;
double blue = b / 255.0;
double maxVal = std::max({
red, green, blue });
// 计算黑色分量 (Black)
k = 1 - maxVal;
// 避免除以0的情况
if (k == 1) {
c = m = y = 0;
}
else {
// 计算青色分量 (Cyan)
c = (1 - red - k) / (1 - k);
// 计算洋红分量 (Magenta)
m = (1 - green - k) / (1 - k);
// 计算黄色分量 (Yellow)
y = (1 - blue - k) / (1 - k);
}
}
返される CMYK コンポーネントは 0 ~ 1 の間になります。0 はその色のコンポーネントがないことを意味し、1 は最大値 (黒) を意味します。黒コンポーネントの場合、値 1 は純粋な黒を意味することに注意してください。
上記はすべて一般的に使用される色空間変換方法であり、プロジェクトの要件に応じて適切な変換方法を採用して画像の色空間変換を実現できます。