颜色的RGB-计算HSV公式色度/饱和度/亮度 简化代码

10 篇文章 0 订阅

计算颜色的HSV值


本文提供全流程,中文翻译。

Chinar 坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)


Chinar —— 心分享、心创新!

助力快速完成 Color HSV

为新手节省宝贵的时间,避免采坑!



全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

HSV —— 色彩模型


通过颜色的 RGB 值计算出对应的 HSV

H Hue 色度

S Saturation饱和度

V Value 纯度
举个栗子黑白88

using UnityEngine;
using UnityEngine.UI;


/// <summary>
/// 通过RGB —— HSV
/// </summary>
public class ChinaCalculateColorHsv : MonoBehaviour
{
    private Image TestImage;   //测试图片,用来颜色取值
    private Image TargetImage; //目标图片,用来将HSV转RGB,赋值
    private float R;
    private float G;
    private float B;
    private float H;
    private float V;
    private float S;
    private float max;
    private float min;


    void Start()
    {
        TestImage   = GameObject.Find("TestImageColor").GetComponent<Image>();
        TargetImage = GameObject.Find("TargetImage").GetComponent<Image>();
    }


    public void CalculateColorHsv()
    {
        R   = TestImage.color.r;
        G   = TestImage.color.g;
        B   = TestImage.color.b;
        max = Mathf.Max(R, G, B);
        min = Mathf.Min(R, G, B);
        if (R == max)
        {
            H = (G - B) / (max - min);
        }
        if (G == max)
        {
            H = 2 + (B - R) / (max - min);
        }
        if (B == max)
        {
            H = 4 + (R - G) / (max - min);
        }
        H = (H / 6);
        if (H < 0)
        {
            H = (H / 360 + 1);
        }

        S = (max - min) / max;
        V = (Mathf.Max(R, G, B));
        print((H));
        print((S));
        print((V));


        TargetImage.color = Color.HSVToRGB(H, S, V);
    }
}

2

Example —— 实例


这里以 Unity 来举个例子

取一个图片的颜色 RGB ,得到 HSV

然后通过内置函数 Color.HSVToRGB(H, S, V) HSV 转为 Color 赋值给新图片
举个栗子黑白88
这里写图片描述


支持

May Be —— 搞开发,总有一天要做的事!


拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!


先点击领取 —— 阿里全产品优惠券 (享受最低优惠)


1 —— 云服务器超全购买流程 (新手必备!)

2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

3—— Windows 服务器配置、运行、建站一条龙 !

4 —— Linux 服务器配置、运行、建站一条龙 !




<script type="math/tex" id="MathJax-Element-2"> </script>
技术交流群:806091680 ! Chinar 欢迎你的加入


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现根据色度信息增强色彩鲜艳程度的效果,可以使用以下步骤: 1. 读取图像数据并获取色度信息。 2. 将色度信息换为HSV(Hue, Saturation, Value)颜色空间,其中H表示颜色,S表示饱和度,V表示亮度。 3. 对S进行增强,可以通过增加饱和度来实现。可以使用以下公式进行计算: newS = S + deltaS 其中,deltaS为饱和度增强量。 4. 将HSV颜色空间换回RGB(Red, Green, Blue)颜色空间。 5. 将处理后的图像数据保存。 以下是一个简单的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct { unsigned char r, g, b; } RGB; typedef struct { float h, s, v; } HSV; void RGBtoHSV(RGB rgb, HSV* hsv) { float r = rgb.r / 255.0, g = rgb.g / 255.0, b = rgb.b / 255.0; float max = fmaxf(fmaxf(r, g), b), min = fminf(fminf(r, g), b); float delta = max - min; hsv->v = max; hsv->s = max == 0 ? 0 : delta / max; if (max == min) { hsv->h = 0; } else if (max == r) { hsv->h = (g - b) / delta + (g < b ? 6 : 0); } else if (max == g) { hsv->h = (b - r) / delta + 2; } else if (max == b) { hsv->h = (r - g) / delta + 4; } hsv->h /= 6; } void HSVtoRGB(HSV hsv, RGB* rgb) { float r, g, b; int i = hsv.h * 6; float f = hsv.h * 6 - i; float p = hsv.v * (1 - hsv.s); float q = hsv.v * (1 - f * hsv.s); float t = hsv.v * (1 - (1 - f) * hsv.s); switch (i % 6) { case 0: r = hsv.v, g = t, b = p; break; case 1: r = q, g = hsv.v, b = p; break; case 2: r = p, g = hsv.v, b = t; break; case 3: r = p, g = q, b = hsv.v; break; case 4: r = t, g = p, b = hsv.v; break; case 5: r = hsv.v, g = p, b = q; break; } rgb->r = r * 255.0; rgb->g = g * 255.0; rgb->b = b * 255.0; } void enhanceColorfulness(RGB* image, int width, int height, float deltaS) { for (int i = 0; i < width * height; i++) { HSV hsv; RGBtoHSV(image[i], &hsv); hsv.s += deltaS; if (hsv.s > 1) hsv.s = 1; HSVtoRGB(hsv, &image[i]); } } int main(int argc, char* argv[]) { if (argc < 4) { printf("Usage: %s input output deltaS\n", argv[0]); return 1; } char* inputFileName = argv[1]; char* outputFileName = argv[2]; float deltaS = atof(argv[3]); FILE* inputFile = fopen(inputFileName, "rb"); if (!inputFile) { printf("Failed to open input file: %s\n", inputFileName); return 1; } fseek(inputFile, 0, SEEK_END); int fileSize = ftell(inputFile); fseek(inputFile, 0, SEEK_SET); int width, height; fread(&width, sizeof(int), 1, inputFile); fread(&height, sizeof(int), 1, inputFile); RGB* image = (RGB*)malloc(width * height * sizeof(RGB)); fread(image, sizeof(RGB), width * height, inputFile); fclose(inputFile); enhanceColorfulness(image, width, height, deltaS); FILE* outputFile = fopen(outputFileName, "wb"); if (!outputFile) { printf("Failed to open output file: %s\n", outputFileName); return 1; } fwrite(&width, sizeof(int), 1, outputFile); fwrite(&height, sizeof(int), 1, outputFile); fwrite(image, sizeof(RGB), width * height, outputFile); fclose(outputFile); free(image); return 0; } ``` 这个示例代码读取一个RGB图像文件,对其进行色彩增强,并将处理后的图像保存为RGB图像文件。可以通过命令行参数指定输入文件、输出文件和饱和度增强量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值