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

📄 imagesegment.cpp

📁 刚上传内容的相关CODEC不能单独上传。于是
💻 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 + -