从RGB到Lab色彩空间的转换

最近一直在学习绘制RGB,HSV,Lab色彩空间的直方图,其中也涉及到互相转换的知识,这是网上看到的介绍的。

====================================================================================================================================

虽然若干年前就看过了关于色彩空间的介绍,但是直到今天才自己动手写代码做这件事情。虽然网络上已经有很多现成的例子,但是一则仅仅适用于浮点型的数据,另一方面,在实现上也有一些尚可优化之处。


色彩模型除了最常见的RGB以外,还有HSB、YCbCr、XYZ、Lab等。HSB一般仅仅作为图像处理过程中的临时模式,YCbCr常常用于图像的压缩处理,而XYZ则严格按照人眼对光信号的敏感度进行分布。

这 里将要稍作讨论的便是Lab模型。网络上诸多的介绍都说Lab是基于XYZ的,故人们一般也只能找到XYZ和Lab之间的转换,而RGB到Lab的转换只 能使用XYZ作为中间模式间接进行。可惜的是,这种现状源于误解。而在图像处理软件中(比如Photoshop),往往采用一个更为简单的算法。

我们可以先观察RGB到XYZ的转换:
[X,Y,Z] = [M] * [R,G,B]

其中M为一3x3矩阵:
[M] = [0.4125, 0.3576, 0.1805;
0.2126, 0.7152, 0.0722;
0.0193, 0.1192, 0.9505],

RGB是经过Gamma校正的色彩分量:R=g(r),G=g(g),B=g(b)。
其中rgb为原始的色彩分量。

g是Gamma校正函数:
当 x < 0.018 时,g(x) = 4.5318 * x
当 x >= 0.018 时,g(x) = 1.099 * d^0.45 - 0.099

rgb以及RGB的取值范围则均为[0,1)。计算完成后,XYZ的取值范围则有所变化,分别是:[0, 0.9506),[0, 1),[0, 1.0890)。


以及XYZ到Lab的转换:
L = 116 * f(Y1) - 16
a = 500 * (f(X1) - f(Y1))
b = 200 * (f(Y1) - f(Z1))


其中f是一个类似Gamma函数的校正函数:
当 x > 0.008856 时,f(x) = x^(1/3)
当 x <= 0.008856 时,f(x) = ( 7.787 * x ) + ( 16 / 116 )
X1、Y1、Z1分别是线性归一化之后的XYZ值,也就是说,它们的取值范围都是[0, 1)。此外,函数f的值域也和自变量一样都是[0, 1)。

计算完成后,L的取值范围[0, 100),而a和b则约为[-169, +169)和[-160, +160)。


在观察这些貌似复杂的变换之前,我们必须确定的一个假设是:在图像处理软件中,非RGB色彩数据的绝对值并不重要,重要的是他们能够尽可能准确的还原成RGB图像以显示在屏幕等相关设备上。这个假设是我们的简化得以成立的理由。

上面的从XYZ到Lab的转换乍一看起来很奇怪,但若是仔细观察,不难发现L与Y1只是一个简单的同区间映射关系,这个映射其实可有可无(如果进行了映射反而必定导致色阶丢失)。

这样,我们取得的第一个简化是: L = Y1

接 下来接着看a和b的映射过程。大家不难发现,a和b其实是一个色差信号(跟Cb和Cr的性质差不多)。至于它们的转换系数500和200,大家可以完全忘 记,因为他们的值域并不符合8位整数值的表达需要。我们将会稍后计算出合适的因数,使得a和b都处在[0, 255]的范围内。

因为XYZ必须归一化转为X1Y1Z1,那么我们其实可以在转换矩阵M中作出这个修改,令每行乘以一个系数以使得每行各数之和为1:
[M1] = [0.4339, 0.3762 0.1899;
0.2126, 0.7152, 0.0722;
0.0177, 0.1095, 0.8728]

于是乎,我们得出一个半成品:
L = Y1 = 0.2126 * R + 0.7152 * G + 0.0722 * B
a = Fa * (X1 - Y1) + Da
b = Fb * (Y1 - Z1) + Db
其中的Fx是调整值域用的系数,Dx是一个正数,用来消除a和b的负值。Fx和Dx的选取必须令a和b满足值域在[0, 255]上的分布。

