VC编程实现色彩空间XYZ与LAB相互转换[通俗易懂]

VC编程实现色彩空间XYZ与LAB相互转换[通俗易懂]VC编程实现色彩空间XYZ与LAB相互转换文章VC编程实现色彩空间RGB与XYZ相互转换已经介绍了RGB与XYZ色彩空间的转换算法以及实际的VC源代码,在上一篇文章已经提到,在PhotoShop中经常使用有RGB(红色、绿色、蓝色)、CMYK(青色、洋红、黄色、黑色)、HSB(色相、饱和度、亮度)和Lab4中色彩空间。我们用到XYZ色彩空间的目的是进行RGB与LAB色彩空

大家好,又见面了,我是你们的朋友全栈君。

VC编程实现色彩空间XYZ与LAB相互转换

文章VC编程实现色彩空间RGB与XYZ相互转换已经介绍了RGB与XYZ色彩空间的转换算法以及实际的VC源代码,在上一篇文章已经提到,在PhotoShop中经常使用有RGB(红色、绿色、蓝色)、CMYK(青色、洋红、黄 色、黑色)、HSB(色相、饱和度、亮度)和Lab4中色彩空间。我们用到XYZ色彩空间的目的是进行RGB与LAB色彩空间转换的中介,承接前文,本文将介绍XYZ与LAB色彩空间之间的转换方法,并列出具体的算法公式和VC源代码。

1. 色彩空间XYZ转LAB(CIE L*a*B*)

1.1. 理论公式

XYZ转LAB的算法公式

XYZ色彩空间转LAB色彩空间的公式
XYZ色彩空间转LAB色彩空间公式


1.2. VC实例代码:

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//REF_X 、REF_Y 、REF_Z 是参照白点CIE XYZ三色刺激值
static
double
REF_X=96.4221;        
static
double
REF_Y=100.000;
static
double
REF_Z=82.5221;
// 类似Gamma函数的校正函数,XYZ转LAB时用
double
CColorUtility::revise(
double
x){
    
if
(x>
pow
(6.0/29.0,3))
        
x=
pow
(x,1.0/3.0);
    
else
        
x=(1.0/3.0)*(29.0/6.0)*x+(16.0/116.0);
    
return
x;
}
bool
CColorUtility::_cie_xyz2lab(
const
double
xyz[3],
double
(&lab)[3]){
    
double
x=xyz[0]/REF_X;
    
double
y=xyz[1]/REF_Y;
    
double
z=xyz[2]/REF_Z;
 
    
x=revise(x);
    
y=revise(y);
    
z=revise(z);
 
    
lab[0]=(116.0*y)-16.0;
    
lab[1]=500.0*(x-y);
    
lab[2]=200.0*(y-z);
     
    
return
true
;
}

到此,便使用VC编程实现了色彩空间XYZ到LAB的转换,下面我们来看看其逆变换,即LAB转XYZ的具体理论和实现:

2.色彩空间LAB(CIE L*a*B*)转XYZ

2.1. 理论公式

色彩空间LAB转XYZ理论计算公式
其中:色彩空间LAB转XYZ计算公式


2.2. VC实例代码:

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 类似Gamma函数的校正函数的反函数,LAB转XYZ时用
double
CColorUtility::r_revise(
double
x){
    
if
(x>6.0/29.0)
        
x=
pow
(x,3.0);
    
else
        
x=(x-16.0/116.0)*3*
pow
(6.0/29.0,2);
    
return
x;
}
bool
CColorUtility::_cie_lab2xyz(
const
double
lab[3],
double
(&xyz)[3]){
    
double
y=(lab[0]+16.0)/116.0;
    
double
x=y+lab[1]/500.0;
    
double
z=y-lab[2]/200.0;
 
    
y=r_revise(y);
    
x=r_revise(x);
    
z=r_revise(z);
 
    
xyz[0]=x*REF_X;
    
xyz[1]=y*REF_Y;
    
xyz[2]=z*REF_Z;
 
    
return
true
;
}

