最近在做一个RGB补光灯的小玩意儿,项目上有一个OLED屏幕显示当前灯光的HSI参数,对于HSI我是完全陌生的,由于时间紧任务重,我也没想过去百度一下HSI是个啥,直接拿着样品测试了一组参数,自己去演算了一个HSI转RGB的函数,虽然花了不少时间,还存在一点误差,误差主要是范围的问题,RGB的范围应该是0-255,我演算的时候为了方便计算将范围设置为0-100,最终结果算是好的吧。

但是在RGB转HSI的时候,已经没有时间去推算了,这才想起来去请教身边的一位大佬,这才知道HSI颜色模型是个啥,还给我普及了这个互转算法,拿来给我优化使用,在这记录一下优化后C语言写法,随便参考一下百科对HSI的介绍,加深理解。

HSI〔Hue-Saturation-Intensity(Lightness),HSI或HSL〕颜色模型用H、S、I三参数描述颜色特性,其中H定义颜色的频率,称为色调;S表示颜色的深浅程度,称为饱和度;I表示强度或亮度。

HSI 颜色模型中的H 分量是确定颜色的主要因素,当它发生变化时色调值也将变化;S 分量越大(接近1),颜色越纯,S 分量越小(接近0),颜色越接近纯灰色

C语言代码实现:

/*** HSV -> RGB.* @param hue Hue.In the range[0..360]* @param saturation Saturation. In the range[0..100].* @param value Value. In the range[0..100].* @return RGB color space. In the range[0..255].*/
u8 *HSVtoRGB(u16 h, u16 s, u16 i)
{static u8 rgb[3] = {0};float hue = (float)h;float saturation = (float)(s/100.0);float value = (float)(i/100.0);float hi= (float)((u32)(hue / 60.0) % 6);float f = (float)((hue / 60.0) - (u32)(hue / 60.0));float p = (float)(value * (1.0 - saturation));float q = (float)(value * (1.0 - (f * saturation)));float t = (float)(value * (1.0 - ((1.0 - f) * saturation)));if (hi == 0){rgb[0] = (int)(value * 255);rgb[1] = (int)(t * 255);rgb[2] = (int)(p * 255);}else if (hi == 1){rgb[0] = (int)(q * 255);rgb[1] = (int)(value * 255);rgb[2] = (int)(p * 255);}else if (hi == 2){rgb[0] = (int)(p * 255);rgb[1] = (int)(value * 255);rgb[2] = (int)(t * 255);}else if (hi == 3){rgb[0] = (int)(p * 255);rgb[2] = (int)(value * 255);rgb[1] = (int)(q * 255);}else if (hi == 4){rgb[0] = (int)(t * 255);rgb[2] = (int)(value * 255);rgb[1] = (int)(p * 255);}else if (hi == 5){rgb[0] = (int)(value * 255);rgb[1] = (int)(p * 255);rgb[2] = (int)(q * 255);}return rgb;
}
#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif#ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif
/*** RGB -> HSV.* Adds (hue + 360) % 360 for represent hue in the range [0..359].* @param red Red coefficient. Values in the range [0..255].* @param green Green coefficient. Values in the range [0..255].* @param blue Blue coefficient. Values in the range [0..255].* @return HSV color space.*/
int *RGBtoHSV(u16 r, u16 g, u16 b)
{static int hsv[3] = {0};int max = MAX(r,MAX(g,b));int min = MIN(r,MIN(g,b));int delta = max - min;// Hueif (max == min){hsv[0] = 0;}else if (max == r){hsv[0] = (60*(g - b) / delta);}else if (max == g){hsv[0] = (60*(b - r) / delta) + 120;}else if (max == b){hsv[0] = (60*(r - g) / delta) + 240;}if(hsv[0] < 0) {hsv[0] += 360;}// Saturationif (delta == 0)hsv[1] = 0;elsehsv[1] = (100*delta/ max);//Valuehsv[2] = 100*max/255;return hsv;
}

最后说明一下,关于HSI算法模型的资料网上确实有很多,我这个只是单灯互转的小需求,所以也没花太多时间去整理,只是去实现了最简单的功能,还有就是我的工程对float的处理不是那么友好,在传参时都转成了整数处理,在测试到一些特定值的转换结果会出现一点点误差,在此请教各路大佬,有没有更好的优化方法或者代码实现。

