English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

RGB 색상 모델을 HSV 색상 모델로 변경하는 C 프로그램

주어진 RGB 색상 범위(정수 형식); RGB 색상 범위를 변환하여 적절한 HSV 색상을 찾는 작업입니다.

RGB 색상 모델이 무엇인가요?

RGB 색상 모델은 빨강,緑 및 파랑 세 가지 색상으로 구성되어 있습니다. RGB 모델은 화면 기술에서 널리 사용되는 색상 모델입니다. 이는 우리가 이 세 가지 다른 강도의 색상을 더하여, 디스플레이 장치에서 수백만 가지 다른 색상을 생성하는 누적 모델입니다.

HSV 색상 모델이 무엇인가요?

HSV 색상 모델은 톤, 채도, 값이 포함되어 있으며, HSB(톤, 채도, 밝기)라고도 합니다. HSV는 RGB 색상 모델의 대체 표현입니다. 이는 인간의 시각적 색상 인식을 고려하여 조정되었습니다. 자연스러운配色 계획으로 인해, 이 색상 모델은 예술가들에게 자주 사용됩니다. HSV의 세 가지 속성은 추가되거나 감소될 수 있습니다.

프로그램에서 해야 할 것

우리는 RGB 모델 값의 사용자로부터 입력을 받아서, 수학적으로 HSV 색상 모델의 출력을 계산해야 합니다.

示例

입력: r = 31, g = 52, b = 29
출력: h s v = (114.782608, 44.230770, 20.392157)
입력: r = 129, g = 88, b = 47
출력: 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..2550으로 변경1:
   float h, s, v;
   r /= 255.0;
   g /= 255.0;
   b /= 255.0;
   float cmax = max(r, g, b); // r, g, b의 최대값
   float cmin = min(r, g, b); // r, g, b의 최소값
   float diff = cmax-cmin; // 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);
   //cmax가 0이면
      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)