并行图像细化算法和C代码实现.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
并行图像细化算法和C代码实现并行图像细化算法和C代码实现

并行图像细化算法和C代码实现 图像细化一般作为一种图像预处理技术出现,目的是提取源图像的骨架,即是将原图像中线条宽度大于1个象素的线条细化成只有一个象素宽,形成骨架,形成骨架后能比较容易的分析图像,如提取图像的特征. 细化分成串行细化和并行细化2中,串行细化即是一遍检测满足细化条件的点一边删除细化点,并行细化即是检测细化点的时候不进行点的删除只进行标记,而在检测完整幅图像后一次性去除要细化的点. 细化基本思想是层层剥夺,即从线条边缘开始一层一层向里剥夺,直到线条剩下一个象素的为止. 进行细化算法前要先对图像进行2值化,即图像中直包含黑和白2中颜色. 细化算法: 在微观上取检测点的8个临域(由于是并行细化,有些模板要扩展为12临域),如下 xxx xox xxx 其中o为检测点x为其相邻点 以下用1代表黑色点,用0代表白色点,用x代表任意颜色的点,要剥夺(删除)的点应满足一下8个模板中的一个. 模板a(向右扩大) 0x1x 0111 0x1x 模板b(向右扩大) 00xx 0111 x11x 模板c(向右扩大) x11x 0111 00xx 模板d 111 x1x 000 模板e 1x0 110 1x0 模板f x00 110 x1x 模板g x1x 110 x00 模板h(向下扩大) 000 x1x 111 x1x 符合以上8个模板的点为要剥夺的点,因为符合这8个模板的点可以确认为线条边沿上的点. 而试事实上经过这8个模板并行细化后还有下面2种特殊的边沿点保留了下来, 特殊边沿点1 000 010 111 特殊边沿点2 001 011 001 造成这种2种特殊点的原因扩大后的模板a和扩大后的模板h,扩大的的本意是防止偶数列(行)的线条被完全消去(并行细化并然的). 解决方法是在并行细化后再进行一次串行细化,选取缩小后的模板a和模板h 模板a(缩小后) 0x1 011 0x1 模板h(缩小后) 000 x1x 111 其中缩小后的模板a解决了特殊情况1,缩小后的模板h解决了特殊情况2,注意这次是串行细化了.一下根据这个原理用C++Builder6.0实现,关键代码如下. //--------------------------------BCB6 代码 #include vcl.h #pragma hdrstop #includestdio.h #include Unit1.h #includeFile1.h #includemath.h #includetime.h #includevector #pragma pack(1) using namespace std; /* 程序:图像细化 作者:sboom(Lingch) 日期:05年1月18日 */ //BMP文件头 struct BITMAPFILEHEADER_ { short type; int bfSize; short re1,re2; int Offbits; }; //BMP信息头 struct BITMAPINFO_ { long size; long width,height; short planes,bitCount; long comp,sizeImg; long xpels,ypels; long used,important; }; //------将BMP彩色表的数据校正到BCB 的TColor的数据。 TColor* SwitchColor(unsigned char r,unsigned char g,unsigned char b) { TColor *re=new TColor; *re=(r | g8 | b16 ); *re=*re 0x00ffffff; return re; } void xxx() { FILE *f=fopen(f:\\1.bmp,rb); if(f==NULL) /*判断文件是否打开成功*/ { ShowMessage(File open error); return; } fseek(f,0,0);//移动到开头 //----------读BMP文件头 BITMAPFILEHEADER_ *bmph=new BITMAPFILEHEADER_(); if(fread((char*)bmph,sizeof(BITMAPFILEHEADER_),1

文档评论(0)

ganqludp + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档