• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于VC++的圖像著色算法

      2014-06-12 06:28:48王繼東
      通化師范學(xué)院學(xué)報 2014年10期
      關(guān)鍵詞:滁州著色像素

      張 蕓,王繼東

      (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)行更改,完成著色.

      1 CImage類概述

      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)分量.

      2 著色算法設(shè)計

      利用CImage的成員函數(shù)讀入要著色的圖片,獲得圖像的高度與寬度,進(jìn)而求出每個像素的R、G、B分量值;判斷要著色區(qū)域的R、G、B范圍;比較圖像中每個像素的R、G、B分量值是否在著色范圍內(nèi), 定義新顏色進(jìn)行著色.

      2.1 獲得像素的R、G、B值

      使用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中.

      2.2 判斷著色區(qū)域的R、G、B范圍

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

      2.3 設(shè)置新顏色并進(jìn)行著色

      在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 著色圖像

      3 實(shí)驗(yàn)結(jié)果

      在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)效果圖(圖中左圖為著色前,右圖為著色后)

      4 結(jié)論

      對圖像進(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.

      猜你喜歡
      滁州著色像素
      趙運(yùn)哲作品
      藝術(shù)家(2023年8期)2023-11-02 02:05:28
      《滁州西澗》(草書)
      像素前線之“幻影”2000
      蔬菜著色不良 這樣預(yù)防最好
      蘋果膨大著色期 管理細(xì)致別大意
      “像素”仙人掌
      10位畫家為美術(shù)片著色
      電影(2018年10期)2018-10-26 01:55:48
      《滁州學(xué)院學(xué)報》征稿簡則
      《滁州學(xué)院學(xué)報》征稿簡則
      錄唐·韋應(yīng)物詩《滁州西澗》(草書)
      陽光(2016年11期)2016-11-03 17:18:48
      康平县| 阿拉善盟| 南昌市| 大渡口区| 平武县| 三台县| 南雄市| 武宣县| 盘锦市| 沅陵县| 老河口市| 陆河县| 宣恩县| 本溪| 汤阴县| 阿巴嘎旗| 哈巴河县| 乐安县| 和田县| 剑川县| 山阳县| 大连市| 东港市| 布尔津县| 宝鸡市| 上饶市| 永泰县| 天津市| 小金县| 秦安县| 彰化县| 霍山县| 合作市| 婺源县| 凤翔县| 桦甸市| 通化市| 繁峙县| 华宁县| 尉犁县| 宝坻区|