人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

用C++ Builder對圖像進行特殊效果處理

用C++ Builder對圖像進行特殊效果處理

更新時間:2022-08-27 文章作者:未知 信息來源:網絡 閱讀次數:

在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,你可以通過改變degree的值來調節銳化效果。這里需要注意的是得到的像素新值可能會超出顏色值的有效范圍(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下編譯、運行通過。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 浠水县| 工布江达县| 江源县| 大洼县| 汕头市| 宁南县| 四川省| 昌乐县| 嵊州市| 玉环县| 余姚市| 天津市| 墨脱县| 东丰县| 蒙阴县| 新和县| 广德县| 车险| 无极县| 四子王旗| 原阳县| 陆良县| 城口县| 阿拉尔市| 恭城| 大埔县| 南部县| 精河县| 板桥市| 西藏| 东丽区| 水富县| 长宁县| 漳州市| 彰化市| 开封县| 依兰县| 富蕴县| 蒙城县| 黄陵县| 安达市|