一、前言

最近业务需要,要将一个 RGB 色彩空间的颜色,转化到 LCH 色彩空间,生成渐变色,再转回 RGB 色彩空间。查遍网上,只有 Matlab 写的转换代码。没有 RGB 与 LCH 互转的 PYTHON 代码,所以自己手撸了一个放上来。需要用 PYTHON 实现转换的同学可以自取。

二、原理公式

RGB 到 LCH 的转换过程,首先需要将 RGB 转换到 XYZ 空间,再将 XYZ 转换到 LAB 空间,最后再将 LAB 转换为 LCH 空间 。LCH 转回 RGB 的过程也一样,需要从 LCH 到 LAB 到 XYZ 到 RGB。

具体的转换原理及公式都在 这里,就不一一介绍了,其中 RGB 与 LAB 互转的部分是翻译这一篇博客的cpp代码,LAB 与 LCH 互转的代码是翻译这里的 js 代码。好了直接来看代码吧。

三、代码

import mathdef rgb2xyz(color):r, g, b = colorx = 0.412453 * r + 0.357580 * g + 0.180423 * by = 0.212671 * r + 0.715160 * g + 0.072169 * bz = 0.019334 * r + 0.119193 * g + 0.950227 * breturn (x, y, z)def xyz2lab(color):x, y, z = colorxn = 0.950456yn = 1.0zn = 1.088754param_13 = 1.0 / 3.0param_16116 = 16.0 / 116.0x /= (255.0 * xn)y /= (255.0 * yn)z /= (255.0 * zn)if y > 0.008856:fy = y ** param_13l = 116.0 * fy - 16else:fy = 7.787 * y + param_16116l = 903.3 * yl = max(0, l)if x > 0.008856:fx = x ** param_13else:fx = 7.787 * x + param_16116if z > 0.008856:fz = z ** param_13else:fz = 7.787 * z + param_16116a = 500.0 * (fx - fy)b = 200.0 * (fy - fz)return (l, a, b)def lab2lch(color):l, a, b = colorc = math.sqrt(a ** 2 + b ** 2)h = (math.atan2(b, a) * 180 / math.pi + 360) % 360h = h * math.pi / 180return (l, c, h)def rgb2lch(color):xyz_color = rgb2xyz(color)lab_color = xyz2lab(xyz_color)lch_color = lab2lch(lab_color)return lch_color# ------------------------------------------------------
def lch2lab(color):l, c, h = color# h = h * math.pi / 180a = c * math.cos(h)b = c * math.sin(h)return (l, a, b)def xyz2rgb(color):x, y, z = colorRR = 3.240479 * x - 1.537150 * y - 0.498535 * zGG = -0.969256 * x + 1.875992 * y + 0.041556 * zBB = 0.055648 * x - 0.204043 * y + 1.057311 * zif RR < 0:RR = 0elif RR > 255:RR = 255else:RR = int(RR)if GG < 0:GG = 0elif GG > 255:GG = 255else:GG = int(GG)if BB < 0:BB = 0elif BB > 255:BB = 255else:BB = int(BB)return (RR, GG, BB)def lab2xyz(color):param_16116 = 16.0 / 116.0l, a, b = colorfy = (l + 16) / 116if fy > 0.206893:y = fy ** 3else:y = (fy - param_16116) / 7.78fx = a / 500 + fyif fx > 0.206893:x = fx ** 3else:x = (fx - param_16116) / 7.787fz = fy - b / 200if fz > 0.206893:z = fz ** 3else:z = (fz - param_16116) / 7.787x *= 0.950456 * 255.0y *= 255.0 * 1.0z *= 1.088754 * 255.0return (x, y, z)def lch2rgb(color):lab_color = lch2lab(color)xyz_color = lab2xyz(lab_color)rgb_color = xyz2rgb(xyz_color)return rgb_color

最后运行一下看看效果:

if __name__ == "__main__":rgb_color = (182, 169, 0)lch_color = rgb2lch(rgb_color)rgb_color = lch2rgb(lch_color)print(rgb_color)

得到结果:

由于转换回 RGB 时会将浮点型的值转化为整型,所以存在一点点的误差。

References:

1.http://www.brucelindbloom.com/index.html?ColorCalculator.html

2.https://github.com/gka/chroma.js

3.https://blog.csdn.net/lz0499/article/details/77345166

如有问题欢迎指正,转载请注明出处。

