用C++ Builder對圖像進行特殊效果處理 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
http://www.chinastu.com/study/html/soft/soft-htm/soft-program/program-luntan/program-2-luntan-010710-04.htm 發信人: jia (小木頭), 信區: VC 標 題: 用C Builder對圖像進行特殊效果處理 在Windows編程中圖像處理相對比較複雜,好在C Builder提供了一些圖形類,它 們通過對Windows中的圖形物件進行包裝,從而大大簡化了圖像操作的難度。下面就通過 對圖像進行柔化、銳化、浮雕效果等幾個特殊效果處理來具體說明一下。 ---- 一、準備工作 點陣圖圖形實際上是圖元的二維陣列,它記錄了每個圖元的?色資訊 ,而TCanvas類提供了Pixels屬性,用它可以存取指定圖元的?色值,通過這個屬性將位元 圖圖形的部分或全部圖元的?色值進行相應的變換處理,就可以實現圖像的特殊效果處 理。在Windows中?色是根據紅、綠、藍三種?色的飽和度來定義的,在這裏我們要將像 素?色值的紅、綠、藍分量從圖元值中分離出來,分別加以保存,所以需要定義一個結 構來存放?色分量: struct rgb_str{ unsigned char r_color; unsigned char g_color; unsigned char b_color;}; rgb_str rgb[2000][2000]; 建立總體變數:Graphics::TBitmap *bitmap; //用來存放變換後的點陣圖 int i,j,width,height; ---- 在表單上放置一個TImage元件和OpenPictureDialog元件,將TImage的AutoSize屬 性設?true,將OpenPictureDialog的Filter設?*.bmp。當用戶選擇Open命令後,打開 相應的對話方塊,讓用戶選擇要處理的圖像文件,然後程式將圖像的所有圖元的?色分量 保存到rgb陣列中: void __fastcall TForm1::mnuFileOpenClick (TObject *Sender) { TColor color; if(OpenPictureDialog1- >Execute()){ Image1- >Picture->LoadFromFile (OpenPictureDialog1- >FileName); width=Image1- >Picture- >Width; height=Image1->Picture->Height; for(i=0;i< width-1;i ) for(j=0;j< height-1;j ){ color=Image1- >Canvas->Pixels[i][j]; rgb[i][j].r_color=GetRValue(color); rgb[i][j].g_color=GetGValue(color); rgb[i][j].b_color=GetBValue(color); } bitmap=new Graphics::TBitmap; bitmap- >Width=width; bitmap- >Height=height; } } ---- 二、圖像的柔化處理 ---- 柔化就是對圖像進行平滑處理,減少相鄰圖元間的?色差別,一般選用3*3圖元塊 ,將中間的圖元值改成這9個圖元的平均圖元值,從而達到柔化效果。其代碼如下: void __fastcall TForm1::btnSmoothClick (TObject *Sender) { int red,green,blue; for(i=1;i< width-2;i ) for(j=1;j< height-2;j ){ red=rgb[i-1][j-1].r_color rgb[i][j-1].r _color rgb[i 1][j-1].r_color rgb[i-1][j].r_color rgb[i][j].r _color rgb[i 1][j].r_color rgb[i-1][j 1].r_color rgb[i][j 1].r _color rgb[i 1][j 1].r_color; green=rgb[i-1][j-1].g_color rgb[i][j-1].g _color rgb[i 1][j-1].g_color rgb[i-1][j].g_color rgb[i][j].g _color rgb[i 1][j].g_color rgb[i-1][j 1].g_color rgb[i][j 1].g _color rgb[i 1][j 1].g_color; blue=rgb[i-1][j-1].b_color rgb[i][j-1].b _color rgb[i 1][j-1].b_color rgb[i-1][j].b_color rgb[i][j].b _color rgb[i 1][j].b_color rgb[i-1][j 1].b_color rgb[i][j 1].b _color rgb[i 1][j 1].b_color; bitmap- >Canvas- >Pixels[i][j] =RGB(red/9,green/9,blue/9); } Image1- >Picture- >Bitmap- >Assign(bitmap); } ---- 三、圖像的銳化處理 ---- 圖像的銳化處理正好與柔化處理相反,它的目的是突出圖像的變化部分,這裏採用 的演算法是將要處理的圖元與它左對角線的圖元之間的差值乘上一個銳化度數,然後再加 上原先的圖元值:new_value=original_value degree*difference,你可以通過改變de gree的值來調節銳化效果。這裏需要注意的是得到的圖元新值可能會超出?色值的有效 範圍(0-255),所以程式要檢驗結果的有效性,?此需定義兩個函數: int min(int value1,int value2) { if(value1 >value2)return value2; else return value1; } int max(int value1,int value2) { if(value1 >value2)return value1; else return value2; } 銳化處理的代碼如下: void __fastcall TForm1::btnSharpeClick (TObject *Sender) { float degree=0.3; int red,green,blue; for(i=1;i< width-1;i ) for(j=1;j< height-1;j ){ red=rgb[i][j].r_color degree*(rgb[i][j].r _color-rgb[i-1][j-1].r_color); green=rgb[i][j].g_color degree*(rgb[i][j].g _color-rgb[i-1][j-1].g_color); blue=rgb[i][j].b_color degree*(rgb[i][j].b _color-rgb[i-1][j-1].b_color); red=min(255,max(0,red)); green=min(255,max(0,green)); blue=min(255,max(0,blue)); bitmap- >Canvas->Pixels[i][j]=RGB (red,green,blue); } Image1- >Picture- >Bitmap- >Assign(bitmap); } ---- 四、圖像的浮雕效果實現 ---- 浮雕效果就是只將圖像的變化部分突出出來,而相同?色部分則被淡化,使圖像出 現縱深感,從而達到浮雕效果,這裏採用的演算法是將要處理的圖元取值?與處於對角線 上的另一個圖元間的差值,這樣只有?色變化區才會出現色彩,而?色平淡區因差值幾 乎?零則變成黑色,你可以通過加上一個常量來增加一些亮度:new_value=difference const_value,具體代碼如下: void __fastcall TForm1::btnEmbossClick (TObject *Sender) { int red,green,blue; const int const_value=128; for(i=0;i< width-2;i ) for(j=0;j< height-2;j ){ red=abs(rgb[i][j].r_color-rgb[i 1][j 1].r _color const_value); green=abs(rgb[i][j].g_color-rgb[i 1][j 1].g _color const_value); blue=abs(rgb[i][j].b_color-rgb[i 1][j 1].b_ color const_value); bitmap- >Canvas- >Pixels[i][j]=RGB (red,green,blue); } Image1- >Picture- >Bitmap- >Assign(bitmap); } ---- 上面介紹了圖像處理中的幾個常見操作,所採用的演算法相對比較簡單,感興趣的朋 友可以舉一返三,通過改進上述演算法,達到更好的特殊效果。以上代碼在C Builder3 、Pwin98下編譯、運行通過
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |