数字图像处理11-rgb,hsi等色彩空间转换
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
end I = (R + G + B)/3; disp("my rgb2hsi"); disp(H); disp(S); disp(I);
这是我自己编写的 rgb 转 hsi 的函数。经过网络上的查询,rgb 转 hsi 的算法非常多,但是常 见的有 5 种,具体如下图所示:
每种算法算出来的结果有微小的差异,但是基本上都可以较为准确的表现原本的 rbg 颜色。 因此程序中就采用了第一种算法,但是也进行了微小的改动。首先来解释一下经常出现的 eps 这个值。这个值是 MATLAB 自带的最小计数单位,也就是说 MATLAB 自身在数学层面上 无法对一个数字进行小于 eps 的改变。比如说 1+eps/3 和 1 显然不相等,但是在 MATLAB 中 1=1+eps/3,因为 eps/3MATLAB 无法计数,就当做 0 处理。在程序中可以看出,所有的 eps 都出现在了分母上, 也就是避免了分母为 0 最后没有得数的情况。 剩余的部分就是实现算法 1 中公式的过程,很显然 num 是分子,den 是分母,最后 hsi 都得到了想要的结果。此外还 要说明一下 min 这个函数只能传递两个参数,因此不能采用 min(a,b,c)的方式来求 3
这里生成了一个 cform 类,和之前的 tform 类似,这个函数是用来进行色彩空间转换的。
srgb2cmyk 这个参数代表转换类型是 rgb 到 cmyk,随后函数会返回一个[x][y][4]的矩
阵, 存储得到的 cmyk 颜色信息。 但是通过横向比较, 发现 MATLAB 自己生成的 cmyk 颜色, Photoshop 生成的 cmyk 颜色,虽说指代的是同一个 rgb 值,但是自身的值都是有所差别 的。产生这个现象的原因要通过多个角度去分析。第一个就是前面说过的,本身这个 cmyk 颜色的用途是在打印上,因此不同的打印环境就需要不同的调整,相对的 cmyk 值也会存在 差异。因此不同的软件,由于适用方向的不同,也会通过不同的算法求出合适的 cmyk 值。 其次,在打印的过程中,除了使用 cmyk 之外,还经常使用一种“专色”来进行补偿。如亮 橙色,特别的金属粉末等。为了适应这些东西的加入,cmyk 值也需要进行相应的调整。因 此不同的软件求得的 cmyk 结果不同。 最后来看一下我自己写的 cmyk 转 rgb 的程序:
这次作业的要求很简单,通过网上查询的方法了解 rgb 颜色与 hsi,cmyk 颜色转换的公式。 自己编写颜色互相转换的程序,同时与 MATLAB 自带的转换程序进行对比,再与 ps 中的颜 色选择界面的数值进行对比。但是不同的软件的颜色转换算法是不同的,也就是说同一个 rgb 颜色,不同的算法计算出来的 hsi 与 cmyk 的值都是不一样的。因此这里以表格的形式, 将各个数值列举出来,以便之后进行讨论和分析。表格如下:
%my hsi2rgb i=I/255.0; if((0<=h)&&(h<2*pi/3)) b=i*(1-s); r=i*(1+s*cos(h)/cos(pi/3-h)); g=3*i-r-b; end
if(2*pi/3<=h&&h<4*pi/3) r=i*(1-s); h=h-2*pi/3; g=i*(1+s*cos(h)/cos(pi/3-h)); b=3*i-r-g; end if(4*pi/3<=h&&h<2*pi) g=i*(1-s); h=h-4*pi/3; b=i*(1+s*cos(h)/cos(pi/3-h)); r=3*i-g-b; end disp("my hsi2rgb"); disp(r*255); disp(g*255); disp(b*255);
%matlab's rgb2cmyk A(1,1,1)=R/255; A(1,1,2)=G/255; A(1,1,3)=B/255; cform = makecform('srgb2cmyk'); CMYK = applycform(A,cform); disp("matlab's rgb2cmyk") disp(CMYK(:,:,1)*100); disp(CMYK(:,:,2)*100); disp(CMYK(:,:,3)*100); disp(CMYK(:,:,4)*100);
16.4706 64.9836 63.7049 0.0427 0.3113 67 65 0
自己编写 CMYK 转 RGB R 0 255 150 121 0 255 200 99 G 0 255 100 213 B
首先来说明一下要用到的这个 hsi 色彩空间。这个色彩空间和 rgb 色彩空间比较起来有独特
的优势。很容易得到的结论,就是 rgb 颜色对于人眼来说很难直观的分别,随便说一个 rgb 值,在正式使用其上色之前,无法对其进行直观上的理解,之后也很难做出“深一点”“灰 一点”这样方向的调整。但是 hsi 则不一样,h 代表色相,就是颜色具体的色彩倾向,s 代 表饱和度。饱和度越高,色彩越鲜艳,反之就越灰,饱和度为 0 时色彩空间表示的就是就是 灰度。而 i 值代表强度,也称作明度,也就是颜色明亮的程度。i 值越大颜色越亮,i 为 255 时就代表白色,为 0 时就代表黑色。这个空间与 hsv 空间也是存在部分相同点与差异的,之 后会提到二者的相似点与区别。 这里一共有四组数据,一组全为最小值,一组全为最大值,一组是比较整的随机参数,一组 是零散的随机参数。我们来配合运算的结果以及 MATLAB 中的程序来说明,这些数据呈这样 的原因。
Rgb 转 cmyk 的公式是很简单的,程序中表现的已经很清楚了,因此就不再进行更多讲解。 但是这个算法本身存在一些漏洞,可以看到在 rgb 都得 0 的时候,这个算法算出来的结果是 0,0,0,100,也就是说黑色对应的是全部用黑色墨水填充。在 rgb 都得 255 时对应白色,cmyk 值都为 0,代表不进行打印色彩输出,也就是保留纸张的白色的效果。其他 rgb 的时候程序 也换算为了对应的 cmyk 值来体现这个颜色。之后这个程序是 MATLAB 自带的 rgb 转 cmyk 的函数:
个数中的最小值。 首先我们来纵向比较一下,四组不同的 rgb 值对应的 hsi 值的差别。很明显 hsi 色彩空间中 同一个颜色是可以由多个数值组合来表示的。 比如第一组值, 只要 i 为 0, hs 无论取什么值, 都是表示黑色,同理只要 i 取 255 就一定是表示白色。因此这里根据算法不同多种答案都是 正确的。 随后我们来横向比较一下。这里先来付上 MATLAB 自带的 rgb 转 hsv 的程序:
%my rgb2hsi R=xxx; G=xxx; B=xxx; r=R/(R+B+G+eps); g=G/(R+B+G+eps); b=B/(R+B+G+eps); num = 0.5*((r - g) + (r - b)); den = sqrt((r - g).^2 + (r - b).*(g - b)); theta = acos(num./(den + eps)); if(b<=g) h=theta; else h=2*pi-theta; end H=h*180/pi; num = min(min(r, g), b); s = 1 - 3.* num; S=s*100; if(S==0) H=0;
%my rgb2cmyk c=255-R; m=255-G; y=255-B; k=min(min(c,m),y); c=(c-k); m=(m-k); y=(y-k); C=c/255.0*100; M=m/255.0*100; Y=y/255.0*100; K=k/255.0*100; disp("my rgb2cmyk"); disp(C); disp(M); disp(Y); disp(K);
自己编写 HSI 原始 RGB R 0 G 0 B 0 自己编写转为 HSI H 90 0 S 100 0 33.333 150 200 100 90 3 150 90 50 53.521 251.5789 1 213 252 54 84% 121 99 213 200 90 50 78% 150 200 100 I 0 255 MATLAB 自带转为 HSV PS 转为 HSV H 0 0 S 0 0 V 0 H S 0 0 V 0 R 0 转 RGB G 0 B 0
%my cmyk2rgb RR=255-c-k; GG=255-m-k; BB=255-y-k; disp("my cmyk2rgb"); disp(RR); disp(GG); disp(BB);
和之前 rgb 求 cmyk 的程序刚好做了相反的逆运算,在这种情况下自然可以完美的完成转
换。但是对于其他 rgb 转 cmyk 的算法这个程序就只能算出估计值。由于各个程序采用的 生成 cmyk 算法是不一样的,因此完成这一步转换的算法也是不一样的,需要具体问题具体 分析。但是在目前的情况下这种算法无疑是最佳的。
这里不难看出,hsi 转 rgb 的函数是分段的,其具体公式如下:
由于本身 hsi 色彩空间,h 有 360°的变化区间,这个区间中可以分为均等的三份,每一份 中的色相都有一定的偏向性。而在向 rgb 色彩空间转换的过程中,我们得到一组 xyz 后,其 对应的值就是这个色相区间中的一个主要颜色的分量以及两个辅助颜色的分量值。 因此这种 分段算法可以准确的还原 rgb 值,在上面的表格中也可以看出还原的结果都是非常准确的。 随后来看 rgb 和 cmyk 色彩空间互相转换的部分。 Cmyk 色彩空间不同于熟知的色光叠加来表 示颜色的表示方法,其多用于打印过程中,一般来说 cmy 代表颜料的红蓝黄三原色,而 k 代表 black-黑色。原本 cmy 颜料的三原色通过不同比例的混合可以合成所有的颜色,但是由 于颜料本身不纯,黑色不能单纯靠三原色混合得到。因此这里需要用 black 也就是黑色墨水 来进行补偿,来确保达到纯正的颜色。我自己编写的转换程序如下:
255 255 255
255 0 0 100% 255 255 255
250.479 31.408 144.333 121 99 213 9 8 3
自己编写转为 CMYK C 0 0 0 0 M 0 0 Y 100 0 K C
MATLAB 自带转为 CMYK M Y K
Pຫໍສະໝຸດ Baidu 转为 CMYK C M Y K
70.8324 65.3819 66.627 93.4951 93 88 89 80 0.0031 0.3418 0.2609 0.0015 0 0 0 0
19.6078 0
39.2157 21.5686 42.2263 0.5447 73.7499 2.8244 49 6
73 0 0
36.0784 44.7059 0
%matlab's rgb2hsv A(1,1,1)=R; A(1,1,2)=G; A(1,1,3)=B; X=rgb2hsv(A); disp("matlab's rgb2hsv"); disp(X(1,1,1)*360); disp(X(1,1,2)*100); disp(X(1,1,3));
很简单,但是这与作业中的要求有些许不一致。因为本身 MATLAB 并不自带 rgb 转 hsi 色彩 空间的函数,但是 hsv 色彩空间中的值有一部分对 hsi 有参考价值。首先二者 h 的取值,在 我自己编写的程序, MATLAB 自带的程序以及 ps 中转化的结果都是很相似的, 也就是说这两 种色彩空间在色调上的表现方法是基本一致的。但是 s 的值由于本身计算公式就不一致,在 hsv 色彩空间中 s 的值为(max-min)/max,因此二者存在较大的差异。同理对于 i 和 v,他 们的命名就存在区别,因此数值上自然也有区别。v 的取值是 rgb 值中最大的一个,而 i 则 是其平均值,因此可以发现 MATLAB 自带的转换函数与 ps 中转换的值是一致的,但是与我 自己编写的转换值是不一致的。 随后我们来看把 hsi 色彩转为 rgb 值的程序: