>
> </P>4 P3 J/ m1 v7 n% i: r0 l1 K
>3 H1 G1 E! E0 j ?* w
>---- 一、准备工作 位图图形实际上是像素的二维数组,它记录了每个像素的颜色信息,而TCanvas类提供了Pixels属性,用它可以存取指定像素的颜色值,通过这个属性将位图图形的部分或全部像素的颜色值进行相应的变换处理,就可以实现图像的特殊效果处理。在Windows中颜色是根据红、绿、蓝三种颜色的饱和度来定义的,在这里我们要将像素颜色值的红、绿、蓝分量从像素值中分离出来,分别加以保存,所以需要定义一个结构来存放颜色分量: </P>2 M/ ]+ P6 S+ \# c3 e
>struct rgb_str{1 t$ m7 P$ {' }; E4 ?/ \ ~. `
>建立全局变量:Graphics::TBitmap *bitmap;- l3 r5 l8 g( Y' N
>---- 在窗体上放置一个TImage组件和OpenPictureDialog组件,将TImage的AutoSize属性设为true,将OpenPictureDialog的Filter设为*.bmp。当用户选择Open命令后,打开相应的对话框,让用户选择要处理的图像文件,然后程序将图像的所有像素的颜色分量保存到rgb数组中: </P>6 f4 L% J- h& H: ^3 _) M
>void __fastcall TForm1::mnuFileOpenClick+ |3 G9 j0 _& L$ i8 H; A$ B
icture->LoadFromFile2 w5 C2 C! X! o1 ~# x0 X8 n
icture- >Width;# C, y- b0 Z3 D/ Y8 A
icture->Height;) u! n" r) O9 o- n
ixels[j];
>
>---- 柔化就是对图像进行平滑处理,减少相邻像素间的颜色差别,一般选用3*3像素块,将中间的像素值改成这9个像素的平均像素值,从而达到柔化效果。其代码如下: </P>+ N2 ?, ?2 v! [! ?
>void __fastcall TForm1::btnSmoothClick! o4 o- N( q2 [. w3 B0 W, E! e' C
> rgb[i-1][j+1].r_color+rgb[j+1].r8 L3 G5 u, [. o, _
ixels[j]" ]# O( I$ s6 P* s' D% b8 R' k' P
icture- >Bitmap- >Assign(bitmap);! e' U* }0 f7 D- J* ?
>---- 三、图像的锐化处理 </P>
>---- 图像的锐化处理正好与柔化处理相反,它的目的是突出图像的变化部分,这里采用的算法是将要处理的像素与它左对角线的像素之间的差值乘上一个锐化度数,然后再加上原先的像素值:new_value=original_value+degree*difference,你可以通过改变degree的值来调节锐化效果。这里需要注意的是得到的像素新值可能会超出颜色值的有效范围(0-255),所以程序要检验结果的有效性,为此需定义两个函数: </P>0 S# ]4 C- b1 f! S% }* m" |/ k+ @5 Z/ \( C
>int min(int value1,int value2)" w5 \# i! `* i# f
>锐化处理的代码如下:</P>
>void __fastcall TForm1::btnSharpeClick& `' g. ^8 a7 F
ixels[j]=RGB
icture- >Bitmap- >Assign(bitmap);1 `2 o @; o9 S: H
>
>---- 浮雕效果就是只将图像的变化部分突出出来,而相同颜色部分则被淡化,使图像出现纵深感,从而达到浮雕效果,这里采用的算法是将要处理的像素取值为与处于对角线上的另一个像素间的差值,这样只有颜色变化区才会出现色彩,而颜色平淡区因差值几乎为零则变成黑色,你可以通过加上一个常量来增加一些亮度:new_value=difference+const_value,具体代码如下: </P>
>void __fastcall TForm1::btnEmbossClick
ixels[j]=RGB( a% ~ q( X7 v$ f A2 k2 K; ]+ N
icture- >Bitmap- >Assign(bitmap);- \) m- i. m8 Q3 B| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |