資源簡介
用VC++實(shí)現(xiàn)圖像連通區(qū)域標(biāo)記,很好用,可以計(jì)算出圖像的連通區(qū)域個(gè)數(shù)并標(biāo)記,用MFC實(shí)現(xiàn),有界面

代碼片段和文件信息
//?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為目標(biāo)的灰度值,文本可以設(shè)為255
/*?申請標(biāo)記數(shù)組空間,記得要在CImage類的構(gòu)造函數(shù)
中將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;???????????
/*?每次標(biāo)識(shí)的值,nMarkValue會(huì)在后邊遞增,
來表示不同的區(qū)域,從1開始標(biāo)記。?*/
int?nMaxMarkValue=0;?????//記錄最大的標(biāo)識(shí)的值
int?ij;?????????????????//循環(huán)控制變量
/*?定義存放等價(jià)對的鏈表,其元素是?EqualMark類型,
定義list是為了節(jié)約存儲(chǔ)空間。要使用Clist,
應(yīng)該#include?。??*/
CList??lEqualMark;
//初始化圖像移動(dòng)指針
m_lpImgBitsMove?=?m_lpImgBits;
/*進(jìn)行第一次掃描,將所得的等價(jià)對(EqualMark類型)加到lEqualMark鏈表中。
使用nMarkValue來進(jìn)行每一次新的標(biāo)記,標(biāo)記之后將其值加1。
由于版面關(guān)系,這部分代碼也同樣略去不寫。作者提出以下幾點(diǎn)編程時(shí)要注意
的地方。
Note1:圖像的四周像素并不會(huì)有8個(gè)相鄰的像素。這時(shí)就要根據(jù)上、下、左、
右四種不同的情況做不同的尋找等價(jià)對的判斷。
Note2:可以先對等價(jià)對進(jìn)行排序,每次都保證MarkValue1 這樣易于管理等價(jià)對。
Note3:在實(shí)際工作中,連續(xù)尋找出的等價(jià)對很容易重復(fù),將本次找出的等價(jià)對
和鏈表中保存的最后一個(gè)等價(jià)對相比較,如果不相等的話再存入等價(jià)對鏈表,
這樣可以大大降低鏈表中等價(jià)對的重復(fù)。
Note4:第一次掃描之后,nMarkValue-1即為nMaxMarkValue。?*/
/************************************************************************/
//下面為補(bǔ)充代碼完成對圖象的第一次掃描
//初始化圖象數(shù)組和標(biāo)識(shí)數(shù)組的指針
int?nEqualNum=0;
EqualMark?tempEqualMark;????//用以暫時(shí)存放每次找到的等價(jià)關(guān)系
m_lpnMarkMove=m_lpnMark;
m_lpImgBitsMove?=?m_lpImgBits;
//標(biāo)記圖象的第一行、第一列的象素(只有這一個(gè)象素)
if?(?*m_lpImgBitsMove==bobjectGray?)
{
*m_lpnMarkMove=nMarkValue++;
}
m_lpnMarkMove++;
m_lpImgBitsMove++;
//標(biāo)記圖象的第一行,此時(shí)不會(huì)出現(xiàn)等價(jià)的情況
for?(?i=1;?i?<=?m_lngWidth;?i++)
{
//需要標(biāo)記的情況
if?(?*m_lpImgBitsMove==bobjectGray?)
{
//前面沒有被標(biāo)記過,則開始一個(gè)新的標(biāo)記
if?(?*(m_lpnMarkMove-1)==0?)?
{
*m_lpnMarkMove=nMarkValue++;
}
//前面被標(biāo)記過,則跟隨前一個(gè)標(biāo)記
else
{
*m_lpnMarkMove=*(m_lpnMarkMove-1);
}
}
m_lpnMarkMove++;
m_lpImgBitsMove++;
}
//除第一行之外的標(biāo)記,此時(shí)會(huì)出現(xiàn)等價(jià)的關(guān)系
for?(?j=1;?j?<=?m_lngHeight;?j++?)
{
m_lpImgBitsMove=m_lpImgBits+j*m_lngWidthBytes;
m_lpnMarkMove=m_lpnMark+j*m_lngWidthBytes;
//對每行的第一個(gè)點(diǎn)做處理,總體就是對圖象的最左列做處理
//只需要檢視上,右上兩個(gè)點(diǎn)?
if?(?*m_lpImgBitsMove==bobjectGray?)
{
//<上>位置被標(biāo)記過
if?(?*(m_lpnMarkMove-m_lngWidthBytes)!=0?)?
{
//跟隨<上>標(biāo)記
*m_lpnMarkMove=*(m_lpnMarkMove-m_lngWidthBytes);
if?(?*(m_lpnMarkMove-m_lngWidthBytes)!=*(m_lpnMarkMove-m_lngWidthBytes+1)?&&?*(m_lpnMarkMove-m_lngWidthBytes+1)!=0)
{
//<上><右上>等價(jià)標(biāo)記
AttachEqualMa
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????目錄???????????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
評(píng)論
共有 條評(píng)論