接 下来我们来确定Fx和Dx的值。通过M1我们很容易计算出X1-Y1的值域(极端情况)为[-86.784, +86.784),而Y1-Z1的值域则为[-204.9536, +204.9536)。于是乎,Fa的值为1.4749,Fb的值为0.6245;Da和Db则都是128。

这时,代入M1有:
L = Y1 = 0.2126 * R + 0.7152 * G + 0.0722 * B
a = 1.4749 * (0.2213 * R - 0.3390 * G + 0.1177 * B) + 128
b = 0.6245 * (0.1949 * R + 0.6057 * G - 0.8006 * B) + 128
其中RGB和Lab的取值范围都是[0,255]。

最后的一点工作是算法的优化。我们可以将这个方程组转换成常整数乘法与移位的方式(相当于使用定点数)。为了方便阅读,我仍然将移位写为除法。

所以我们的最终结果为:
L = Y1 = (13933 * R + 46871 * G + 4732 * B) div 2^16
a = 377 * (14503 * R - 22218 * G + 7714 * B) div 2^24 + 128
b = 160 * (12773 * R + 39695 * G - 52468 * B) div 2^24 + 128


至于逆变换则可以用类似的方法推导出来:
设L1=L,a1=(a-128)*174,b1=(b-128)*410,有:
R = L1 + (a1 * 100922 + b1 * 17790) div 2^23
G = L1 - (a1 * 30176 + b1 * 1481) div 2^23
B = L1 + (a1 * 1740 - b1 * 37719) div 2^23
其中RGB和Lab的取值范围都是[0,255],再经过逆Gamma函数取得原始的rgb


以上的算法在Delphi中编译通过。经测试,运算得出的直方图与图片观感和我手头的Photoshop CS的结果非常相似,但也有一些幅度上的差别,且容以后慢慢细察。

当初为了寻觅一个简单的RGB直接转Lab算法而找遍网络皆不得,万不得已只好自力更生。其间虽费时一日,幸好也算略有所得。暂记于此,以利后人。其间或许难免错漏之处,还望达人不吝指点。 :SUN_GLASSES:

转载地址:http://hao.qinz.net/comments.php?y=08&m=07&entry=entry080727-033517

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强制将IE8设置为IE7兼容模式来解析网页(转)

英文原文&#xff1a;http://msdn.microsoft.com/en-us/library/cc288325(VS.85).aspx 文件兼容性用于定义让IE如何编译你的网页。此文件解释文件兼容性&#xff0c;如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式。 前言 为了帮助确保你的网页在所有未来…

css中怎么把数字改成罗马数字,$\LaTeX$笔记:Section 编号方式(数字、字母、罗马)计数器计数形式修改...

$\LaTeX$系列根目录&#xff1a; Latex学习笔记-序IEEE模板中Section的编号是罗马数字&#xff0c;要是改投其他刊物的话可能得用阿拉伯数字&#xff0c;所以可以在导言部分做如下修改(放在导言区宏包调用之后)&#xff1a;\renewcommand\thesection{\arabic{section}}%arabic …

creo动画如何拖动主体_Animate如何制作动态遮罩文字动画

使用遮罩可以制作文字动画&#xff0c;让文字变形图片填充并变化的动画效果。FLASH如何制作变色文字效果-百度经验​jingyan.baidu.comFLASH如何制作高光扫过文字的效果-百度经验​jingyan.baidu.com适用软件&#xff1a;Animate CC2018及其它FLash软件制作步骤&#xff1a;1.打…

CvArr、Mat、CvMat、IplImage、BYTE转换(总结而来)

转载自http://blog.csdn.net/wuxiaoyao12/article/details/7305848 一、Mat类型&#xff1a;矩阵类型&#xff0c;Matrix。 在openCV中&#xff0c;Mat是一个多维的密集数据数组。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。 Mat有3个重要的方法&#xff1a; 1…

Android权限【大全】 .

