📄 imagesegment.cpp
字号:
// ImageSegment.cpp: implementation of the CImageSegment class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ImageSegment.h"
#include "IEImageLib.h"
#include "ImageUtil.h"
#include "Merger3.h"
#include "IERag.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// 烙矫 傈开 窃荐
//////////////////////////////////////////////////////////////////////
template< class T >
void ShowImage(IEImage< T >* pImage);
template< class T >
void AddInfobar(IEImage< T > *pImage);
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CImageSegment::CImageSegment()
{
// m_pDib = NULL;
m_pYImage = NULL;
m_pUImage = NULL;
m_pVImage = NULL;
m_pGrad = NULL;
m_pLabelMap = NULL;
m_pVertax = NULL;
m_nWidth = m_nHeight = 0;
m_bMerge = TRUE;
}
CImageSegment::CImageSegment(IEDib* pDib, BOOL bMerge)
{
// m_pDib = NULL;
m_pYImage = NULL;
m_pUImage = NULL;
m_pVImage = NULL;
m_pGrad = NULL;
m_pLabelMap = NULL;
m_pVertax = NULL;
m_nWidth = m_nHeight = 0;
m_bMerge = bMerge;
Segment(pDib);
}
CImageSegment::~CImageSegment()
{
Free();
}
BOOL CImageSegment::Free()
{
if( m_pDib)
{
// delete m_pDib;
m_pDib = NULL;
}
if( m_pYImage)
{
delete m_pYImage;
m_pYImage = NULL;
}
if( m_pUImage)
{
delete m_pUImage;
m_pUImage = NULL;
}
if( m_pVImage)
{
delete m_pVImage;
m_pVImage = NULL;
}
if( m_pGrad)
{
delete m_pGrad;
m_pGrad = NULL;
}
if( m_pVertax)
{
delete [] m_pVertax;
m_pVertax = NULL;
}
if( m_pLabelMap )
{
delete [] m_pLabelMap[0];
delete [] m_pLabelMap;
m_pLabelMap = NULL;
}
return TRUE;
}
BOOL CImageSegment::Segment(IEDib *pDib)
{
int i;
// 涝仿 康惑阑 汗荤窍咯 啊瘤绊 乐绰促
// m_pDib = new IEDib();
m_pDib= pDib;
m_nWidth = m_pDib->GetWidth();
m_nHeight = m_pDib->GetHeight();
int nArea = m_nWidth*m_nHeight;
///////////////////////////////////////////////////////////////////
// Y, U, V 捞固瘤 积己
m_pYImage = new IEFloatImage(m_nWidth, m_nHeight);
m_pUImage = new IEFloatImage(m_nWidth, m_nHeight);
m_pVImage = new IEFloatImage(m_nWidth, m_nHeight);
int x, y;
float r, g, b;
RGBBYTE **pRGB = m_pDib->GetRGBPtr();
float **pY = m_pYImage->GetPixels2D();
float **pU = m_pUImage->GetPixels2D();
float **pV = m_pVImage->GetPixels2D();
for( y=0 ; y<m_nHeight ; y++)
{
for( x=0 ; x<m_nWidth ; x++)
{
r = (float)pRGB[y][x].r;
g = (float)pRGB[y][x].g;
b = (float)pRGB[y][x].b;
pY[y][x] = 0.299f*r + 0.587f*g + 0.114f*b;
pU[y][x] = -0.1688f*r - 0.3312f*g + 0.5f*b + 128;
pV[y][x] = 0.5f*r - 0.4184f*g - 0.0816f*b + 128;
}
}
m_pDib->FreePtr(pRGB);
//delete m_pDib;
// Diffusion等 Y, U, V 捞固瘤甫 糕滚肺 爱绰促.
ImageDiffusionFloat(m_pYImage, 0.20f, 4, 8);
ImageDiffusionFloat(m_pUImage, 0.20f, 4, 8);
ImageDiffusionFloat(m_pVImage, 0.20f, 4, 8);
///////////////////////////////////////////////////////////////////
// Y, U, V 捞固瘤甫 捞侩窍咯 gradient 康惑阑 积己
m_pGrad = new IEFloatImage(m_nWidth, m_nHeight);
MakeGradImage();
///////////////////////////////////////////////////////////////////
// drowning level 备窍扁
float drowning, max_level = 0.f;
float* pixel = m_pGrad->GetPixels();
for( i = 0 ; i < m_pGrad->GetSize(); i++ )
max_level = (max_level > pixel[i]) ? max_level : pixel[i];
drowning = max_level*1.1f / 255.f;
//
CRainfalling rain;
rain.Watershed(m_pGrad, drowning);
m_Merger.FromLabel(rain.m_pResult->GetPixels2D(), m_pDib, m_pGrad->GetPixels2D(), m_nWidth, m_nHeight);
if( m_bMerge )
m_Merger.MergeSmallRegions();
// m_pVertax 积己
m_nVertax = m_Merger.GetSegmentNum();
m_pVertax = new IERegionVertax[m_nVertax];
int count = 0;
IERegionVertax* pVertax = (m_Merger.m_pRag->GetHead())->m_pNextHead;
while( pVertax != NULL )
{
m_pVertax[count++].Clone( pVertax );
pVertax = pVertax->m_pNextHead;
}
// m_pLabelMap 积己
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;
int idx, val;
for( i = 0 ; i < m_nVertax ; i++ )
{
idx = m_pVertax[i].m_nStart;
val = i;
do {
m_pLabelMap[0][idx] = val;
idx = m_Merger.m_pPixelList[0][idx];
} while( idx != -1 );
}
return TRUE;
}
void CImageSegment::MakeGradImage()
{
register int i;
int w = m_nWidth;
int h = m_nHeight;
int area = w * h;
// Dimension check!
ASSERT( w != 0 && h != 0 );
IEFloatImage* pYGrad = new IEFloatImage(w, h);
IEFloatImage* pUGrad = new IEFloatImage(w, h);
IEFloatImage* pVGrad = new IEFloatImage(w, h);
EdgeGradient(m_pYImage, pYGrad, 0.1f);
EdgeGradient(m_pUImage, pUGrad, 0.1f);
EdgeGradient(m_pVImage, pVGrad, 0.1f);
float* ptrY = pYGrad->GetPixels();
float* ptrU = pUGrad->GetPixels();
float* ptrV = pVGrad->GetPixels();
float* ptrG = m_pGrad->GetPixels();
float ty, tu, tv;
for( i = 0 ; i < area ; i++ )
{
ty = ptrY[i];
tu = 0.5f * ptrU[i];
tv = 0.5f * ptrV[i];
ptrG[i] = __max( __max(ty, tu), tv);
}
delete pYGrad;
delete pUGrad;
delete pVGrad;
}
void CImageSegment::GetOutputImage(IEDib *pDib)
{
RGBBYTE** ptr = pDib->GetRGBPtr();
int x, y;
int label, value;
for( y=0 ; y<m_nHeight ; y++)
{
for( x=0 ; x<m_nWidth ; x++)
{
label = m_pLabelMap[y][x];
value = m_pVertax[label].m_nValue;
ptr[y][x].r = GetRValue(value);
ptr[y][x].g = GetGValue(value);
ptr[y][x].b = GetBValue(value);
}
}
pDib->FreePtr(ptr);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -