⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 merger3.cpp

📁 刚上传内容的相关CODEC不能单独上传。于是
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -