基于VC++的图像着色算法
2014-06-12王继东
张 芸,王继东
(1.滁州职业技术学院 信息工程系,安徽 滁州239000;2.滁州学院 计算机与信息工程学院,安徽 滁州239000)
着色是给图像或视频添加颜色的过程[1],在图像处理及影视制作等领域都有着广泛的应用.早期的着色技术多用于对黑白照片或黑白电影的着色,早在1970年,Wilson Markle就将着色技术用于对阿波罗计划中所拍摄的月球照片着色[2].随着科技的发展,当今的着色技术则多用于彩色图像的特效编辑,如局部色彩改变、图像增强处理等.为了提高着色效果的逼真性,不少科研工作者对着色技术开展了相关研究.Malika Bessedik等人[3]提出了蚁群算法求解图着色的问题,结合禁忌搜索作为局部算子;Fleurent等人[4]将禁忌搜索法与遗传算法相结合,提出了混合遗传算法求解图着色的问题.
本文以微软的C++类库MFC为基础提出了一种新的着色处理算法,该算法根据用户指定的颜色对图像的局部区域进行着色.首先使用Visual C++中的CImage类读入图像,获得图像的高和宽,进而编程获得图像中每个像素点颜色的R、G、B值;判断图像中要进行着色的像素颜色的R、G、B值范围;比较图像中每个像素的R、G、B分量值是否在着色范围内, 定义用户指定的颜色并进行更改,完成着色.
1 CImage类概述
CImage[5]是Visual C++中MFC的一个类,其头文件为atlimage.h,主要用于图片文件的打开、显示与保存.CImage类使图形、图像软件的开发跨越了DDB与DIB概念,处理更为简洁、方便.它提供了读入和保存BMP、JPEG、GIF、TIF与PNG等格式的图像的能力.算法中涉及到的CImage类成员函数包括:
Load:读入指定的图像文件;
Save:按指定类型保存图像文件,文件名中不能省略扩展名;
GetWidth:返回当前图像的宽度(以像素为单位);
GetHeight:返回当前图像的高度(以像素为单位);
GetBPP:返回当前图像的每像素位数(颜色的深度);
GetPixel:返回指定位置像素的颜色;
GetPixelAddress 返回指定像素数据存放位置的存储地址;
SetPixel:设置指定位置像素的颜色;
SetPixelRGB:设置指定位置像素的红、绿、蓝分量.
2 着色算法设计
利用CImage的成员函数读入要着色的图片,获得图像的高度与宽度,进而求出每个像素的R、G、B分量值;判断要着色区域的R、G、B范围;比较图像中每个像素的R、G、B分量值是否在着色范围内, 定义新颜色进行着色.
2.1 获得像素的R、G、B值
使用CImage的Load成员函数读入图片,然后使用GetPixelAddress函数编程访问像素的R、G、B值,代码如下:
CImage?Img;
int array1[10000][10000];
int array2[10000][10000];
int array3[10000][10000];
Img.Load(FilePath);
int?Width?=?Img.GetWidth();//获取图像宽度
int?Height?=?Img.GetHeight();//获取图像高度
int?Widthbytes?=?(Img.GetBPP()*Width+31)/32*4;//获取图像每一行的字节数
LPBYTE?lpBits?=?(LPBYTE)Img.GetPixelAddress(0,Height-1);
for?(int?i=0;i { for?(int?j=0;j { byte?R?=?lpBits[i*Widthbytes+j*3+2]; byte?G?=?lpBits[i*Widthbytes+j*3+1]; byte?B?=?lpBits[i*Widthbytes+j*3]; //?获取j,i处的R、G、B array1[i][j]= (int)R; array2[i][j]= (int)G; array3[i][j]= (int)B; } } 该代码的功能是获得图像文件中的每个像素的R、G、B值,分别存于数组array1、array2、array3中. 以图1为例,要将区域1着色成紫色,将区域2着色成蓝色,将区域3着色成碧绿色,将区域4着色成粉红色. 图1 原始图像 以对区域1着色为例,判断其当前颜色的R、G、B值的范围,即获得该颜色区域内最大的R、G、B值及最小的R、G、B值,这需要知道该区域内的每个像素的R、G、B值进而判断着色范围.查看屏幕上任意颜色的R、G、B值可以利用经常使用的QQ截图功能轻松实现,按下“Ctrl+Alt+A”组合键弹出“截图”提示框,将鼠标移动到所想查看的屏幕颜色上即可获得相应的R、G、B值,如图2所示.记录下区域1内最大的R值是199、G值是255、B值是197,最小的R值是0、G值是239、B值是0.按照同样的方法依次记录下其他区域内的R、G、B值的范围. 图2 查看颜色的R、G、B值 在VC++中定义紫色、蓝色、碧绿色、粉红色四个新颜色,在常用的RGB颜色表中,可查得四种颜色的R、G、B值.根据前面判断的着色区域的R、G、B范围,比较array1、array2、array3中存储的R、G、B值在不在该范围内进行着色.代码如下: SetPixel TempColor1,TempColor2; SetPixel TempColor3,TempColor4; TempColor1.Alpha= 0; TempColor1.Red= 160; TempColor1.Green= 32; TempColor1.Blue= 240; TempColor2.Alpha= 0; TempColor2.Red= 0; TempColor2.Green= 0; TempColor2.Blue= 255; TempColor3.Alpha=0; TempColor3.Red= 127; TempColor3.Green= 255; TempColor3.Blue= 212; TempColor4.Alpha=0; TempColor4.Red=255; TempColor4.Green= 192; TempColor4.Blue= 203; for(i=0;i { for(j=0;j { if( array1[j][i]>=0&&array1[j][i]<=199&&array2[j][i]>=239&&array2[j][i]<=255&&array3[j][i]>=0&&array3[j][i]<=197) Img.SetPixel( i, j,TempColor1); if( array1[j][i]>=0&&array1[j][i]<=205&&array2[j][i]>=235&&array2[j][i]<=255&&array3[j][i]>=225&&array3[j][i]<=255) Img.SetPixel( i, j,TempColor2); if( array1[j][i]>=230&&array1[j][i]<=255&&array2[j][i]>=245&&array2[j][i]<=255&&array3[j][i]>=0&&array3[j][i]<=200) Img.SetPixel( i, j,TempColor3); if( array1[j][i]>=220&&array1[j][i]<=255&&array2[j][i]>=0&&array2[j][i]<=205&&array3[j][i]>=0&&array3[j][i]<=205) Img.SetPixel( i, j,TempColor4); } } 着色后的图像如图3所示. 图3 着色图像 在PC机(英特尔酷睿i5-3230M@2.60 GHz双核、4 G内存、Windows 7系统)的VC6.0开发平台上使用C++语言实现了图像着色算法.图4是一些图片应用算法进行处理的效果图,从中可以看出,算法能够较好地保持原始图片的形状轮廓,将图片重新着色. 图4 实验效果图(图中左图为着色前,右图为着色后) 对图像进行着色可以使图像呈现多样性,使观者获得新鲜的视觉感受.本文提出一种将彩色图片的部分区域按照指定的颜色着色的算法,实验结果表明,算法可提供良好的着色效果,着色后的图像颜色具有较好的真实性和平滑性. 参考文献: [1]Irony R, Cohen-Or D, Lischinski D. Colorization by example[C]//Proceedings of the Sixteenth Eurographics conference on Rendering Techniques. Eurographics Association, 2005:201-210. [2]Horiuchi T. Colorization algorithm using probabilistic relaxation[J]. Image and Vision Computing,2004,22(3):197-202. [3]Bessedik M,Laib R,Drias A B H.Ant colony system for graph coloring problem[C]//Computational Intelligence for Modelling,Control and Automation,2005 and International Conference on Intelligent Agents,Web Technologies and Internet Commerce,International Conference on.IEEE,2005,1:786-791. [4]Fleurent C,Ferland J A.Genetic and hybrid algorithms for graph coloring[J].Annals of Operations Research,1996,63(3):437-461. [5]陆宗骐,金登男.Visual C++.NET图像处理编程[M].北京:清华大学出版社,2006:23-33.2.2 判断着色区域的R、G、B范围
2.3 设置新颜色并进行着色
3 实验结果
4 结论