1 android.permission.ACCESS_CHECKIN_PROPERTIES 2 //允许读写访问”properties”表在checkin数据库中&#xff0c;改值可以修改上传 3 4 android.permission.ACCESS_COARSE_LOCATION 5 //允许一个程序访问CellID或WiFi热点来获取粗略的位置 6 7 android.permission.ACCESS_FI…

css高度背景怎么填充整屏,004-CSS怎样让背景充满整个屏幕

...Your content goes here...给body标签指定背景图&#xff0c;这样背景图就可以填充整个浏览器viewport了。其实&#xff0c;该方案对所有的块级容器都可以生效。块级容器的宽高是动态的&#xff0c;那么背景图将自动伸缩&#xff0c;充满整个容器。CSS body标签的样式如下&a…

pcap python 生成_python+pcap+dpkt 抓包小实例

1 #!/usr/bin/env python2 #-*- coding: utf-8 -*-34 """网络数据包捕获与分析程序"""56 importpcap7 importdpkt8 importjson9 importre10 importtime11 from urllib importunquote1213 #过滤输出目标ip14 dst_lists [15 203.66.1.212, #nslook…

计算机视觉、机器学习相关领域论文和源代码大集合

原文转自&#xff1a;http://blog.csdn.net/zouxy09/article/details/8550952 计算机视觉、机器学习相关领域论文和源代码大集合--持续更新…… zouxy09qq.com http://blog.csdn.net/zouxy09 注&#xff1a;下面有project网站的大部分都有paper和相应的code。Code一般是C/C或者…

热插拔服务器电源维修,无需关停系统即可热插拔,TE Connectivity推出滑轨电源连接器...

原标题&#xff1a;无需关停系统即可热插拔&#xff0c;TE Connectivity推出滑轨电源连接器全球连接与传感器领域领军企业TE Connectivity(TE)宣布推出滑轨电源连接器。此连接器是唯一一款无需关闭系统电源&#xff0c;即可在服务器中进行电子元件热插拔的电源连接器产品。滑轨…

EMACS 中文显示为方框

解决方案 (set-default-font "Consolas-14") (set-fontset-font "fontset-default" unicode ("微软雅黑" . "unicode-bmp")) 转载于:https://www.cnblogs.com/Mingxx/archive/2013/01/11/2856432.html

计算机视觉领域的一些牛人博客,研究机构等的网站链接

计算机视觉领域的一些牛人博客&#xff0c;研究机构等的网站链接 zouxy09qq.com http://blog.csdn.net/zouxy09 转自&#xff1a;http://www.cnblogs.com/Rick-w/archive/2012/04/14/2446921.html 以下链接是本人整理的关于计算机视觉&#xff08;ComputerVision, CV&#xff0…

excel服务器2010网站,excel服务器2010

excel服务器2010 内容精选换一换所有弹性伸缩的接口&#xff0c;有自定义错误信息返回&#xff0c;该小节介绍弹性伸缩的错误码的含义。{"error":{"code":"AS.0001","message":"System error."}}当您调用API时&#xff0c;如…

typeorm 生成实体类_android常用orm框架greenDAO创建表生成实体类

package com.example.greendao_test.DB_Initialize;import java.io.IOException;import de.greenrobot.daogenerator.DaoGenerator;import de.greenrobot.daogenerator.Entity;import de.greenrobot.daogenerator.Schema;/** * 生产类执行程序(建表和生成关系类) * * author a…

图像处理和计算机视觉中的经典论文

图像处理和计算机视觉中的经典论文 zouxy09qq.com http://blog.csdn.net/zouxy09 转自&#xff1a;http://www.cnblogs.com/moondark/archive/2012/04/20/2459594.html 感谢水木上同领域的同学分享&#xff0c;有了他的整理&#xff0c;让我很方便的获得了CV方面相关的经典论文…

Android系统架构

Android系统架构总体可分为四层结构&#xff0c;从下往上依次是:Linux内核层、系统运行库层、应用程序框架层以及应用程序层。如下图所示&#xff1a; 一、Linux内核层 Google选择了Linux内核作为Android的底层支撑系统。当前的Android系统是基于Linux2.6内核的&#xff0c;提供…