【RGB=HSI】单片机控制RGB单灯与HSI互转算法相关推荐

  1. 基于单片机交通灯控制的c语言程序设计,基于单片机控制的交通灯毕业设计

    摘  要 随着现代社会对交通运输的日趋依赖,交通灯成为了人们生活中不可或缺的一部分.传统的交通灯虽然在一定程度上可以满足指挥路口交通的需要,但随着城市规模的不断扩大,原有的交通灯已经表现出明显的缺点: ...

  2. led交通灯c语言程序设计,单片机控制的交通灯C语言编程.doc

    单片机控制的交通灯C语言编程 单片机控制的交通灯 红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换.四个方向各有一个红.黄.绿显示和两个数码管. 东西道为人行道(20秒),南北道为车行道(60秒),黄灯 ...

  3. 从两边往中间流水灯c语言程序,单片机控制LED流水灯从中间向两边.doc

    WORD格式.分享 精品.资料 单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把 先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过 ...

  4. 单片机c语言编程实现中间向两边,再从两边向中间亮的程序流程图,单片机控制LED流水灯从中间向两边.doc...

    单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把 先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过这个程序实现的 应该是这样的 先 ...

  5. 从两边往中间流水灯c语言程序,单片机控制LED流水灯从中间向两边

    单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过这个程序实现的应该是这样的先奇数亮 ...

  6. 基于单片机控制的交通灯系统设计

    一.引言 (一).概述 本设计是交通灯的控制实验,必须要先了解实际交通灯的变化规律.假设一个路口为东西南北走向,即十字路口,初始状态零为东西南北灯都熄灭.然后转状态一东西绿灯通车,南北为红灯.过段时间 ...

  7. 单片机 c语言 p1控制流水灯,单片机控制的流水灯程序

    我们前边学了点亮LED小灯,然后又学了LED小灯闪烁,下边我们要进一步了解一下如何让8个小灯依次一个一个点亮,流动起来. 图1 LED小灯电路图 通过前面的课程,我们可以了解到控制引脚P0.0通过了7 ...

  8. 单片机控制一盏灯的亮与灭程序解释

    1.这部分代码定义了两个新的数据类型,uchar和uint,分别表示无符号字符型和无符号整型.这里使用了#define预处理指令,将uchar和uint分别定义为unsigned char和unsig ...

  9. 从两边往中间流水灯c语言程序,单片机控制LED流水灯从中间向两边,从两边向中间...

    这个就是把 先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过这个程序实现的 应该是这样的  先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两 ...

最新文章

  1. Python编程神器Jupyter Notebook使用的28个秘诀(附代码)
  2. 浅析企业网站排名低可能是哪些原因导致的呢?
  3. spring 自定义标签的实现
  4. JavaScript——使用正则表达式提取指定格式内容
  5. Java重载和重写6_深入理解Java中的重写和重载
  6. php mysql开发技术_PHP+MySQL开发技术详解—学习笔记
  7. echart 导出保存图片
  8. GBDT算法之流失预警模型
  9. iOS中的枚举:enum, NS_ENUM, NS_OPTIONS的使用区别
  10. 【BZOJ5082】弗拉格 矩阵乘法
  11. ai智能时代教育内容的改变_人工智能正在改变我们的评论方式
  12. 菜鸟打印助手接口_打印快递单,这4件事儿你非做不可
  13. Struts的增删改查
  14. Vue2.5学习笔记(三)动画
  15. Linux-CentOS 安装yasm
  16. python是解释性语言!
  17. 电脑密码忘了怎么解除?最简单操作的方法
  18. [4G5G专题-30]:物理层-基带无线资源、物理层帧结构、无线资源调度
  19. Js 几种刷新页面最快的方法
  20. html5第三课时,标签应用。

热门文章

  1. python数据分析之pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
  2. video网页能播放.mp4视频,微信不能播放的问题
  3. python进阶_基础篇4(数据类型和列表)
  4. 5G NR协议栈SDAP、PDCP
  5. ultravnc 设置代理_云立方IP丨IP代理可以实现哪些功能?
  6. 101. Symmetric Tree (C语言)
  7. 【Web技术】1348- 聊聊水印实现的几种方式
  8. 运算放大器的16个基础知识点
  9. 福永苹果服务器维修,苹果发起 iPhone 7 “无服务”问题维修计划
  10. BUUCTF-RSA学习(一)