張 蕓,王繼東
(1.滁州職業(yè)技術(shù)學(xué)院 信息工程系,安徽 滁州239000;2.滁州學(xué)院 計算機(jī)與信息工程學(xué)院,安徽 滁州239000)
著色是給圖像或視頻添加顏色的過程[1],在圖像處理及影視制作等領(lǐng)域都有著廣泛的應(yīng)用.早期的著色技術(shù)多用于對黑白照片或黑白電影的著色,早在1970年,Wilson Markle就將著色技術(shù)用于對阿波羅計劃中所拍攝的月球照片著色[2].隨著科技的發(fā)展,當(dāng)今的著色技術(shù)則多用于彩色圖像的特效編輯,如局部色彩改變、圖像增強(qiáng)處理等.為了提高著色效果的逼真性,不少科研工作者對著色技術(shù)開展了相關(guān)研究.Malika Bessedik等人[3]提出了蟻群算法求解圖著色的問題,結(jié)合禁忌搜索作為局部算子;Fleurent等人[4]將禁忌搜索法與遺傳算法相結(jié)合,提出了混合遺傳算法求解圖著色的問題.
本文以微軟的C++類庫MFC為基礎(chǔ)提出了一種新的著色處理算法,該算法根據(jù)用戶指定的顏色對圖像的局部區(qū)域進(jìn)行著色.首先使用Visual C++中的CImage類讀入圖像,獲得圖像的高和寬,進(jìn)而編程獲得圖像中每個像素點(diǎn)顏色的R、G、B值;判斷圖像中要進(jìn)行著色的像素顏色的R、G、B值范圍;比較圖像中每個像素的R、G、B分量值是否在著色范圍內(nèi), 定義用戶指定的顏色并進(jìn)行更改,完成著色.
CImage[5]是Visual C++中MFC的一個類,其頭文件為atlimage.h,主要用于圖片文件的打開、顯示與保存.CImage類使圖形、圖像軟件的開發(fā)跨越了DDB與DIB概念,處理更為簡潔、方便.它提供了讀入和保存BMP、JPEG、GIF、TIF與PNG等格式的圖像的能力.算法中涉及到的CImage類成員函數(shù)包括:
Load:讀入指定的圖像文件;
Save:按指定類型保存圖像文件,文件名中不能省略擴(kuò)展名;
GetWidth:返回當(dāng)前圖像的寬度(以像素為單位);
GetHeight:返回當(dāng)前圖像的高度(以像素為單位);
GetBPP:返回當(dāng)前圖像的每像素位數(shù)(顏色的深度);
GetPixel:返回指定位置像素的顏色;
GetPixelAddress 返回指定像素數(shù)據(jù)存放位置的存儲地址;
SetPixel:設(shè)置指定位置像素的顏色;
SetPixelRGB:設(shè)置指定位置像素的紅、綠、藍(lán)分量.
利用CImage的成員函數(shù)讀入要著色的圖片,獲得圖像的高度與寬度,進(jìn)而求出每個像素的R、G、B分量值;判斷要著色區(qū)域的R、G、B范圍;比較圖像中每個像素的R、G、B分量值是否在著色范圍內(nèi), 定義新顏色進(jìn)行著色.
使用CImage的Load成員函數(shù)讀入圖片,然后使用GetPixelAddress函數(shù)編程訪問像素的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;//獲取圖像每一行的字節(jié)數(shù)
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值,分別存于數(shù)組array1、array2、array3中. 以圖1為例,要將區(qū)域1著色成紫色,將區(qū)域2著色成藍(lán)色,將區(qū)域3著色成碧綠色,將區(qū)域4著色成粉紅色. 圖1 原始圖像 以對區(qū)域1著色為例,判斷其當(dāng)前顏色的R、G、B值的范圍,即獲得該顏色區(qū)域內(nèi)最大的R、G、B值及最小的R、G、B值,這需要知道該區(qū)域內(nèi)的每個像素的R、G、B值進(jìn)而判斷著色范圍.查看屏幕上任意顏色的R、G、B值可以利用經(jīng)常使用的QQ截圖功能輕松實(shí)現(xiàn),按下“Ctrl+Alt+A”組合鍵彈出“截圖”提示框,將鼠標(biāo)移動到所想查看的屏幕顏色上即可獲得相應(yīng)的R、G、B值,如圖2所示.記錄下區(qū)域1內(nèi)最大的R值是199、G值是255、B值是197,最小的R值是0、G值是239、B值是0.按照同樣的方法依次記錄下其他區(qū)域內(nèi)的R、G、B值的范圍. 圖2 查看顏色的R、G、B值 在VC++中定義紫色、藍(lán)色、碧綠色、粉紅色四個新顏色,在常用的RGB顏色表中,可查得四種顏色的R、G、B值.根據(jù)前面判斷的著色區(qū)域的R、G、B范圍,比較array1、array2、array3中存儲的R、G、B值在不在該范圍內(nèi)進(jìn)行著色.代碼如下: 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機(jī)(英特爾酷睿i5-3230M@2.60 GHz雙核、4 G內(nèi)存、Windows 7系統(tǒng))的VC6.0開發(fā)平臺上使用C++語言實(shí)現(xiàn)了圖像著色算法.圖4是一些圖片應(yīng)用算法進(jìn)行處理的效果圖,從中可以看出,算法能夠較好地保持原始圖片的形狀輪廓,將圖片重新著色. 圖4 實(shí)驗(yàn)效果圖(圖中左圖為著色前,右圖為著色后) 對圖像進(jìn)行著色可以使圖像呈現(xiàn)多樣性,使觀者獲得新鮮的視覺感受.本文提出一種將彩色圖片的部分區(qū)域按照指定的顏色著色的算法,實(shí)驗(yàn)結(jié)果表明,算法可提供良好的著色效果,著色后的圖像顏色具有較好的真實(shí)性和平滑性. 參考文獻(xiàn): [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].北京:清華大學(xué)出版社,2006:23-33.2.2 判斷著色區(qū)域的R、G、B范圍
2.3 設(shè)置新顏色并進(jìn)行著色
3 實(shí)驗(yàn)結(jié)果
4 結(jié)論