C程序将RGB颜色模型更改为HSV颜色模型
给定的RGB颜色范围(整数形式);任务是通过转换RGB颜色范围找到合适的HSV颜色
什么是RGB颜色模型
RGB颜色模型由红色,绿色和蓝色三种颜色组成。RGB模型是一种在显示技术中广泛使用的颜色模型。它是一个累加模型,其中我们将这三种具有不同强度的颜色相加,以在显示设备上产生数百万种不同的颜色。
什么是HSV颜色模型?
HSV颜色模型包括色相,饱和度,值,也称为HSB(色相,饱和度,亮度)。HSV是RGB颜色模型的替代表示。它以人类视觉感知色彩属性的方式进行调整。由于其自然的配色方案,这种颜色模型经常被艺术家使用。HSV的三个属性可以相加也可以相减。
我们在程序中要做的
我们必须从RGB模型值的用户那里获取输入,然后以数学方式计算HSV颜色模型中的输出。
示例
Input: r = 31, g = 52, b = 29 Output: h s v = (114.782608, 44.230770, 20.392157) Input: r = 129, g = 88, b = 47 Output: h s v=(30.000000, 63.565895, 50.588238)
我们将用来解决给定问题的方法-
以红色(r),绿色(g)和蓝色(b)三种颜色进行输入。
将所有颜色值除以255。
现在计算cmax,cmin和差。
检查-
如果cmax和cmin等于0,则色相或h将为0。
如果cmax等于Red(r),则色相(h)=(60*((g–b)/diff)+360)%360。
如果cmax等于Green(g),则色相(h)=(60*((b–r)/diff)+120)%360。
如果cmax等于Blue(b),则色相(h)=(60*((r–g)/diff)+240)%360。
为了找到饱和度,我们将检查-
如果cmax=0,则饱和度(s)=0。
如果cmax不等于零,则饱和度(s)=(diff/cmax)*100
值计算-
值(v)=cmax*100
算法
Start
Step 1 -> In function float max(float a, float b, float c)
Return (a > b)? (a > c ? a : c) : (b > c ? b : c)
Step 2 -> In function float min(float a, float b, float c)
Return (a < b)? (a < c ? a : c) : (b < c ? b : c)
Step 3 -> In function int rgb_to_hsv(float r, float g, float b)
Declare float h, s, v
Set r = r / 255.0
Set g = g / 255.0
Set b = b / 255.0
Set cmax = max(r, g, b)
Set cmin = min(r, g, b)
Set diff = cmax-cmin
If cmax == cmin then,
Set h = 0
End if
Else if cmax == r then,
Set h = fmod((60 * ((g - b) / diff) + 360), 360.0)
End Else if
Else if cmax == g then,
Set h = fmod((60 * ((b - r) / diff) + 120), 360.0)
End Else if
Else if cmax == b then,
Set h = fmod((60 * ((r - g) / diff) + 240), 360.0)
End Else if
If cmax == 0 then,
Set s = 0
End if
Else
Set s = (diff / cmax) * 100
End Else
v = cmax * 100;
Print h, s, v
Step 4 -> int main(int argc, char const *argv[])
Declare and initialize r = 45, g = 215, b = 0
Call function rgb_to_hsv(r, g, b)
Stop示例
#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) {
//R,G,B值除以255-
//将范围从0..255更改为0..1:
float h, s, v;
r /= 255.0;
g /= 255.0;
b /= 255.0;
float cmax = max(r, g, b); // maximum of r, g, b
float cmin = min(r, g, b); // minimum of r, g, b
float diff = cmax-cmin; // diff of cmax and 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);
//如果cmax等于零
if (cmax == 0)
s = 0;
else
s = (diff / cmax) * 100;
//计算v-
v = cmax * 100;
printf("h s v=(%f, %f, %f)\n", h, s, v );
return 0;
}
//主要功能
int main(int argc, char const *argv[]) {
int r = 45, g = 215, b = 0;
rgb_to_hsv(r, g, b);
return 0;
}输出结果
h s v=(107.441864, 100.000000, 84.313728)