Cho giá trị màu RGB (0-255), chuyển đổi sang mô hình màu HSV (Hue, Saturation, Value).
Mô hình RGB
Gồm 3 màu: Đỏ (Red), Xanh lá (Green), Xanh dương (Blue). Mô hình cộng tính, dùng trong màn hình hiển thị.
Mô hình HSV
Gồm: Sắc độ (Hue), Độ bão hòa (Saturation), Giá trị (Value). Phù hợp với cách con người cảm nhận màu, dùng nhiều trong thiết kế.
Thuật toán chuyển đổi
- Chuẩn hóa R,G,B về [0,1] bằng cách chia 255.
- Tìm
cmax(max),cmin(min),diff = cmax - cmin. - Tính Hue (h):
- Nếu
cmax == cmin: h = 0 - Nếu
cmax == r: h = (60 * ((g-b)/diff) + 360) % 360 - Nếu
cmax == g: h = (60 * ((b-r)/diff) + 120) % 360 - Nếu
cmax == b: h = (60 * ((r-g)/diff) + 240) % 360
- Nếu
- Tính Saturation (s):
- Nếu
cmax == 0: s = 0 - Khác: s = (diff / cmax) * 100
- Nếu
- Tính Value (v): v = cmax * 100
Mã nguồn C
#include <stdio.h>
#include <math.h>
float max(float a, float b, float c) {
return (a > b) ? (a > c ? a : c) : (b > c ? b : c);
}
float min(float a, float b, float c) {
return (a < b) ? (a < c ? a : c) : (b < c ? b : c);
}
int rgb_to_hsv(float r, float g, float b) {
float h, s, v;
r /= 255.0; g /= 255.0; b /= 255.0;
float cmax = max(r, g, b);
float cmin = min(r, g, b);
float diff = cmax - cmin;
if (cmax == cmin) h = 0;
else if (cmax == r) h = fmod((60 * ((g - b) / diff) + 360), 360.0);
else if (cmax == g) h = fmod((60 * ((b - r) / diff) + 120), 360.0);
else if (cmax == b) h = fmod((60 * ((r - g) / diff) + 240), 360.0);
if (cmax == 0) s = 0;
else s = (diff / cmax) * 100;
v = cmax * 100;
printf("h s v = (%f, %f, %f)\n", h, s, v);
return 0;
}
int main() {
int r = 45, g = 215, b = 0;
rgb_to_hsv(r, g, b);
return 0;
}
Kết quả
h s v = (107.441864, 100.000000, 84.313728)