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

📄 merger3.cpp

📁 刚上传内容的相关CODEC不能单独上传。于是
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//		{
//			pSmallVertax[nSmallVertax++] = pHeadVertax->m_nIndex;
//			ASSERT( nSmallVertax < 1024 );
//		}
//		
//		pHeadVertax = pHeadVertax->m_pNextHead;
//	}

//	nStep = 40;
//	nSize = 120;
	nStep = size1;
	nSize = size3;

	for( size = nStep ; size <= nSize ; size += nStep )
	{
		pHeadVertax = m_pRag->GetHead();
		while( pHeadVertax != NULL )
		{
			pTemp = pHeadVertax->m_pNextHead;
			if( pTemp != NULL && pTemp->m_nArea <= size3 )
			{
				nSmall = pTemp->m_nIndex;
				FindClosestNeighbor(nSmall, 0.8f, nLarge, dist);

				//if( dist < 1000.f )
				if( dist < 0.25f )
				{
					Merge(nSmall, nLarge);
					count++;
					continue;
				}
			}

			pHeadVertax = pHeadVertax->m_pNextHead;
		}
	}

	return count;
}

// m_pLabelMap苞 m_pPixelList甫 盎脚窍绊,
// m_pRag俊辑 角力肺 merge 累诀阑 荐青窍绰 MergeVertax甫 龋免茄促.
int CMerger3::Merge(int nSmall, int nLarge)
{
	IERegionVertax* pSmall = m_pRag->GetHeadVertax(nSmall);
	IERegionVertax* pLarge = m_pRag->GetHeadVertax(nLarge);

	ASSERT(pSmall != NULL);
	ASSERT(pLarge != NULL);
	
	// m_pLabelMap 盎脚
	int idx = pSmall->m_nStart;
	int val = pLarge->m_nIndex;
	do {
		m_pLabelMap[0][idx] = val;
		idx = m_pPixelList[0][idx];
	} while( idx != -1 );
	
	// m_pPixelList 盎脚
	m_pPixelList[0][pLarge->m_nEnd] = pSmall->m_nStart;
	
	// RAG 备炼惑俊辑 捍钦茄促.
	m_pRag->MergeVertax(nSmall, nLarge);
	
	// 捍钦等 饶狼 康开狼 承捞甫 馆券茄促.
	return (m_pRag->GetHeadVertax(nLarge))->m_nArea;
}

void CMerger3::FindClosestNeighbor(int nSmall, float cw, int& nLarge, float& min_dist)
{
	IERegionVertax* pSmall;
	IERegionVertax* pVertax;
	
	float dist = 0;
	
	pSmall = m_pRag->GetHeadVertax(nSmall);
	ASSERT( pSmall != NULL );
	
	// miniimum distance狼 檬扁蔼栏肺 奴 蔼阑 汲沥茄促.
	min_dist = 999999;
	pVertax = pSmall->m_pNext;
	nLarge = pVertax->m_nIndex;
	while( pVertax != NULL )
	{
		// Small region苞 弊客 楷搬等 region 吝俊辑 啊厘 蜡荤茄
		// 康开阑 茫扁困窍咯 distance甫 备茄促.
		// Gradient 沥焊焊促 color 沥焊俊 歹 厚吝阑 敌促.
		dist = CalDist(pSmall, pVertax, cw);
		
		if( dist < min_dist )
		{
			// 啊厘 弥家 芭府甫 爱绰 康开 沥焊甫 历厘...
			nLarge = pVertax->m_nIndex;
			min_dist = dist;
		}
		
		pVertax = pVertax->m_pNext;
	}
}

