📄 merger3.cpp
字号:
// {
// 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 + -