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

📄 imagesegmentation.cpp

📁 电脑编程技巧和源码。很不错的。
💻 CPP
字号:
// ImageSegmentation.cpp: implementation of the CImageSegmentation class.
//
//	图象分割类实现文件
//
//	作者:张秋枫
//	E-mail:	z.maple@263.net
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ImageSegmentation.h"
#include "MaskDialog.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CImageSegmentation::CImageSegmentation( CDib* pDib )
{
	m_pDib = pDib;
	m_lpImageData = m_pDib->GetImageDataPtr();
	m_nHeight = m_pDib->GetBmpHeight();
	m_nWidth = m_pDib->GetBmpWidth();
	m_nBytesPerRow = m_pDib->GetBytesPerRow();
}

CImageSegmentation::~CImageSegmentation()
{

}

//	高通滤波
void CImageSegmentation::HighpassFiltering()
{
	//	高通滤波模板( Laplacian算子 )
	int HighpassMask[10] = { -1,-1,-1,-1,8,-1,-1,-1,-1,1 };

	AdjustableFilter( HighpassMask, 3, 3 );

	m_pDib->StatHistogramInfo();
}


void CImageSegmentation::MaskFiltering()
{
	INT	aMask[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 9 };

	CMaskDialog dlg( aMask );
	dlg.DoModal();

	Filter( aMask );

	m_pDib->StatHistogramInfo();
}

//	3x3 滤波器
void CImageSegmentation::Filter(int *mask)
{
	LONG i, j;
	LPBYTE pData, pDataTemp;		//	位图数据指针
	LPINT pBuffer, pBufferTemp;	//  位图数据缓冲区指针

	//	赋值
	pDataTemp = pData = m_lpImageData;
	
	//	分配缓冲区并清零
	pBufferTemp = pBuffer = (LPINT)new INT[ m_nBytesPerRow * m_nHeight ];
	memset( pBuffer, 0, m_nBytesPerRow * m_nHeight * sizeof(INT) ); 

	//	滤波,滤波结果存入缓冲区中
	ASSERT( mask[9]!=0 );
	for( i=1; i<m_nHeight-1; i++ )
		for( j=1; j<m_nWidth-1; j++ )
		{
			pDataTemp = pData+i*m_nBytesPerRow+j;
			pBufferTemp = pBuffer+i*m_nBytesPerRow+j;

			*pBufferTemp = (
				mask[0]**(pDataTemp-m_nBytesPerRow-1) +
				mask[1]**(pDataTemp-m_nBytesPerRow) +
				mask[2]**(pDataTemp-m_nBytesPerRow+1) +
				mask[3]**(pDataTemp-1) +
				mask[4]**pDataTemp +
				mask[5]**(pDataTemp+1) +
				mask[6]**(pDataTemp+m_nBytesPerRow-1) +
				mask[7]**(pDataTemp+m_nBytesPerRow) +
				mask[8]**(pDataTemp+m_nBytesPerRow+1)
				)/
				mask[9];
		}

	//	灰度范围变化
	SpatialTransform( pBuffer );

	//	将缓冲区数据拷入位图数据区中
	pBufferTemp = pBuffer;
	for( i=0; i<m_nHeight; i++ )
		for( j=0; j<m_nBytesPerRow; j++ )
		{
			*pData++ = (BYTE)*pBufferTemp++;
		}

	delete []pBuffer;
}


//	灰度范围变换
void CImageSegmentation::SpatialTransform( INT* pBuffer )
{
	LONG	w, h;
	INT		maxGrayLevel, minGrayLevel;

	//	赋值
	maxGrayLevel = minGrayLevel = 0;

	for( h=0; h<m_nHeight; h++ )
		for( w=0; w<m_nWidth; w++ )
		{
			if( maxGrayLevel < *(pBuffer+h*m_nBytesPerRow+w) )
				maxGrayLevel = *(pBuffer+h*m_nBytesPerRow+w);
			if( minGrayLevel > *(pBuffer+h*m_nBytesPerRow+w) )
				minGrayLevel = *(pBuffer+h*m_nBytesPerRow+w);					
		}

	for( h=0; h<m_nHeight; h++ )
		for( w=0; w<m_nWidth; w++ )
		{
			*(pBuffer+h*m_nBytesPerRow+w) = 255*( *(pBuffer+h*m_nBytesPerRow+w)-minGrayLevel ) / ( maxGrayLevel-minGrayLevel );

		}

}



//////////////////////////////////////////////////////////////////
/*
	函数:CImageSegmentation::AdjustableFilter

	访问类型: private

	作用:卷积模板大小可调节滤波器

	参数:
			mask		模板指针
			wndWidth	模板的宽度
			wndHeight	模板的高度

	返回值:void
*/
//	
void CImageSegmentation::AdjustableFilter(int *mask, int wndWidth, int wndHeight)
{
	LONG	w, h;
	INT		i, j;
	INT		halfHeight, halfWidth;	//	滤波器窗口高宽
	LPBYTE	pData, pDataTemp;		//	位图数据指针
	LPINT	pBuffer, pBufferTemp;	//  位图数据缓冲区指针
	LPINT	pMask;

	//	确保滤波器窗口高宽均为奇数
	ASSERT( wndHeight%2 && wndWidth%2 && wndHeight>1 && wndWidth>1 );

	halfHeight	= ( wndHeight-1 )/2;
	halfWidth	= ( wndWidth-1)/2;

	//	赋值
	pDataTemp = pData = m_lpImageData;
	
	//	分配缓冲区
	pBufferTemp = pBuffer = (LPINT)new INT[ m_nBytesPerRow * m_nHeight ];
	memset( pBuffer, 0, m_nBytesPerRow*m_nHeight*sizeof(INT) );


	////////////////////////////////////////////////////
	//	滤波
	//
	////////////////////////////////////////////////////
	for( h=1; h<m_nHeight-1; h++ )
	{
		for( w=1; w<m_nWidth-1; w++ )
		{
			pMask = mask;
			for( i=-halfHeight; i<=halfHeight; i++ )
			{
				for( j=-halfWidth; j<=halfWidth; j++ )
				{
					*(pBufferTemp+w) += *( pData + (h+i)*m_nBytesPerRow + w+j ) 
										* 
										*pMask++;
				}
			}
			*(pBufferTemp+w) /= *pMask;
		}
		
		pBufferTemp += m_nBytesPerRow;
	}

	//	灰度范围变化
	SpatialTransform( pBuffer );

	//	将缓冲区数据拷入位图数据区中
	pBufferTemp = pBuffer;
	for( i=0; i<m_nHeight; i++ )
		for( j=0; j<m_nBytesPerRow; j++ )
		{
			*pData++ = (BYTE)*pBufferTemp++;
		}

	delete []pBuffer;
}

⌨️ 快捷键说明

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