资源简介

用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

评论

共有 条评论