APP下载

基于VC++的图像着色算法

2014-06-12王继东

通化师范学院学报 2014年10期
关键词:滁州着色像素

张 芸,王继东

(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中.

2.2 判断着色区域的R、G、B范围

以图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值

2.3 设置新颜色并进行着色

在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 着色图像

3 实验结果

在PC机(英特尔酷睿i5-3230M@2.60 GHz双核、4 G内存、Windows 7系统)的VC6.0开发平台上使用C++语言实现了图像着色算法.图4是一些图片应用算法进行处理的效果图,从中可以看出,算法能够较好地保持原始图片的形状轮廓,将图片重新着色.

图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.

猜你喜欢

滁州着色像素
ImCn的循环区间全着色
《滁州西涧》(草书)
像素前线之“幻影”2000
蔬菜着色不良 这样预防最好
苹果膨大着色期 管理细致别大意
陆黛灵书法作品
“像素”仙人掌
10位画家为美术片着色
ÉVOLUTIONDIGAE Style de vie tactile
录唐·韦应物诗《滁州西涧》(草书)