红眼消除多媒体作业附matlab程序Word文件下载.docx
《红眼消除多媒体作业附matlab程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《红眼消除多媒体作业附matlab程序Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
1.1RGB模型
RGB模型也称为加色法混色模型。
它是以RGB三色光互相叠加来实现混色的方法,因而适合于显示器等发光体的显示。
其混色规律是:
以等量的红、绿、蓝基色光混合。
设颜色传感器把数字图像上的一个像素编码成(R,G,B),每个分量量化范围为[0,255]共256级。
因此,RGB模型可以大约表示成1670万种颜色。
这足以表示自然界的任一颜色,故又称其为24位真彩色。
RGB模型与显示器等设备有着很好的对应关系,RGB显示器中,有三种荧光粉能够分别发出红、绿、蓝三种颜色,三个相邻的荧光点构成一个像素,这些荧光点受到三束强度分别为c1、c2、c3的电子束的轰击,会发生不同的亮度,通过物理上的叠加或混合,使可显示出相应的颜色。
1.2HSI模型
HSI模型是美国色彩学家蒙塞尔于1915年提出的,它反映了人的视觉系统感知彩色的方式,以色调、饱和度和强度三种基本特征量来感知颜色。
色调H(Hue)与光波的波长有关,它表示人的感官对不同的颜色的感受,如红色、绿色、蓝色等,它可以表示一定的范围的颜色,如暖色、冷色等。
饱和度S(Saturatuin)表示颜色的纯度,纯光谱色是完全饱和的,加入白光会稀释饱和度。
饱和度越大,颜色看起来就会越鲜艳,反之亦然。
强度I(Intensity),对应成像亮度和图像灰度,是颜色的明亮程度。
HSI模型的建立是基于两个重要的事实:
a、I分量与图像的彩色信息无关;
b、H和S分量与人感受颜色的方式是紧密相联的。
这些特点使得HIS模型非常适合彩色特性检测与分析。
HSI色彩空间和RGB色彩空间只是同一物理量的不同表示法,因而它们之间存在着如下转换关系。
(l)RGB转换到HSI
对任何3个[0,l]范围内的RGB值,其对应的HSI空间中的ISH分量
的计算公式如式(1-1)下所示:
式(1-1)
式中
式中计算出的H值的范围为[0°
,180°
],对应于G≥B.在G<
B时,H值大于180°
只要令H=360°
-H,即可把H转换到[180°
360°
]区间,所以若将两种情况都考虑上,则由式可得H是在[O°
]范围内.当s=0时对应无色彩的中心点,这时H就没有意义,此时定义H为O,当I=O时,S也没有意义"
(2)HSI转换到RGB
假设s、I的值在[0,1]之间,R、G、B的值也在[0,l]之间,则HSI转换到RGB的计算公式如式(1-2)、式(1-3)和式(1-4)所示(分成三个区间以利用对称性)。
当H在[0°
120°
]之间:
式(1-2)
当H在[120°
240°
式(1-3)
当H在[240°
式(1-4)
2.自动红眼消除
本实验的思路是先将获取自数码相机中的红眼图像,由RGB模型转换到HSI模型下,再检测出红色通道的值,当它大于某个设定值后,让s通道的值为0,处理后的图像再转到RGB模型下。
下面图2.1至图2.4是由这个方法试验出来的效果:
图2.1小狗处理前图2.2小狗处理后
图2.3人脸处理前图2.4人脸处理后
从上述实验的例子可以看出,本方法虽然简单,处理某些图像有点效果,但仅仅只限于红眼红色值远远大于其它部位的情况,所以处理之前需要对RGB图像的R通道进行检测。
所以此方法还远达不到所谓的自动处理的要求。
3.手动选定区域红眼处理
本方法需要人工手动选定照片红眼区域,需要操作细心,可分多次选定区域。
选定区域后,把RGB图像转换到HSI下进行处理,跟前面方法一样,对于红眼部分S通道为0,再把处理过的图像转换到RGB模型下。
下面图3.1至图3.4是该方法的实验效果。
图3.1小狗处理前图3.2小狗处理后
图3.3人脸处理前 图3.4人脸处理后
上述实验可以看出,本方法效果明显,但操作麻烦,由于选取红眼区域全靠手工,而选取的方式是确定一些点,用这些点围成一个圈,来选取红眼区域。
有时候选定一个红眼区域往往需要几遍才能成功。
红眼区域一般是圆的,或者椭圆状的,这些手工选的点围成的圈是个多边形,所以想把红眼全包进去肯定会有一定的误差,带来一些不必要的处理。
4.总结
通过这次红眼处理,使我对图像处理有了新的认识,图像处理看似简单,实则不易。
本次实验没用到比较难的算法,只是简单的实现了手动去红眼。
本次设计用matlab编程,这样我对matlab的相关功能又有了一次熟悉和训练的机会,不但把一些以前运用过的知识温习了一遍,更是在这次去红眼编程实现的训练中学习到了更多的函数,感受到了matlab的强大之处。
本次设计还有很多不足之处,现在已经出现了很多自动去红眼的解决方案。
以后需要多加学习别人的先进经验,了解最新解决思路,争取以后我也能提出一种自动去红眼的方法。
附程序
functionhsi=rgb2hsi(rgb)
%RGB转换到HSI
rgb=im2double(rgb);
r=rgb(:
:
1);
g=rgb(:
2);
b=rgb(:
3);
%Implementtheconversionequations.
num=0.5*((r-g)+(r-b));
den=sqrt((r-g).^2+(r-b).*(g-b));
theta=acos(num./(den+eps));
H=theta;
H(b>
g)=2*pi-H(b>
g);
H=H/(2*pi);
num=min(min(r,g),b);
den=r+g+b;
den(den==0)=eps;
S=1-3.*num./den;
H(S==0)=0;
I=(r+g+b)/3;
%Combineallthreeresultsintoanhsiimage.
hsi=cat(3,H,S,I);
functionrgb=hsi2rgb(hsi)
%HSI转换到RGB
H=hsi(:
1)*2*pi;
S=hsi(:
I=hsi(:
R=zeros(size(hsi,1),size(hsi,2));
G=zeros(size(hsi,1),size(hsi,2));
B=zeros(size(hsi,1),size(hsi,2));
%RGsector(0<
=H<
2*pi/3).
idx=find((0<
=H)&
(H<
2*pi/3));
B(idx)=I(idx).*(1-S(idx));
R(idx)=I(idx).*(1+S(idx).*cos(H(idx))./cos(pi/3-H(idx)));
G(idx)=3*I(idx)-(R(idx)+B(idx));
%BGsector(2*pi/3<
4*pi/3).
idx=find((2*pi/3<
4*pi/3));
R(idx)=I(idx).*(1-S(idx));
G(idx)=I(idx).*(1+S(idx).*cos(H(idx)-2*pi/3)./cos(pi-H(idx)));
B(idx)=3*I(idx)-(R(idx)+G(idx));
%BRsector.
idx=find((4*pi/3<
=2*pi));
G(idx)=I(idx).*(1-S(idx));
B(idx)=I(idx).*(1+S(idx).*cos(H(idx)-4*pi/3)./cos(5*pi/3-H(idx)));
R(idx)=3*I(idx)-(G(idx)+B(idx));
rgb=cat(3,R,G,B);
rgb=max(min(rgb,1),0);
%本程序的功能是去除用户指定区域的红眼
clearall;
clc;
%内存清理
[file,path]=uigetfile('
*.bmp'
'
Image'
);
%获取图像名及存储位置
ifisequal(file,0)%未选择图像,退出
disp('
取消选择'
else
file=[path,file];
%获取图像路径
[]=imread(file);
%读取图像
ifndims()~=3%是否为灰度图像,是退出并显示图像
非彩色图像'
imshow();
else%去红眼操作
goagain=1;
%操作控制变量,1进行操作
change=2;
%参数更改控制变量,1更改预设参数
h1=1/6;
%预设对rol区域内-pi/3<
H<
pi/3,S>
0.2的像素点进行去红眼操作
h2=1/6;
s=0.2;
fprintf('
预设对rol区域内-pi/3<
0.2的像素点进行去红眼操作,即令S=0\n'
)
whilegoagain==1
fprintf('
是否修改H、S预设值:
1、是;
2、否\n'
change=input('
请选择:
'
%是否更改预设参数
whilechange~=1&
change~=2
错误命令!
请重新输入~~\n'
end
ifchange==1%预设参数更改
h1=input('
请输入H下限值(-2*pi/3~0):
)/pi/2;
while(h1>
0)||(h1<
-1/3)
end;
h2=input('
请输入H上限值(0~2*pi/3):
while(h2<
0)||(h2>
1/3)
)/pi/2
s=input('
请输入S值(0~1):
while(s>
1)||(s<
0)
B=roipoly();
%绘制要去红眼的rol区域,返回与大小相同的逻辑矩阵B,rol内像素值为1
%用户通过鼠标绘制任意多边形,点左键绘制顶点,点右键绘制最后的一
%个顶点
[hsi,H,S,I]=rgb2hsi();
%rgb->
hsi
rol=find(B~=0);
%获取rol内像素数
[L,M]=size(rol);
fori=1:
L%遍历rol内像素,判定-1/6<
h<
1/6且s>
0.2为红眼,并令s=0以去除红眼
if(((H(rol(i))>
0)&
(H(rol(i))<
h2))|((H(rol(i))>
(1-abs(h1)))&
1)))
ifS(rol(i))>
s
S(rol(i))=0;
I(rol(i))=0;
hsi=cat(3,H,S,I);
%生成去红眼后的hsi图像
rgb=hsi2rgb(hsi);
%hsi->
rgb
imshow(rgb);
%显示去红眼后的rgb图像
是否继续操作:
%提示是否继续操作
goagain=input('
whilegoagain~=1&
goagain~=2
ifgoagain==1
;
clf;
end;