资源描述:
《并行图像细化算法和C代码实现.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、并行图像细化算法和C代码实现图像细化一般作为一种图像预处理技术出现,目的是提取源图像的骨架,即是将原图像中线条宽度大于1个象素的线条细化成只有一个象素宽,形成'骨架',形成骨架后能比较容易的分析图像,如提取图像的特征.细化分成串行细化和并行细化2中,串行细化即是一遍检测满足细化条件的点一边删除细化点,并行细化即是检测细化点的时候不进行点的删除只进行标记,而在检测完整幅图像后一次性去除要细化的点.细化基本思想是'层层剥夺',即从线条边缘开始一层一层向里剥夺,直到线条剩下一个象素的为止.进行细化算法前要先对图像
2、进行2值化,即图像中直包含'黑'和'白'2中颜色.细化算法:在微观上取检测点的8个临域(由于是并行细化,有些模板要扩展为12临域),如下xxxxoxxxx其中o为检测点x为其相邻点以下用1代表黑色点,用0代表白色点,用x代表任意颜色的点,要剥夺(删除)的点应满足一下8个模板中的一个.模板a(向右扩大)0x1x01110x1x模板b(向右扩大)00xx0111x11x模板c(向右扩大)x11x011100xx模板d111x1x000模板e1x01101x0模板fx00110x1x模板gx1x110x00模板h
3、(向下扩大)000x1x111x1x符合以上8个模板的点为要剥夺的点,因为符合这8个模板的点可以确认为线条边沿上的点.而试事实上经过这8个模板并行细化后还有下面2种特殊的边沿点保留了下来,特殊边沿点1000010111特殊边沿点2001011001造成这种2种特殊点的原因扩大后的模板a和扩大后的模板h,扩大的的本意是防止偶数列(行)的线条被完全消去(并行细化并然的).解决方法是在并行细化后再进行一次串行细化,选取缩小后的模板a和模板h模板a(缩小后)0x10110x1模板h(缩小后)000x1x111其中缩
4、小后的模板a解决了特殊情况1,缩小后的模板h解决了特殊情况2,注意这次是串行细化了.一下根据这个原理用C++Builder6.0实现,关键代码如下.//--------------------------------BCB6代码#include#pragmahdrstop#include#include"Unit1.h"#include"File1.h"#include#include#include#pragmapack(1)
5、usingnamespacestd;/*程序:图像细化作者:sboom(Lingch)日期:05年1月18日*///BMP文件头structBITMAPFILEHEADER_{shorttype;intbfSize;shortre1,re2;intOffbits;};//BMP信息头structBITMAPINFO_{longsize;longwidth,height;shortplanes,bitCount;longcomp,sizeImg;longxpels,ypels;longused,importa
6、nt;};//------将BMP彩色表的数据校正到BCB的TColor的数据。TColor*SwitchColor(unsignedcharr,unsignedcharg,unsignedcharb){TColor*re=newTColor;*re=(r
7、g<<8
8、b<<16);*re=*re&0x00ffffff;returnre;}voidxxx(){FILE*f=fopen("f:\1.bmp","rb");if(f==NULL)/*判断文件是否打开成功*/{ShowMessage("Fileop
9、enerror");return;}fseek(f,0,0);//移动到开头//----------读BMP文件头BITMAPFILEHEADER_*bmph=newBITMAPFILEHEADER_();if(fread((char*)bmph,sizeof(BITMAPFILEHEADER_),1,f)==NULL){ShowMessage("Filereaderror");return;}//-----------读BMP信息头BITMAPINFO_*bmpi=newBITMAPINFO_();if(
10、fread((char*)bmpi,sizeof(BITMAPINFO_),1,f)==NULL){ShowMessage("Filereaderror2");return;}fseek(f,bmph->Offbits,0);//----------显示一些信息Form1->Edit1->Text=IntToStr(bmph->bfSize);Form1->Edit2->Text=IntToStr(bmpi->w