用C++ Builder对图像举办非凡结果处理惩罚
副标题#e#
在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);
}
#p#副标题#e#
三、图像的锐化处理惩罚
图像的锐化处理惩罚正好与柔化处理惩罚相反,它的目标是突出图像的变革部门,这里回收的算法是将要处理惩罚的像素与它左对角线的像素之间的差值乘上一个锐化度数,然后再加上原先的像素值: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);
}
四、图像的浮雕结果实现
#p#分页标题#e#
浮雕结果就是只将图像的变革部门突出出来,而沟通颜色部门则被淡化,使图像呈现纵深感,从而到达浮雕结果,这里回收的算法是将要处理惩罚的像素取值为与处于对角线上的另一个像素间的差值,这样只有颜色变革区才会呈现色彩,而颜色平淡区因差值险些为零则酿成玄色,你可以通过加上一个常量来增加一些亮度: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++ Builder6、Win2000下编译、运行通过。