📄 merger3.cpp
字号:
// Merger3.cpp: implementation of the CMerger33 class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Merger3.h"
#include "IEImageLib.h"
#include "IERag.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// FillRegion 窃荐狼 牢磊肺 荤侩凳.
#define NOT_DRAWN 0
#define BELOW_DRAWN 1
#define UPPER_DRAWN 2
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMerger3::CMerger3()
{
m_pLabelMap = NULL;
m_pPixelList = NULL;
m_pRag = NULL;
m_nWidth = m_nHeight = 0;
}
CMerger3::~CMerger3()
{
FreeBuffers();
}
void CMerger3::AllocBuffers()
{
// 趣矫唱 葛福聪鳖... 茄锅 龋免窍绊 逞绢啊磊.
FreeBuffers();
register int i;
int nArea = m_nWidth * m_nHeight;
//
m_pLabelMap = new int*[m_nHeight];
m_pLabelMap[0] = new int[nArea];
for( i = 1 ; i < m_nHeight ; i++ )
m_pLabelMap[i] = m_pLabelMap[i-1] + m_nWidth;
memset(m_pLabelMap[0], 0, sizeof(int)*nArea);
//
m_pPixelList = new int*[m_nHeight];
m_pPixelList[0] = new int[nArea];
for( i = 1 ; i < m_nHeight ; i++ )
m_pPixelList[i] = m_pPixelList[i-1] + m_nWidth;
memset(m_pPixelList[0], 0, sizeof(int)*nArea);
//
m_pRag = new IERag();
}
void CMerger3::FreeBuffers()
{
if( m_pLabelMap )
{
delete [] m_pLabelMap[0];
delete [] m_pLabelMap;
m_pLabelMap = NULL;
}
if( m_pPixelList )
{
delete [] m_pPixelList[0];
delete [] m_pPixelList;
m_pPixelList = NULL;
}
if( m_pRag )
{
delete m_pRag;
m_pRag = NULL;
}
}
// pImage: Watershed甫 茄 搬苞 捞固瘤. int 屈狼 2瞒盔 硅凯.
// pDib: 盔夯 捞固瘤. 阿 region狼 乞闭 祸惑阑 备窍扁 困秦 鞘夸窍促.
// pGrad: gradient 捞固瘤. 康开 荤捞狼 weight甫 概扁扁 困窍咯 鞘夸窍促.
// nWidth: 涝仿 康惑狼 啊肺 农扁
// nHeight: 涝仿 康惑狼 技肺 农扁
BOOL CMerger3::FromLabel(int** pImage, IEDib* pDib, float** pGrad, int nWidth, int nHeight)
{
if( pImage == NULL )
return FALSE;
int nArea = nWidth * nHeight;
if( nArea == 0 )
return FALSE;
// 糕滚 函荐 悸泼
m_nWidth = nWidth;
m_nHeight = nHeight;
// 皋葛府 傍埃 且寸
AllocBuffers();
register int i, j;
// Pixel list甫 葛滴 -1肺 檬扁拳. Pixel list狼 蔼捞 -1捞扼绰 巴篮
// 泅犁 啊府虐绰 region狼 付瘤阜 侨伎捞扼绰 巴阑 狼固茄促.
for( i = 0 ; i < nArea ; i++ )
m_pPixelList[0][i] = -1;
//////////////////////////////////////////////////////////////////
// 捞固瘤甫 胶牡窍搁辑 阿 康开 沥焊甫 Adjacency List 屈怕肺 备己茄促.
int nRegionLabel = 1;
for( j = 0 ; j < m_nHeight ; j++ )
for( i = 0 ; i < m_nWidth ; i++ )
{
if( m_pLabelMap[j][i] == 0 )
{
// 货肺款 畴靛甫 积己窍咯, m_pRag俊 眠啊茄促.
IERegionVertax* pRegion = new IERegionVertax();
pRegion->m_nStart = pRegion->m_nEnd = j*m_nWidth + i;
pRegion->m_nIndex = nRegionLabel;
m_pRag->AddVertax(pRegion);
// 泅犁 侨伎苞 楷搬等 康开阑 胶牡窍搁辑,
// 弊 沥焊甫 pRegion vertax俊 诀单捞飘茄促.
// FillRegion() 窃荐 郴何俊辑 m_pLabelMap苞 m_pPixelList甫 葛滴 盎脚茄促.
FillRegion(i, j, nRegionLabel, pImage, pRegion, 0, 0, NOT_DRAWN);
nRegionLabel++;
}
}
// IERag 努贰胶俊辑 head vertax 府胶飘甫 狐福霸 立辟窍扁 困窍咯,
// 硅凯 屈怕肺 牢郸胶甫 父甸绢林绰 累诀阑 荐青茄促.
m_pRag->m_nMaxIndex = nRegionLabel;
m_pRag->UpdateArray();
// Head vertax 府胶飘父 备己登绢乐绰 惑怕俊辑,
// head vertax 府胶飘狼 阿 vertax 沥焊 吝, value俊 秦寸窍绰 沥焊甫
// 盔夯 康惑狼 乞闭 祸惑栏肺 函版茄促.
UpdateVertaxValue(pDib);
//////////////////////////////////////////////////////////////////
// 牢立茄 康开甸埃狼 weight甫 拌魂茄促.
float weight;
for( i = 1 ; i < m_nWidth ; i++ )
{
if( pImage[0][i-1] != pImage[0][i] )
{
weight = ( pGrad[0][i-1] + pGrad[0][i] ) / 2;
m_pRag->AddEdge(m_pLabelMap[0][i-1], m_pLabelMap[0][i], weight);
}
}
for( j = 1 ; j < m_nHeight ; j++ )
{
if( pImage[j-1][0] != pImage[j][0] )
{
weight = ( pGrad[j-1][0] + pGrad[j][0] ) / 2;
m_pRag->AddEdge(m_pLabelMap[j-1][0], m_pLabelMap[j][0], weight);
}
}
for( j = 1 ; j < m_nHeight ; j++ )
for( i = 1 ; i < m_nWidth ; i++ )
{
if( pImage[j-1][i] != pImage[j][i] )
{
weight = ( pGrad[j-1][i] + pGrad[j][i] ) / 2;
m_pRag->AddEdge(m_pLabelMap[j-1][i], m_pLabelMap[j][i], weight);
}
if( pImage[j][i-1] != pImage[j][i] )
{
weight = ( pGrad[j][i-1] + pGrad[j][i] ) / 2;
m_pRag->AddEdge(m_pLabelMap[j][i-1], m_pLabelMap[j][i], weight);
}
}
return TRUE;
}
// 累篮 康开阑 林函狼 奴 康开栏肺 捍钦茄促.
// 累篮 康开捞 弊 磊眉肺 绊蜡狼 漂隆阑 啊瘤绊 乐栏搁 捍钦窍瘤 臼绰促.
int CMerger3::MergeSmallRegions()
{
int i, j, size, nStep, nSize;
int size1, size2, size3, size4;
int count = 0;
int nSmall, nLarge;
int area = m_nWidth * m_nHeight;
float dist;
IERegionVertax* pHeadVertax;
IERegionVertax* pVertax;
IERegionVertax* pTemp;
// (1) 漂沥 农扁 捞窍狼 搁利阑 爱绰 康开捞 促弗 康开俊 笛矾阶牢 版快,
// 必窜利栏肺 滴 康开狼 distance啊 农瘤 臼栏搁
// 公炼扒 牢立茄 康开 吝 窍唱肺 捍钦茄促.
// 康惑狼 傈眉 搁利俊 狼芭茄 parameters 汲沥...
size1 = area / 4000; // ( 352 * 288 = 101376 ) / 5000 = 20
size2 = size1 * 5;
size3 = size1 * 10;
size4 = area / 200;
pHeadVertax = m_pRag->GetHead();
while( pHeadVertax->m_pNextHead != NULL )
{
pTemp = pHeadVertax->m_pNextHead;
// 檬必家康开 吝俊辑 牢立茄 康开苞 必窜利栏肺 distance 瞒捞啊
// 唱瘤 臼绰 捞惑 公炼扒 捍钦茄促.
if( pTemp->m_nArea < size1 )
{
// 必家 康开 pTemp->m_nIndex 客 牢立茄 康开甸 吝俊辑
// color distance 俊 厚吝阑 0.7阑 霖 distance啊
// 啊厘 累篮
FindClosestNeighbor(pTemp->m_nIndex, 0.5f, nLarge, dist);
if( dist < 0.2f )
{
// TRACE("%d 康开捞 %d 栏肺 merge 凳. dist = %4.3f\n", (pTemp->m_nIndex), nLarge, dist);
Merge(pTemp->m_nIndex, nLarge);
continue;
}
}
pHeadVertax = pHeadVertax->m_pNextHead;
}
// (2) 漂沥 农扁 捞惑狼 搁利阑 爱绰 康开(L)苞 牢立茄 累篮 康开(S)甸 吝俊辑
// L苞 S狼 乞闭 祸惑捞 厚搅窍绊, 滴 康开 荤捞狼 gradient 蔼捞 累栏搁
// merge 茄促.
// 搁利捞 500焊促 奴 康开甸阑 硅凯俊 历厘茄促.
// 352 x 288俊辑 措面 15俺沥档 康开捞 急琶登骨肺,
// 乘乘棱酒 256俺狼 硅凯阑 父甸绢 荤侩茄促.
int nLargeVertax = 0;
int pLargeVertax[256] = {0, };
pHeadVertax = (m_pRag->GetHead())->m_pNextHead;
while( pHeadVertax != NULL )
{
if( pHeadVertax->m_nArea > size4 )
{
pLargeVertax[nLargeVertax++] = pHeadVertax->m_nIndex;
ASSERT( nLargeVertax < 256 );
}
pHeadVertax = pHeadVertax->m_pNextHead;
}
// pLargeVertax甫 康开 农扁 鉴栏肺 郴覆瞒鉴 沥纺茄促.
// for( i = 1 ; i < nLargeVertax ; i++ )
// {
// j = i;
// k = pLargeVertax[i];
// while( pLargeVertax[j-1] > k && j > 0 )
// {
// pLargeVertax[j] = pLargeVertax[j-1];
// j--;
// }
// pLargeVertax[j] = k;
// }
// pLargeVertax俊 措秦辑 促澜苞 鞍篮 贸府甫 茄促.
// 奴 康开俊 牢立茄 累篮 康开甸阑 刚历 捍钦茄促.
int pRegionIndex[256] = {0, };
int nArrayIndex = 0;
for( i = 0 ; i < nLargeVertax ; i++ )
{
nArrayIndex = 0;
pHeadVertax = m_pRag->GetHeadVertax(pLargeVertax[i]);
ASSERT( pHeadVertax != NULL );
pVertax = pHeadVertax;
while( pVertax->m_pNext != NULL )
{
if( pVertax->m_pNext->m_nArea < size2 )
{
// 累篮 康开俊 措秦辑...
FindClosestNeighbor(pVertax->m_pNext->m_nIndex, 0.5f, nLarge, dist);
if( nLarge == pHeadVertax->m_nIndex && dist < 0.5f)
{
pRegionIndex[nArrayIndex++] = pVertax->m_pNext->m_nIndex;
ASSERT( nArrayIndex < 256 );
}
// else if( dist < 0.10f )
// {
// Merge(pVertax->m_pNext->m_nIndex, nLarge);
// continue;
// }
}
pVertax = pVertax->m_pNext;
}
// 捍钦且 累篮 康开捞 绝促搁 促澜 奴 康开阑 炼荤...
if( nArrayIndex != 0 )
{
// 捍钦且 康开捞 乐栏搁 老褒 捍钦...
for( j = 0 ; j < nArrayIndex ; j++ )
Merge(pRegionIndex[j], pHeadVertax->m_nIndex);
i--;
}
}
// (3) 漂沥 农扁焊促 累篮 康开甸俊 措秦辑 牢立茄 康开阑 八祸窍咯
// 厚搅茄 康开栏肺 merge 茄促.
// int nSmallVertax = 0;
// int pSmallVertax[1024] = {0, };
//
// pHeadVertax = (m_pRag->GetHead())->m_pNextHead;
// while( pHeadVertax != NULL )
// {
// if( pHeadVertax->m_nArea < size3 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -