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

本文介绍了一种并行图像细化算法及其C代码实现。该算法主要用于图像预处理,旨在提取图像骨架,即把图像中宽度大于一个像素的线条细化为单像素宽度。文章详细解释了并行细化的基本思想及实现过程,并提供了关键代码。
摘要由CSDN通过智能技术生成

并行图像细化算法和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

#pragma hdrstop

#include

#include "Unit1.h"

#include"File1.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 | g<<8 | b<<16 );

*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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值