REF_X 、REF_Y 、REF_Z 是参照白点CIE XYZ三色刺激值,与色彩空间XYZ转LAB的取值一样。到此,便使用VC编程实现了色彩空间LAB到XYZ的转换,本文介绍了LAB色彩空间与XYZ色彩空间的正变换和逆变换,结合前文,便实现了RGB->XYZ->LAB色彩空间的变换,同样也可以实现LAB->XYZ->RGB逆变换。为方便读者理解,给出了具体的计 算公式和实际源码。VC图形图像处理编程博大精深,有任何建议欢迎留言讨论,后续文章我们将继续介绍VC编程实现其它色彩空间之间的相互转换。

本系列程序均在Win7+VS2008测试通过,并且结果与PS3的运算结果一致。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151193.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • dropdownlist控件的使用方法_redis通知机制

    dropdownlist控件的使用方法_redis通知机制假设:数据源控件GrdiView,无刷新UpdatePannel,友情提示UpdateProgress,分页下拉框DropDownList一般情况下:Gridview的分页有linkbutton或者button,这样要是想让UpdateProgress提示,很简单,先让GridView隐藏,然后给它加个OnClientClick就搞定!在DropDownList的oncha

  • clientwidth innerWidth offsetWidth

    clientwidth innerWidth offsetWidthclientWidth 在任何窗口系统中都是指用户内容能放置的空间clientWidth是每个document一个,一个窗口中可以放置多个document,比如你用frame或iframe就可以放置多个document,这相当于图形界面编程中的MDI(多文档窗口应用,比如Word,Excel就可以同时打开多个文档)。 window.innerWidth能获取…

  • 安装增强功能失败:Could not mount the media/drive C:\Program Files\Oracle\VirtualBox/VBoxGuestAdditions.iso「建议收藏」

    安装增强功能失败:Could not mount the media/drive C:\Program Files\Oracle\VirtualBox/VBoxGuestAdditions.iso「建议收藏」吾虚拟机Ubuntu18本来是正常的,重新安装系统,不能自动改变分辨率。于是试图安装增强功能,报错如图:文字内容:Couldnotmountthemedia/drive’C:\ProgramFiles\Oracle\VirtualBox/VBoxGuestAdditions.iso'(VERR_PDM_MEDIA_LOCKED).然后吾一通操作,结果正常了。怎么正常的吾亦不知。记得有两个:把对应版本的VirtualBox_Extension_Pack-6.1.0.vbo

  • CListCtrl自绘「建议收藏」

    CListCtrl自绘「建议收藏」CListCtrl自绘有3种方法:第一种:使用WM_ERASEBKGND消息+NM_CUSTOMDRAW消息配合自绘WM_ERASEBKGND消息中绘制背景色,比如偶数行为灰色,奇数行为白色。NM_CUSTOMDRAW消息中设置字体的背景色和字体颜色。好处:保留了控件大多数的原有属性。不需要自己去输出每一个项目的字体。可以非常方便的设置背景色,以及文字的颜色。缺点:不能设置选中

  • MySQL建立索引的优点和缺点

    MySQL建立索引的优点和缺点建立索引的优缺点:为什么要创建索引呢?        这是因为,创建索引可以大大提高系统的性能。         第一、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。         第二、可以大大加快数据的检索速度,这也是创建索引的最主要的原因。         第三、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。         第四、在使用分组和排序子句…

  • 解决BASE64Encoder报错的问题

    解决BASE64Encoder报错的问题今天在用servlet写一个文件下载的案例时,想解决文件的中文显示问题。然后在导包importsun.misc.BASE64Encoder时,发现IDEA报错了,无法识别这个类。最后发现在JDK9后,官方就已经不支持importsun.misc.BASE64Encoder了。网上说了很多,第一种是把JDK的版本降低到1.8以内。但是我觉得这不是解决的最好办法。我觉得应该去修改原有的代码。所以我采用了官方提供了新的jar包importjava.util.Base64。下面这个java类的本意

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号