0. 前言
今天是10.24节,假装在考研过程中百忙中给自己放一个假,好吧只是骗自己的,继续写笔记罢了,读了好多文章和冈萨雷斯老师的书感觉彩色图像处理这一块都不是讲的很细,可能是理论太过于繁琐而实践的时候都已经有封装好的API了吧
1. 彩色空间
1.1 RGB空间
这个是应该是人人都认识的色彩空间了,
在 RGB 模型中,每种颜色出现在红、绿、蓝的颜色光谱分量中。该模型基于笛卡儿坐标系
只不过在实际处理的时候我们都是灰度图合并起来罢了,一般都是三个分量即R、G、B分量,8bit图像值在0-255之间。
事实上,在我们遥感传统所见到的真彩色图像也是种假彩色图像,它是R、G、B图像按照一定的比例混合起来合成一幅灰度图,而只不过这幅灰度图和人眼感受到的真实世界很像,所以我们称其为真彩色图像罢了。
即:
D N = 0.2989 ∗ R + 0.5870 ∗ G + 0.1140 ∗ B DN = 0.2989 ∗ R + 0.5870 ∗ G + 0.1140 ∗ B DN=0.2989∗R+0.5870∗G+0.1140∗B 如此罢了。突然想起了之前一位同学在处理遥感影像的时候发现影像太大没法用MATLAB读取,ENVI直接死机的时候问我怎么做这个真彩色图,后来我和她说用ENVI的band math写一个波段运算把3个分量按比例送进去就行了。我觉得这个"送"是真的很传神,毕竟我喜欢称彩色是一种空间吗,哈哈哈!
1.2 HSI空间
彩色模型是一种彩色感知空间,采用色度(Hue),饱和度(Satutation)和亮度(Intense)直观的描述一种颜色空间。彩色空间基于两个重要的事实:
其一,亮度分量与图像的彩色信息无关;
其二,色度和饱和度分量与人对颜色的感受方式紧密相连。这些特点使得HSI彩色空间成为一种非常重要的以彩色处理为目的颜色空间的选择
顺便记下英文吧,对考研有帮助的!
色调和饱和度在HSI颜色模型中,点是任意颜色点。那个与红轴的夹角表示色调,矢量的长度为饱和。这个所有这些平面上所有颜色的强度都是由平面在垂直强度轴上的位置给出的
上面两段话是引自一篇硕士论文以及冈萨雷斯老师的书。
呃…其实感觉说了和没说没啥区别,毕竟通常都有封装好的API,如果实在没API自己写几个判断也能转化过来。
1.3 RGB和HIS的转化
虽然俺确信这个百分之百不会考,但是既然写了文章就写下吧。
1.3.1 从RGB到HSI
H = { θ , B ≤ G 360 − θ , B > G H= \begin{cases} \theta, & B \le G \\ 360 - \theta, & B>G \end{cases} H={θ,360−θ,B≤GB>G其中
θ = arccos 1 2 [ ( R − G ) + ( R − B ) ] [ ( R − G ) 2 + ( R − B ) ( G − B ) ] 1 / 2 \theta = \arccos { \frac{ \dfrac{1}{2} [ (R-G)+ (R- B)] }{ [(R-G)^2 + (R-B)(G-B)]^{1/2}} } θ=arccos[(R−G)2+(R−B)(G−B)]1/221[(R−G)+(R−B)]
饱和度(S)由下列公式给出
S = 1 − 3 ( R + G + B ) [ min ( R , G , B ) ] S = 1 - \frac{3}{(R+G+B)}[\min(R,G,B)] S=1−(R+G+B)3[min(R,G,B)]
强度(I)由下列公式给出
I = 1 3 ( R + G + B ) I = \dfrac{1}{3} (R+G+B) I=31(R+G+B)
1.3.2 从HSI到RGB
在 [ 0 , 1 ] [0,1] [0,1]内给出HSI值,现在我们想要在相同的值域找到对应的RGB值。可用的公式取决于H的值。在原色分隔中有3个相隔 12 0 ∘ 120^{\circ} 120∘扇形区间。我们从H乘以 36 0 ∘ 360^{\circ} 360∘开始,这时的色调值调回到范围 [ 0 ∘ , 36 0 ∘ ] [0^{\circ},360^{\circ}] [0∘,360∘]
RG扇区 ( 0 ∘ ≤ H ≤ 12 0 ∘ ) (0^{\circ} \le H \le 120^{\circ}) (0∘≤H≤120∘):当 H H H的值在该扇区中时,RGB分量由以下公式给出。
B = I ( 1 − S ) B = I(1-S) B=I(1−S) R = I [ 1 + S cos H cos ( 6 0 ∘ − H ) ] R = I[1 + \frac{S\cos H}{\cos(60^{\circ} -H)}] R=I[1+cos(60∘−H)ScosH] G = 3 I − ( R + B ) G = 3I - (R+B) G=3I−(R+B)
GB扇区 ( 12 0 ∘ ≤ H ≤ 24 0 ∘ ) (120^{\circ} \le H \le 240^{\circ}) (120∘≤H≤240∘):当 H H H的值在该扇区中时,RGB分量由以下公式给出,则从 H H H中减去 12 0 ∘ 120^{\circ} 120∘,即
H = H − 12 0 ∘ H = H - 120^{\circ} H=H−120∘ R = I ( 1 − S ) R = I(1-S) R=I(1−S) G = I [ 1 + S cos H cos ( 6 0 ∘ − H ) ] G = I[1 + \frac{S\cos H}{\cos(60^{\circ} -H)}] G=I[1+cos(60∘−H)ScosH] B = 3 I − ( R + G ) B = 3I - (R+G) B=3I−(R+G)
BR扇区 ( 24 0 ∘ ≤ H ≤ 36 0 ∘ ) (240^{\circ} \le H \le 360^{\circ}) (240∘≤H≤360∘):当 H H H的值在该扇区中时,RGB分量由以下公式给出,则从 H H H中减去 24 0 ∘ 240^{\circ} 240∘,即
H = H − 24 0 ∘ H = H - 240^{\circ} H=H−240∘ G = I ( 1 − S ) G = I(1-S) G=I(1−S) B = I [ 1 + S cos H cos ( 6 0 ∘ − H ) ] B = I[1 + \frac{S\cos H}{\cos(60^{\circ} -H)}] B=I[1+cos(60∘−H)ScosH] R = 3 I − ( G + B ) R = 3I - (G+B) R=3I−(G+B)
其实可以看到就是一个过圆环走规律的过程,缺谁我那么一个分量值就是 I ∗ ( 1 − S ) I*(1-S) I∗(1−S)然后按照RGB的顺序接下面的公式就行了。
我还特地设了个颜色好看一些~~记住结论算了,不记应该也没啥关系。
2. HSI空间进行直方图均衡化
因为考题里有这道题,查了半天,发现讲的实在少的可怜,还好找到了一篇硕士论文还有pitas在1996年发表的paper,于是也自己动手实践了一下,理解了。
问题:什么是HSI颜色模型,如何在HSI颜色空间保持图像色度(H)不变的情况下,对彩色图像做直方图均衡化处理
实际上,对彩色图像做直方图均衡化有好多种思路,
第一种人们都会想到的思路就是对直接抽取R、G、B的分量分别做一个直方图均衡化,然后就我的北登就可怜了,看下面的图
可以看到这种方法会导致彩色色调的改变,所以事实上,这种方法并不是很推荐,但是运行起来的效率会非常的高。
Although the R G B space provides a straightforwardway to display color images, it is not always the best choice for processing and analysis. One of its disadvantages is its inability to handle the perceptual properties of colors, such as intensity, hue, or saturation. The H S I color space has primaries H (hue), S (saturation), and I (intensity) and corresponds directly to the perceptual attributes of colors
贴一段pitas的原话吧,这是他指出的在RGB空间直接做直方图均衡化的显著问题(自己翻译吧~-~)。
第二种方法是pitas在1996年提出的,将图像先送入HSI空间我仅仅对S和I分量进行直方图处理或者仅仅对其做变化,事实上,我按pitas的方法做了一次有点小问题,毕竟每幅图不一样。
HSI的值都是介于0-1之间的,然后pista提出了对 I I I 和 S S S 做处理的方法。
就是下面三个公式
f I ( I ) = { 12 I 2 哈 哈 哈 哈 for 0 ≤ I ≤ 0.5 12 ( 1 − I ) 2 哈 哈 哈 for 0.5 ≤ I ≤ 1 f_I(I) = \begin{cases}12I^2 \phantom{哈哈哈哈} & \text{for} \ 0 \le I \le 0.5 \\ 12(1-I)^2 \phantom{哈哈哈} & \text{for} \ 0.5 \le I \le 1 \end{cases} fI(I)={12I2哈哈哈哈12(1−I)2哈哈哈for 0≤I≤0.5for 0.5≤I≤1
这个是单独对 I I I 进行处理的公式,根据范围来处理就可。
f s ( S ) = 6 S − 6 S 2 哈 哈 哈 哈 哈 for 0 ≤ S ≤ 1 f_s(S) = 6S - 6S^2 \phantom{哈哈哈哈哈} \text{for} \ 0 \le S \le 1 fs(S)=6S−6S2哈哈哈哈哈for 0≤S≤1这个是单独对 S S S 进行处理的公式,根据范围来处理就可。
f I S ( I , S ) = { 6 S 哈 哈 for S ≤ 2 I , I ∈ [ 0 , 1 2 ] 0 for S > 2 I , ∈ [ 0 , 1 2 ] 6 S for S ≤ 2 ( 1 − I ) , I ∈ [ 1 2 , 1 ] 0 for S > 2 ( 1 − I ) , I ∈ [ 1 2 , 1 ] f_{IS}(I,S) = \begin{cases} 6S \phantom{哈哈} &\text{for} \ S \le2I, I \in[0,\frac{1}{2}] \\ 0 & \text{for} \ S \gt 2I, \in[0,\frac{1}{2}] \\ 6S & \text{for} \ S \le 2(1-I),I \in[\frac{1}{2},1] \\ 0 & \text{for} \ S \gt 2(1-I),I\in[\frac{1}{2},1] \end{cases} fIS(I,S)=⎩⎪⎪⎪⎨⎪⎪⎪⎧6S哈哈06S0for S≤2I,I∈[0,21]for S>2I,∈[0,21]for S≤2(1−I),I∈[21,1]for S>2(1−I),I∈[21,1]这里是对 I , S I,S I,S 进行联合处理的公式,也是根据范围来赋值处理就可。
我觉得这个系数应该用4才对,这样能保证你的I在0-1之间,当然我也用过了12这个系数(想想是这样的),结果看下面:
第5副图是用4做的系数,第6副图用的是12做的系数,同时第六幅图还对S分量也做了处理,感觉就是有点问题,但是不知道哪里有问题,毕竟马克思教我们要具体问题具体分析吗 ^ - ^
就是可怜我的北登被整成这样了,第三第四幅图是我用MATLAB的histeq和adathisteq对I分量做了直方图均衡化的结果。
做完后再把原图从HSI空间转回到RGB空间显示,但是效果不好,可能是图的问题吧,也可能像pitas在原文说的这种方法会出现原来图像不存在的I分量,即过饱和的I,导致转回RGB空间的时候出现异常。
3. 代码
%coding = UTF8
%测试直方图均衡化的方法
%2020-10-23
%version1.0
%by neverland!%读取图像im = imread('hh.jpg');
%在rgb通道作直方图均衡化r = im(:,:,1);g = im(:,:,2);b = im(:,:,3);r_ = histeq(r);g_ = histeq(g);b_ = histeq(b);im_ = cat(3,r_,g_,b_);
%在hsi通道作直方图均衡化im1 = rgb2hsv(im);H = im1(:,:,1);S = im1(:,:,2);I = im1(:,:,3);
%复制变量I_ = I;I_2 = I;S_ = S;
%对S变量进行处理index3 = (S<1 & S>0);S_(index3) = 6*S(index3) - S(index3).^2;
%利用MATLAB自带的直方图均衡化I_ = adapthisteq(I);I_1 = histeq(I);
%利用pitas的理论index1 = I<0.5;index2 = I>0.5;I_2(index1) = 12*I(index1).^2;I_2(index2) = 12*(1-I(index2)).^2;
%第一幅图histeqim1_ = cat(3,H,S,I_); im1_ = hsv2rgb(im1_);
%第二幅图用的是adathisteqim2 = cat(3,H,S,I_1);im2_ = hsv2rgb(im2);
%第三幅图用1996年的理论im3 = cat(3,H,S,I_2);im3_ = hsv2rgb(im3);%再处理一次;im4 = cat(3,H,S_,I_2);im4_ = hsv2rgb(im4);
%分开显示下subplot(2,3,1);imshow(im);title('原始图像','FontSize',20);subplot(2,3,2);imshow(im_);title('RGB空间内作直方图均衡化','fontsize',20);subplot(2,3,3);imshow(im1_);title('HSI空间内作直方图均衡化','fontsize',20);subplot(2,3,4);imshow(im2_);title('HSI空间内作直方图均衡化','fontsize',20);subplot(2,3,5);imshow(im3_);title('HSI空间内作直方图均衡化','fontsize',20);subplot(2,3,6);imshow(im4_);title('HSI空间内作直方图均衡化','fontsize',20);
其实adathisteq是对对比度受限的图做直方图均衡化的方法,
而histeq是不加限制的做均衡化,当然是你人为选择方法的,而且我也不知道直接对I分量做直方图均衡化合不合理,网上blog好少,文献没读清楚,后续再改进吧。
4. 参考文献
[1].任洁. 彩色图像增强算法的研究与实现[D]. 武汉理工大学, 2013.
[2].Pitas I , Kiniklis P . Multichannel techniques in color image enhancement and modeling[J]. IEEE Transactions on Image Processing, 1996, 5(1):168-171.
[3].阮秋琦. 数字图像处理学[M]. 电子工业出版社, 2007.
最后,我将在另外一个账号写博客,有兴趣的可以关注。