Reinhard颜色迁移理论基础(RGB与Lab颜色空间转换)与代码实现(附matlab代码)

Posted LLLLnannan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Reinhard颜色迁移理论基础(RGB与Lab颜色空间转换)与代码实现(附matlab代码)相关的知识,希望对你有一定的参考价值。

(在查阅颜色迁移的内容时,发现很多都是用C++写的代码,用matlab写的比较少,所以这里我用matlab整理了一版Reinhard的颜色迁移代码)

一.引言

颜色迁移是图像处理中很有意思的一个应用,可以将一幅图的颜色分布转移到另外一幅图上,使另外一张图也拥有类似的颜色,也可以用来灰度图像上色,在计算机动画、影视编辑和图像风格化渲染中有重要应用。
用生活中的应用举例,假如我们有一张颜色中规中矩的图片,这时有另一张配色好看的图片,希望将这张图的配色用在那张很普通的图片上,就可以用颜色迁移的方法,虽然两张图的结构不同,内容不同,但是依然可以迁移相应的颜色。
利用参考图像(Reference Image)的色彩,对源图像(Source Image)的色彩进行调整,使目标图像得到与参考图像颜色相似的分布,如以下两组图所示:
在这里插入图片描述

二.理论介绍

2.1 颜色迁移

Reinhard提出的颜色迁移方法是在Lab颜色空间上进行的,基于参考图像标准方差的线性变换。常用的RGB彩色空间中,R、G、B三通道有很大的相关性,若某一通道大,则像素的其他通道值也较大,这样如果要用连续的方法改变某一个像素的颜色,必须一前一后修改所有颜色通道,因此不能通过单独改变某通道像素值来改变色彩。而Lab颜色空间的坐标轴间几乎没有相关性,可以在不同的色彩通道中应用不同的方法进行运算,而相互之间不会干扰。因此,在颜色迁移时需要将图像转到Lab颜色空间再进行操作。
此外,图像的均值和标准差是图像最主要最有效的两个特征,因此,可以利用图像Lab三个通道各自的均值和标准差进行颜色处理。假设参考图像三个通道的均值和标准差表示为:在这里插入图片描述,源图像三个通道的均值和标准差表示为:在这里插入图片描述,可以按照下式进行颜色迁移:
在这里插入图片描述

2.2 RGB颜色空间

RGB是最为重要和常见的颜色模型,它建立在笛卡尔坐标系中,以红、绿、蓝三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色,俗称三基色模式。RGB色系坐标中三维空间的三个周分别与红、绿、蓝色相对应,原点对应于黑色,离原点最远的顶点对应于白色,其他颜色落在三维空间中由红、绿、蓝三基色组成的彩色立方体中。如图7所示:
在这里插入图片描述
其他的色彩系统通常以RGB色彩系统为基础,其分量可以描述为RGB三色的线性或非线性函数,RGB色彩系统通过色彩的相加来产生其他颜色,通常称为加色合成法,它是一种视觉感知非线性的彩色空间。

2.3 Lab颜色空间

1976年CIE引入了Lab颜色空间,是在打印机,摄影仪,扫描仪之类的颜色设备的设计中广泛应用的彩色空间,被称为与设备无关的颜色模型。作为彩色空间,Lab有两个重要的优点:第一,Lab清楚的分离了彩色信息,L表示灰度信息,a表示从红色到绿色的范围,b表示从黄色到蓝色的范围。第二,Lab色彩空间中的欧氏距离可以很好的对应于彩色间的感知差别,因为这一特性,Lab彩色空间被认为是感知一致性的(近似成立)。如果一个颜色的L值比是另一个颜色L值的两倍,则第一个颜色的亮度感觉要比第二个颜色亮两倍。

2.4 颜色空间的转换

RGB颜色空间与Lab颜色空间的转换理论上需要借助XYZ颜色空间,但是这里介绍matlab的两个函数,可以实现RGB与Lab的快速转换。
①makecform
matlab色彩转换命令。

cform= makecform('srgb2lab');   %rgb转到Lab
cform=makecform('lab2srgb');   %Lab转到rgb

这里不仅仅是rgb和lab的相互转换,可调用的选择如下:
在这里插入图片描述
②applycform
进行空间转换

rgb_scale=applycform(Lab_scale,cform);

三.代码实现

这里用第二组图进行颜色迁移,迁移代码如下:

clc;
clear;
%% 参考图像
ref=imread('晚霞.jpg');
cform= makecform('srgb2lab');
reflab = applycform(ref,cform);
[m,n,k]=size(reflab);
l = reflab(:,:,1);
a = reflab(:,:,2);
b = reflab(:,:,3);
%求三个通道的均值
l=double(l);
a=double(a);
b=double(b);
lm1=mean(mean(l));
am1=mean(mean(a));
bm1=mean(mean(b));
%求标准方差
sigm1=std2(l);
sigm2=std2(a);
sigm3=std2(b);

%% 源图像
sou=imread('海.jpeg');
cform= makecform('srgb2lab');
soulab = applycform(sou,cform);
l2 = soulab(:,:,1);
a2 = soulab(:,:,2);
b2 = soulab(:,:,3);
%求三个通道的均值
l2=double(l2);
a2=double(a2);
b2=double(b2);
lm2=mean(mean(l2));
am2=mean(mean(a2));
bm2=mean(mean(b2));
%求标准方差
sigm11=std2(l2);
sigm22=std2(a2);
sigm33=std2(b2);

%% 颜色迁移目标图像
l3=zeros(m,n);
a3=zeros(m,n);
b3=zeros(m,n);
for i=1:m
    for j=1:n
        l3(i,j)=(l2(i,j)-lm2)*sigm1/sigm11+lm1;
        a3(i,j)=(a2(i,j)-am2)*sigm2/sigm22+am1;
        b3(i,j)=(b2(i,j)-bm2)*sigm3/sigm33+bm1;
    end
end
Lab_scale=uint8(cat(3,l3,a3,b3));
cform=makecform('lab2srgb');
rgb_scale=applycform(Lab_scale,cform);
figure(1);imshow(rgb_scale);title('迁移后的图');
imwrite(rgb_scale,'迁移后.bmp');

如果觉得本篇文章有帮助到您,希望可以点赞支持,本人还在学习当中,若有错误和问题,欢迎大家给我留言呀~

以上是关于Reinhard颜色迁移理论基础(RGB与Lab颜色空间转换)与代码实现(附matlab代码)的主要内容,如果未能解决你的问题,请参考以下文章

python opencv 利用Lab空间把春天的场景改为秋天

颜色空间模型(HSVLABRGBCMYK)

RGB、CMY、CMYK、YUV、HSV、HSI、LAB颜色空间详解

pytorchtensor张量vector向量numpy array数组image图像RGB空间LAB空间之间相互转换大全

怎样用C语言实现图片的RGB颜色空间向Lab颜色空间的转化??

LAB,RGB,XYZ颜色转换不正确,反之亦然