// pHeadVertax: 
// pVertax:
// cw: color weight. 0俊辑 1荤捞狼 角荐蔼阑 爱绰促.
float CMerger3::CalDist(IERegionVertax* pHeadVertax, IERegionVertax* pVertax, float cw)
{
	int r1, g1, b1, r2, g2, b2;
	int u1, v1, u2, v2;
	float dist, dist_c, dist_g;

	r1 = GetRValue(pHeadVertax->m_nValue);
	g1 = GetGValue(pHeadVertax->m_nValue);
	b1 = GetBValue(pHeadVertax->m_nValue);
	r2 = GetRValue(pVertax->m_nValue);
	g2 = GetGValue(pVertax->m_nValue);
	b2 = GetBValue(pVertax->m_nValue);

	u1 = limit((int)(-0.1688*r1 - 0.3312*g1 + 0.5*b1 + 127.5));
	v1 = limit((int)(0.5*r1 - 0.4184*g1 - 0.0816*b1 + 127.5));
	
	u2 = limit((int)(-0.1688*r2 - 0.3312*g2+ 0.5*b2 + 127.5));
	v2 = limit((int)(0.5*r2 - 0.4184*g2 - 0.0816*b2 + 127.5));

	// chrominace 己盒父阑 捞侩窍咯 color distance甫 沥狼茄 侥
//	dist_c = (float)sqrt((u1-u2)*(u1-u2) + (v1-v2)*(v1-v2));

	cw = 0.75f;
	// rgb 己盒阑 捞侩窍咯 color distance甫 沥狼茄 侥
	// 0.5774 = 1 / sqrt(3)
	// 0 <= dist_c <= 255

	dist_c = (float)sqrt( (r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2) ) * 0.5774f;
	
	// 0 <= dist_g <= 255
	dist_g = pVertax->m_fWeight / pVertax->m_nBoundary;

	// Total distance
//	if( dist_c < 1.0f )
//		return 1.0f;
//
//	if( dist_g < 1.0f )
//		return 1.0f;
//
//	if( dist_c < 1.5f && dist_g < 1.5f )
//		return 1.0f;
//	
//	dist = (dist_c + dist_g) / 2;

	dist = cw*dist_c + (1-cw)*dist_g;
	
//	TRACE("%f\t\t%f\t\t%f\n", dist_c, dist_g, dist);
	
	return (dist/255.f);
}

// pDib狼 盔贰 漠扼 祸惑阑 捞侩窍咯 head vertax 府胶飘狼 m_nValue
// 沥焊甫 盎脚茄促. 
void CMerger3::UpdateVertaxValue(IEDib *pDib)
{
	IERegionVertax* pVertax;
	RGBBYTE** ptr = pDib->GetRGBPtr();
	RGBBYTE pixel;
	int r, g, b;
	int idx, area;

	int w = pDib->GetWidth();
	int h = pDib->GetHeight();

	pVertax = (m_pRag->GetHead())->m_pNextHead;
	while( pVertax != NULL )
	{
		r = g = b = 0;
		idx = pVertax->m_nStart;
		do {
			pixel = ptr[idx/w][idx%w];
			r += pixel.r;
			g += pixel.g;
			b += pixel.b;

			idx = m_pPixelList[0][idx];
		} while( idx != -1 );

		area = pVertax->m_nArea;
		pVertax->m_nValue = RGB(r/area, g/area, b/area);

		pVertax = pVertax->m_pNextHead;
	}
	
	pDib->FreePtr(ptr);
}

int CMerger3::GetSegmentNum()
{
	return m_pRag->GetVertaxCount();
}

void CMerger3::GetOutputImage(IEDib *pDib)
{
	RGBBYTE** ptr = pDib->GetRGBPtr();

	int w = pDib->GetWidth();

	int x, y;
	int idx, val;
	IERegionVertax* pVertax = (m_pRag->GetHead())->m_pNextHead;
	while( pVertax != NULL )
	{
		idx = pVertax->m_nStart;
		val = pVertax->m_nValue;
		do {
			y = idx / w;
			x = idx % w;
			ptr[y][x].r = GetRValue(val);
			ptr[y][x].g = GetGValue(val);
			ptr[y][x].b = GetBValue(val);
			idx = m_pPixelList[0][idx];
		} while( idx != -1 );
		
		pVertax = pVertax->m_pNextHead;
	}
	
	pDib->FreePtr(ptr);
}

//////////////////////////////////////////////////////////////////////
//	Filling Algorithm
//////////////////////////////////////////////////////////////////////

