新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 C/C++编程思想 』 → 用C++ Builder对图像进行特殊效果处理 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5446 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 用C++ Builder对图像进行特殊效果处理 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 用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);

    }


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/8/29 8:55:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客2
    发贴心情 
    三、图像的锐化处理

    图像的锐化处理正好与柔化处理相反,它的目的是突出图像的变化部分,这里采用的算法是将要处理的像素与它左对角线的像素之间的差值乘上一个锐化度数,然后再加上原先的像素值: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下编译、运行通过。

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/8/29 8:55:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/2 15:08:56

    本主题贴数2,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    93.750ms