python RGB与LCH互转 算法相关推荐

  1. 【RGB=HSI】单片机控制RGB单灯与HSI互转算法

    最近在做一个RGB补光灯的小玩意儿,项目上有一个OLED屏幕显示当前灯光的HSI参数,对于HSI我是完全陌生的,由于时间紧任务重,我也没想过去百度一下HSI是个啥,直接拿着样品测试了一组参数,自己去演 ...

  2. python opencv bgr转rgb_RGB最新:opencv-python的RGB与BGR互转方式_爱安网 LoveAn.com

    关于"RGB"的最新内容 聚合阅读 这篇文章主要介绍了opencv-python的RGB与BGR互转方式,具有很好的参考价值,希望对大家有所 帮助.一起跟随小编过来看看吧... 这 ...

  3. python rgb转yuv_YUV与RGB互转各种公式 (YUV与RGB的转换公式有很多种,请注意区别!!!)...

    一. 公式:基于BT.601-6 BT601 UV 的坐标图(量化后): (横坐标为u,纵坐标为v,左下角为原点) 通过坐标图我们可以看到UV并不会包含整个坐标系,而是呈一个旋转了一定角度的八边形, ...

  4. opencv-python的格式转换 RGB与BGR互转

    opencv-python的格式转换 RGB与BGR互转 2018年04月17日 22:53:23 yuanlulu 阅读数:1753更多 个人分类: pythonopencv 版权声明:本文为博主原 ...

  5. python实现RSA数字签名(纯算法实现)

    python实现RSA数字签名(纯算法实现) 一:什么是数字签名 数字签名是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明.它是一种类 ...

  6. 用python做算法_自己用python写的螺旋矩阵生成算法

    自己用python写的螺旋矩阵生成算法 如果输入6,可以生成如下矩阵: 1 20 19 18 17 16 2 21 32 31 30 15 3 22 33 36 29 14 4 23 34 35 28 ...

  7. 独家 | 利用Python实现主题建模和LDA 算法(附链接)

    作者:Susan Li翻译:陈之炎校对:陈汉青本文约1900字,建议阅读5分钟在这篇文章,我们将LDA应用于一组文档,并将文档按照主题分类. 标签:LDA 算法 主题建模是一种用于找出文档集合中抽象& ...

  8. 【重磅干货】Python、机器学习、深度学习算法实战和应用必备书籍

    [导读]首先祝大家中秋佳节快乐,乘此良辰美景,今天就给大家发一波福利干货!本文给大家分享机器学习.深度学习算法实战和应用必备的4本"宝藏"书.具体书籍展示如下:(文末提供下载方式! ...

  9. matlab 随机森林算法_(六)如何利用Python从头开始实现随机森林算法

    博客地址:https://blog.csdn.net/CoderPai/article/details/96499505 点击阅读原文,更好的阅读体验 CoderPai 是一个专注于人工智能在量化交易 ...

  10. python rgb 图像_在Python中查找RGB图像的互补图像

    python rgb 图像 Complementary image is a transformed image such that it consists of complementary colo ...

最新文章

  1. 时间字符串与当前时间比較
  2. 【转】你应该了解的基础和2017测试行业的趋势
  3. [我的1024开源程序]60元写的宠物网页和音乐网页
  4. java线程暂停与恢复suspend和resume
  5. 如何在Office 2007中查看关于对话框和版本信息
  6. 【Java】GoF-23种设计模式在Java核心类库中的应用
  7. [BZOJ] 3301: [USACO2011 Feb] Cow Line
  8. 今日恐慌与贪婪指数为92 贪婪程度有所上升
  9. JZOJ 1035. 【SCOI2009】粉刷匠
  10. MVC模式利用xib文件定制collectionCell
  11. MATLAB解微分方程组
  12. 废旧闲置的笔记本除了电脑回收,这两招也很实用!
  13. R-squared 和 Adjusted R-squared 的区别
  14. 内网远程控制软件哪个好用
  15. ev6 ev8 ev4a加密视频破解翻录教程
  16. linux系统怎么下载
  17. 程序员健康之——护腰指南
  18. 计算机控制双积分系统,双积分式ADC的原理及如何设计
  19. Pytorch的自定义拓展:torch.nn.Module和torch.autograd.Function
  20. 含LOB的表实际容量计算方法

热门文章

  1. 「面试必背」Elasticsearch面试题(收藏)
  2. skb_buff操作
  3. 手机电池校正代码_手机电池校正!iPhone手机电池校正设置
  4. k8s学习笔记4--搭建dashboard
  5. win10需要修复计算机,超好用!Win10自带修复系统 隐藏太深
  6. 【飞凌和你测评】再次进阶,更高性价比-飞凌iMX6ULL开发板
  7. python模拟登录中国海洋大学教务系统(青果)- 爬取学期所有专业课至excel - 并进行课表排课(三)
  8. Windows 语音引擎TTS修复
  9. 守望先锋ptr服务器位置,守望先锋测试服怎么进 守望先锋ptr怎么进
  10. 个人知识管理PKM:收集、消化、应用、创新