资源简介
用VC++实现图像连通区域标记,很好用,可以计算出图像的连通区域个数并标记,用MFC实现,有界面
代码片段和文件信息
// Image.cpp: implementation of the CImage class.
//
//////////////////////////////////////////////////////////////////////
#include “stdafx.h“
#include “Image.h“
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CImage::CImage()
{
m_lpImgBits=NULL;
m_lpnMark=NULL;
m_lpBMPFileData=NULL;
m_lpShowMark=NULL;
}
CImage::~CImage()
{
Clear();
}
long CImage::MarkImage(BYTE bobjectGray)
{
//bobjectGray为目标的灰度值,文本可以设为255
/* 申请标记数组空间,记得要在CImage类的构造函数
中将m_lpnMark初始化为NULL 。*/
if ( m_lpnMark==NULL )
{ m_lpnMark= new int[m_ulngBitsCount];
ASSERT( m_lpnMark != NULL );
m_lpnMarkMove=m_lpnMark;
}
::memset((LPBYTE)m_lpnMark0m_ulngBitsCount*4);
int nMarkValue=1;
/* 每次标识的值,nMarkValue会在后边递增,
来表示不同的区域,从1开始标记。 */
int nMaxMarkValue=0; //记录最大的标识的值
int ij; //循环控制变量
/* 定义存放等价对的链表,其元素是 EqualMark类型,
定义list是为了节约存储空间。要使用Clist,
应该#include 。 */
CList < EqualMarkEqualMark > lEqualMark;
//初始化图像移动指针
m_lpImgBitsMove = m_lpImgBits;
/*进行第一次扫描,将所得的等价对(EqualMark类型)加到lEqualMark链表中。
使用nMarkValue来进行每一次新的标记,标记之后将其值加1。
由于版面关系,这部分代码也同样略去不写。作者提出以下几点编程时要注意
的地方。
Note1:图像的四周像素并不会有8个相邻的像素。这时就要根据上、下、左、
右四种不同的情况做不同的寻找等价对的判断。
Note2:可以先对等价对进行排序,每次都保证MarkValue1 这样易于管理等价对。
Note3:在实际工作中,连续寻找出的等价对很容易重复,将本次找出的等价对
和链表中保存的最后一个等价对相比较,如果不相等的话再存入等价对链表,
这样可以大大降低链表中等价对的重复。
Note4:第一次扫描之后,nMarkValue-1即为nMaxMarkValue。 */
/************************************************************************/
//下面为补充代码完成对图象的第一次扫描
//初始化图象数组和标识数组的指针
int nEqualNum=0;
EqualMark tempEqualMark; //用以暂时存放每次找到的等价关系
m_lpnMarkMove=m_lpnMark;
m_lpImgBitsMove = m_lpImgBits;
//标记图象的第一行、第一列的象素(只有这一个象素)
if ( *m_lpImgBitsMove==bobjectGray )
{
*m_lpnMarkMove=nMarkValue++;
}
m_lpnMarkMove++;
m_lpImgBitsMove++;
//标记图象的第一行,此时不会出现等价的情况
for ( i=1; i <= m_lngWidth; i++)
{
//需要标记的情况
if ( *m_lpImgBitsMove==bobjectGray )
{
//前面没有被标记过,则开始一个新的标记
if ( *(m_lpnMarkMove-1)==0 )
{
*m_lpnMarkMove=nMarkValue++;
}
//前面被标记过,则跟随前一个标记
else
{
*m_lpnMarkMove=*(m_lpnMarkMove-1);
}
}
m_lpnMarkMove++;
m_lpImgBitsMove++;
}
//除第一行之外的标记,此时会出现等价的关系
for ( j=1; j <= m_lngHeight; j++ )
{
m_lpImgBitsMove=m_lpImgBits+j*m_lngWidthBytes;
m_lpnMarkMove=m_lpnMark+j*m_lngWidthBytes;
//对每行的第一个点做处理,总体就是对图象的最左列做处理
//只需要检视上,右上两个点
if ( *m_lpImgBitsMove==bobjectGray )
{
//<上>位置被标记过
if ( *(m_lpnMarkMove-m_lngWidthBytes)!=0 )
{
//跟随<上>标记
*m_lpnMarkMove=*(m_lpnMarkMove-m_lngWidthBytes);
if ( *(m_lpnMarkMove-m_lngWidthBytes)!=*(m_lpnMarkMove-m_lngWidthBytes+1) && *(m_lpnMarkMove-m_lngWidthBytes+1)!=0)
{
//<上><右上>等价标记
AttachEqualMa
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2002-10-16 10:15 Mark\
文件 1279 2002-10-16 11:10 Mark\ImgMark.clw
文件 3597 2002-09-20 17:20 Mark\ReadMe.txt
文件 539 2002-09-20 17:20 Mark\ImgMark.dsw
文件 1335 2002-09-20 17:20 Mark\ImgMark.h
文件 2077 2002-09-20 17:20 Mark\ImgMark.cpp
文件 1477 2002-10-14 10:59 Mark\ImgMarkDlg.h
文件 5423 2002-10-16 10:03 Mark\ImgMarkDlg.cpp
文件 1054 2002-09-20 17:20 Mark\StdAfx.h
文件 209 2002-09-20 17:20 Mark\StdAfx.cpp
文件 823 2002-10-14 11:00 Mark\resource.h
文件 5440 2002-10-16 09:59 Mark\ImgMark.rc
文件 82944 2002-10-16 11:23 Mark\ImgMark.ncb
文件 4360 2002-10-16 10:54 Mark\ImgMark.dsp
文件 20960 2002-10-16 10:30 Mark\ImgMark.aps
文件 1964 2002-10-14 10:57 Mark\Image.h
文件 22687 2002-10-16 11:10 Mark\Image.cpp
文件 1845 2002-10-16 11:22 Mark\ImgMark.plg
文件 52736 2002-10-16 11:23 Mark\ImgMark.opt
目录 0 2002-10-16 11:22 Mark\Debug\
文件 131159 2002-10-16 11:22 Mark\Debug\ImgMark.exe
目录 0 2002-10-16 10:15 Mark\res\
文件 399 2002-09-20 17:20 Mark\res\ImgMark.rc2
文件 1078 2002-09-20 17:20 Mark\res\ImgMark.ico
文件 32114 1998-05-13 00:00 Mark\VFW32.LIB
目录 0 2002-10-16 10:31 o\
文件 131141 2002-10-16 11:07 o\ImgMark.exe
文件 19166 2002-10-14 10:39 o\MarkTest.bmp
文件 19166 2002-10-16 11:25 o\Result.bmp
文件 22686 2002-09-17 10:48 o\MarkTest2.bmp
- 上一篇:数据结构c语言版-单链表的操作程序代码
- 下一篇:rc4加密解密算法
相关资源
- C/C++语言实现求矩阵的广义逆
- 基于C++ builder 的文件传输代码
- 多边形拓扑关系算法C++程序
- VC6.0下开发的仿windows记事本-达尔魔记
- LZ77、LZ78对文件编译码
- 图像Susan角点检测算法代码非常稳健的
- microphone.zip
- c++实现ftp list所有文件与目录 & ftp d
- 置换密码的c++实现程序
- C++实现TIN
- c++模拟进程 解决c++中的难题
- C++ AVI播放器
- 自适应霍夫曼编码(C++)
- C++网络聊天室程序
- 实用Fourier变换及C++实现
- 基于VC的Samlight的二次开发Demo
- c++.win32.扫雷游戏代码
- 通讯录c++实现 功能:添加、删除、查
- 在VC++6.0中给对话框设置背景色或者背
- C++ MongoDB 连接池代码实现
- C++编写的后方交会程序
- BCB 调用WebService方法及常见问题排查
- fortran调用C++ dll
- 共享单车管理系统 c++
- QT C++ 多线程支持多串口通信
- 达内c++pptThe C++ Programming Language
- C++Test9.5的插件版合共工具
- 射线追踪vc++程序
- 东北大学C++实验
- vc++单文档多视图
评论
共有 条评论