[计算机]并行图像细化算法和C代码实现.doc_第1页
[计算机]并行图像细化算法和C代码实现.doc_第2页
[计算机]并行图像细化算法和C代码实现.doc_第3页
[计算机]并行图像细化算法和C代码实现.doc_第4页
[计算机]并行图像细化算法和C代码实现.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

并行图像细化算法和C代码实现图像细化一般作为一种图像预处理技术出现,目的是提取源图像的骨架,即是将原图像中线条宽度大于1个象素的线条细化成只有一个象素宽,形成骨架,形成骨架后能比较容易的分析图像,如提取图像的特征.细化分成串行细化和并行细化2中,串行细化即是一遍检测满足细化条件的点一边删除细化点,并行细化即是检测细化点的时候不进行点的删除只进行标记,而在检测完整幅图像后一次性去除要细化的点.细化基本思想是层层剥夺,即从线条边缘开始一层一层向里剥夺,直到线条剩下一个象素的为止.进行细化算法前要先对图像进行2值化,即图像中直包含黑和白2中颜色.细化算法:在微观上取检测点的8个临域(由于是并行细化,有些模板要扩展为12临域),如下xxxxoxxxx其中o为检测点x为其相邻点以下用1代表黑色点,用0代表白色点,用x代表任意颜色的点,要剥夺(删除)的点应满足一下8个模板中的一个.模板a(向右扩大)0x1x01110x1x模板b(向右扩大)00xx0111x11x模板c(向右扩大)x11x011100xx模板d111x1x000模板e1x01101x0模板fx00110x1x模板gx1x110x00模板h(向下扩大)000x1x111x1x符合以上8个模板的点为要剥夺的点,因为符合这8个模板的点可以确认为线条边沿上的点.而试事实上经过这8个模板并行细化后还有下面2种特殊的边沿点保留了下来,特殊边沿点1000010111特殊边沿点2001011001造成这种2种特殊点的原因扩大后的模板a和扩大后的模板h,扩大的的本意是防止偶数列(行)的线条被完全消去(并行细化并然的).解决方法是在并行细化后再进行一次串行细化,选取缩小后的模板a和模板h模板a(缩小后)0x10110x1模板h(缩小后)000x1x111其中缩小后的模板a解决了特殊情况1,缩小后的模板h解决了特殊情况2,注意这次是串行细化了.一下根据这个原理用C+Builder6.0实现,关键代码如下./-BCB6 代码#include #pragma hdrstop#include#include Unit1.h#includeFile1.h#include#include#include#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 | bOffbits,0); /-显示一些信息 Form1-Edit1-Text=IntToStr(bmph-bfSize); Form1-Edit2-Text=IntToStr(bmpi-width); Form1-Edit3-Text=IntToStr(bmpi-height); Form1-Edit4-Text=IntToStr(bmpi-comp); Form1-Edit5-Text=IntToStr(bmpi-used); int i,j,k,l,wc,pos; long N=bmph-bfSize- bmph-Offbits;/象素总数 unsigned char *image=new unsigned charN; /位图矩阵 fread(image,N,1,f);/读入位图矩阵 int skip=0; /BMP 文件4字节对齐 if(bmpi-width%4=0) skip=0; else skip=4-bmpi-width%4; unsigned char color=0; TColor *tc; /! /2值化 for(i=0;iN;i+) if(unsigned char)imagei0xa0) imagei=(unsigned char)0; else imagei=(unsigned char)0xff; / int flag=1; long x,b; unsigned char *om=new unsigned charN; /标记矩阵 for(i=0;iN;i+) /初始化 omi=0; while(flag=1) /flag=0时迭代结束 flag=0; for( i=2;iheight-2;i+) for(j=2;jwidth-2;j+) /模板a if(image(i-1)*(bmpi-width+skip)+j-1=0xff & image(i-1)*(bmpi-width+skip)+j+1=0 & image(i)*(bmpi-width+skip)+j-1=0xff & image(i)*(bmpi-width+skip)+j-0=0 & image(i)*(bmpi-width+skip)+j+1=0 & image(i)*(bmpi-width+skip)+j+2=0 & image(i+1)*(bmpi-width+skip)+j-1=0xff & image(i+1)*(bmpi-width+skip)+j+1=0) om(i)*(bmpi-width+skip)+j=0xff; flag=1; continue; /模板b if(image(i-1)*(bmpi-width+skip)+j-0=0 & image(i-1)*(bmpi-width+skip)+j+1=0 & image(i)*(bmpi-width+skip)+j-1=0xff & image(i)*(bmpi-width+skip)+j-0=0 & image(i)*(bmpi-width+skip)+j+1=0 & image(i)*(bmpi-width+skip)+j+2=0 & image(i+1)*(bmpi-width+skip)+j-1=0xff & image(i+1)*(bmpi-width+skip)+j-0=0xff) om(i)*(bmpi-width+skip)+j=0xff; flag=1; continue; /模板c if(image(i-1)*(bmpi-width+skip)+j-1=0xff & image(i-1)*(bmpi-width+skip)+j-0=0xff & image(i)*(bmpi-width+skip)+j-1=0xff & image(i)*(bmpi-width+skip)+j-0=0 & image(i)*(bmpi-width+skip)+j+1=0 & image(i)*(bmpi-width+skip)+j+2=0 & image(i+1)*(bmpi-width+skip)+j-0=0 & image(i+1)*(bmpi-width+skip)+j+1=0) om(i)*(bmpi-width+skip)+j=0xff; flag=1; continue; /模板d if(image(i-1)*(bmpi-width+skip)+j-1=0xff & image(i-1)*(bmpi-width+skip)+j-0=0xff & image(i-1)*(bmpi-width+skip)+j+1=0xff & image(i)*(bmpi-width+skip)+j-0=0 & image(i+1)*(bmpi-width+skip)+j-1=0 & image(i+1)*(bmpi-width+skip)+j-0=0 & image(i+1)*(bmpi-width+skip)+j+1=0) om(i)*(bmpi-width+skip)+j=0xff; flag=1; continue; /模板e if(image(i-1)*(bmpi-width+skip)+j-1=0 & image(i-1)*(bmpi-width+skip)+j+1=0xff & image(i)*(bmpi-width+skip)+j-1=0 & image(i)*(bmpi-width+skip)+j-0=0 & image(i)*(bmpi-width+skip)+j+1=0xff & image(i+1)*(bmpi-width+skip)+j-1=0 & image(i+1)*(bmpi-width+skip)+j+1=0xff) om(i)*(bmpi-width+skip)+j=0xff; flag=1; continue; /模板f if(image(i-1)*(bmpi-width+skip)+j-0=0 & image(i)*(bmpi-width+skip)+j-1=0 & image(i)*(bmpi-width+skip)+j-0=0 & image(i)*(bmpi-width+skip)+j+1=0xff & image(i+1)*(bmpi-width+skip)+j-0=0xff & image(i+1)*(bmpi-width+skip)+j+1=0xff) om(i)*(bmpi-width+skip)+j=0xff; flag=1; continue; /模板g if(image(i-1)*(bmpi-width+skip)+j-0=0xff & image(i-1)*(bmpi-width+skip)+j+1=0xff & image(i)*(bmpi-width+skip)+j-1=0 & image(i)*(bmpi-width+skip)+j-0=0 & image(i)*(bmpi-width+skip)+j+1=0xff & image(i+1)*(bmpi-width+skip)+j-0=0) om(i)*(bmpi-width+skip)+j=0xff; flag=1; continue; /模板h if(image(i-2)*(bmpi-width+skip)+j-0=0 & image(i-1)*(bmpi-width+skip)+j-1=0 & image(i-1)*(bmpi-width+skip)+j-0=0 & image(i-1)*(bmpi-width+skip)+j+1=0 & image(i)*(bmpi-width+skip)+j-0=0 & image(i+1)*(bmpi-width+skip)+j-1=0xff & image(i+1)*(bmpi-width+skip)+j-0=0xff & image(i+1)*(bmpi-width+skip)+j+1=0xff) om(i)*(bmpi-width+skip)+j=0xff; flag=1; continue; for(i=0;iN;i+) if(omi=0xff) imagei=0xff; /-第二次串行细化 for( i=2;iheight-2;i+) for(j=2;jwidth-2;j+) /缩小后的模板a if(image(i-1)*(bmpi-width+skip)+j-1=0xff & image(i-1)*(bmpi-width+skip)+j+1=0 & image(i)*(bmpi-width+skip)+j-1=0xff & image(i)*(bmpi-width+skip)+j-0=0 & image(i)*(bmpi-width+skip)+j+1=0 & image(i+1)*(bmpi-width+skip)+j-1=0xff & image(i+1)*(bmpi-width+skip)+j+1=0) image(i)*(bmpi-width+skip)+j=0xff; flag=1; continue; /缩小后的模板h if(image(i-1)*(bmpi-width+skip)+j-1=0 & image(i-1)*(bmpi-width+skip)+j-0=0 & image(i-1)*(bmpi-width+skip)+j+1=0 & image(i)*(bmpi-width+skip)+j-0=0 & image(i+1)*(bmpi-width+skip)+j-1=0xff & image(i+1)*(bmpi-width+skip)+j-0=0xff & image(i+1)*(bmpi-width+skip)+j+1=0xff) image(i)*(bmpi-width+sk

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论