// sx, sy: seed pixel 
// nRegionLabel: 泅犁 filling窍绊 乐绰 康开狼 label
// pImage: 涝仿 康惑
// pRegion: 泅犁 filling窍绊 乐绰 康开阑 唱鸥郴绰 IERegionVertax狼 器牢磐
// pl, pr: left & right
// flag: 富 弊措肺 敲贰弊. ぱぱ;
int CMerger3::FillRegion(int sx, int sy, int nRegionLabel, int **pImage, 
						 IERegionVertax* pRegion, int pl, int pr, int flag)
{
	int i, x, y;
	int val, idx;
    int xleft, xright;
	
	val = pImage[sy][sx];
	idx = sy*m_nWidth + sx;
	
    xleft = xright = sx;
    y = sy;
	
    xleft  = ScanLeft(sx, sy, pImage);
    xright = ScanRight(sx, sy, pImage);
	
    for( i = xleft ; i <= xright ; i++ )
	{
		idx = y*m_nWidth + i;

		if( pRegion->m_nEnd != idx )
			m_pPixelList[0][pRegion->m_nEnd] = idx;
		m_pLabelMap[y][i] = nRegionLabel;
		
		// Vertax 沥焊 盎脚
		pRegion->m_nArea++;
		pRegion->m_nEnd = idx;
		pRegion->m_nValue = pImage[y][i];
	}
	
    if( flag == UPPER_DRAWN && y > 0 )
	{
		for( x = xleft ; x < pl ; x++ )
		{
			if( pImage[y-1][x] == pImage[y][x] && m_pLabelMap[y-1][x] == 0 )
				x =	FillRegion(x, y-1, nRegionLabel, pImage, pRegion, xleft, xright, BELOW_DRAWN);
		}
		for( x = pr+1 ; x <= xright ; x++ )
		{
			if( pImage[y-1][x] == pImage[y][x] && m_pLabelMap[y-1][x] == 0 )
				x = FillRegion(x, y-1, nRegionLabel, pImage, pRegion, xleft, xright, BELOW_DRAWN);
		}
	}
    else if( y > 0 )
	{
		for( x = xleft ; x <= xright ; x++ )
		{
			if( pImage[y-1][x] == pImage[y][x] && m_pLabelMap[y-1][x] == 0 )
				x = FillRegion(x, y-1, nRegionLabel, pImage, pRegion, xleft, xright, BELOW_DRAWN);
		}
	}
	
    if( flag == BELOW_DRAWN && y < m_nHeight - 1 )
	{
		for( x = xleft ; x < pl ; x++ )
		{
			if( pImage[y+1][x] == pImage[y][x] && m_pLabelMap[y+1][x] == 0 )
				x = FillRegion(x, y+1, nRegionLabel, pImage, pRegion, xleft, xright, UPPER_DRAWN);
		}
		for( x = pr+1 ; x <= xright ; x++ )
		{
			if( pImage[y+1][x] == pImage[y][x] && m_pLabelMap[y+1][x] == 0 )
				x = FillRegion(x, y+1, nRegionLabel, pImage, pRegion, xleft, xright, UPPER_DRAWN);
		}
	}
    else if( y < m_nHeight - 1 )
	{
		for( x = xleft ; x <= xright ; x++ )
		{
			if( pImage[y+1][x] == pImage[y][x] && m_pLabelMap[y+1][x] == 0 )
				x = FillRegion(x, y+1, nRegionLabel, pImage, pRegion, xleft, xright, UPPER_DRAWN);
		}
	}
	
    return xright;
}

int CMerger3::ScanLeft(int x, int y, int** pImage)
{
    int v, t;
	
    v = t = pImage[y][x];
    while( t == v && x >= 0 )
		t = pImage[y][--x];
    x++;

    return x;
}

int CMerger3::ScanRight(int x, int y, int** pImage)
{
    int v, t;
    
	v = t = pImage[y][x];
    while( t == v && x < m_nWidth )
		v = pImage[y][++x];
    x--;

    return x;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -