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

📄 areapro.cpp

📁 用C++实现的数字图像处理各个算法源代码 我精心整理的 很难的啊 希望可以给大家带来帮助
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// AreaPro.cpp: implementation of the CAreaPro class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "AreaPro.h"

IMPLEMENT_DYNCREATE(CAreaPro, CObject)

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

//Diagnostics and dump member functions, overridden
#ifdef _DEBUG
void CAreaPro::Dump(CDumpContext &dc) const
{
	//call base class function first
	CObject::Dump(dc);
}
#endif

#ifdef _DEBUG
void CAreaPro::AssertValid() const
{
	//call inherited AssertValid first
	CObject::AssertValid();
	//Check CDibObject members...
	ASSERT(m_pDibObject != NULL);	//Must exist
}
#endif

/***********************************************************************
*                                                                      *
*                               区处理类                               *
*                                                                      *
***********************************************************************/

////////////////////////////////////////////////////////////////////////
//构造函数CAreaPro()    
//----------------------------------------------------------------------
//基本功能:构造一个CAreaPro类的对象,如不传入CDibObject对象。第一次调   
//			用某一个处理函数时必须给出一个CDibObject对象指针。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返    回:无
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////

CAreaPro::CAreaPro()
{

}

////////////////////////////////////////////////////////////////////////
//构造函数CAreaPro()    
//----------------------------------------------------------------------
//基本功能:构造一个CAreaPro类的对象并传入CDibObject对象。所有的操作都
//			针对该对象,直到另一个对象作为参数被传给图像处理函数。
//----------------------------------------------------------------------
//参数说明:CDibObject *pDibObject
//----------------------------------------------------------------------
//返    回:无
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
CAreaPro::CAreaPro(CDibObject *pDibObject)
{
	m_pDibObject = pDibObject;
}

//析构函数
CAreaPro::~CAreaPro()
{

}

////////////////////////////////////////////////////////////////////////
//void SetDibObjectClass(CDibObject *pDibObject)   
//----------------------------------------------------------------------
//基本功能:本函数为CAreaPro类对象指定一个CDibObject对象指针
//----------------------------------------------------------------------
//参数说明:CDibObject *pDibObject, 默认为NULL。
//----------------------------------------------------------------------
//返    回:无。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
void CAreaPro::SetDibObjectClass( CDibObject *pDibObject )
{
	m_pDibObject = pDibObject;
}

////////////////////////////////////////////////////////////////////////
//int *GetHistogram()   
//----------------------------------------------------------------------
//基本功能:本函数获得传入的m_pDibObject对象中图像直方图。如果进行此调
//			整之前没有指定一个CDibObject对象指针,则必须在调整时加以指
//			定。任何未传入的坐标值或默认的-1坐标值都将被置为图像的最大值
//			或最大植。变量nX1和nY1将被置为0,nX2将被置为图像宽度减1,nY2
//			将被置为图像高度减1。想要在整个图像上进行操作时,最好的方法
//			是不传入nX1、nY1、nX2和nY2值。这样它们会被默认为整个图像。
//----------------------------------------------------------------------
//参数说明:int	nX1, 默认为-1
//			int	nY1, 默认为-1
//			int	nX2, 默认为-1
//			int	nY2, 默认为-1
//----------------------------------------------------------------------
//返    回:直方图数组指针*pBuffer其中:
//			nHistogramBuffer[]		存储亮度直方图数据
//			nHistogramBuffer[256]	存储红色直方图数据
//			nHistogramBuffer[512]	存储绿色直方图数据
//			nHistogramBuffer[768]	存储蓝直方图数据
//----------------------------------------------------------------------
//注    意:此函数声明为保护型,只能在CAreaPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int *CAreaPro::GetHistogram( int nX1, int nY1, int nX2, int nY2)
{
	//无CDibObject对象, 返回FALSE
	if( m_pDibObject == NULL ) return( FALSE );

	//坐标规整化
	m_pDibObject->NormalizeCoordinates( &nX1, &nY1, &nX2, &nY2 );

	//定义变量
	unsigned char *pBuffer, *pBits;
	RGBQUAD *pPalette;
	int nWidthBytes, nNumColors;

	//获得图像指针
	pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes, 
		                                       m_pDibObject->GetNumBits() );
	if( pBuffer == NULL ) return( NULL );

	//获得颜色数
	nNumColors = m_pDibObject->GetNumColors();
	//获得调色板指针
	pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)];
	//获得位图数据指针
	pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
		                               + nNumColors * sizeof(RGBQUAD)];

	//创建直方图数据
	int *nHistogramBuffer = CreateHistogram(nX1, nY1, nX2, nY2, pBits,
		                                    pPalette, nWidthBytes);

	::GlobalUnlock(m_pDibObject->GetDib());

	return(nHistogramBuffer);

}

////////////////////////////////////////////////////////////////////////
//int *CreateHistogram()   
//----------------------------------------------------------------------
//基本功能:本函数创建传入m_pDibObject对象中图像的直方图。如果进行此调
//			整之前没有指定一个CDibObject对象指针,则必须在调整时加以指
//			定。任何未传入的坐标值或默认的-1坐标值都将被置为图像的最大值
//			或最大植。变量nX1和nY1将被置为0,nX2将被置为图像宽度减1,nY2
//			将被置为图像高度减1。想要在整个图像上进行操作时,最好的方法
//			是不传入nX1、nY1、nX2和nY2值。这样它们会被默认为整个图像。
//----------------------------------------------------------------------
//参数说明:int	nX1					默认为-1
//			int	nY1					默认为-1
//			int	nX2					默认为-1
//			int	nY2					默认为-1
//			unsigned char *pData	图像位图数据指针
//			RGBQUAD *pPalette		图像调色板指针
//			int nWidthBytes			图像字节宽度
//----------------------------------------------------------------------
//返    回:直方图数组指针*pBuffer其中:
//			pBuffer[]		存储亮度直方图数据
//			pBuffer[256]	存储红色直方图数据
//			pBuffer[512]	存储绿色直方图数据
//			pBuffer[768]	存储蓝直方图数据
//----------------------------------------------------------------------
//注    意:此函数声明为保护型,只能在CAreaPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int *CAreaPro::CreateHistogram(int nX1, int nY1, int nX2, int nY2, 
							   unsigned char *pData, 
							   RGBQUAD *pPalette, 
							   int nWidthBytes)
{
	//图像指针为空,无法操作返回
	if(m_pDibObject == NULL) return(FALSE);

	//分配直方图数据缓存区(数组)
	int *pBuffer = new int [256 * 4];
	//分配直方图数据缓存区失败
	if(pBuffer == NULL) return( NULL );

	//直方图数据缓存区清零
	memset(pBuffer, 0, (256 * 4) * sizeof(int));

	//变量定义
	DWORD dwGray;
	int x, y;
	unsigned char *pTemp, ucRed, ucGreen, ucBlue;

	//图像的高度
	int nHeight = m_pDibObject->GetHeight();

	switch(m_pDibObject->GetNumBits())
	{
	case 1:				//每像素位数为1,不处理
		break;
	case 4:				//每像素位数为4,不处理
		break;
	case 8:				//每像素位数为8		
		for( y = nY1; y <= nY2; y++ )
		{
			//数据指针定位到图像数据起始位置
			pTemp = pData;
			//数据指针定位到图像数据每行的起始零位置
			pTemp += ((nHeight - 1 - y) * nWidthBytes);
			//数据指针定位到图像数据每行的起始nX1位置
			pTemp += nX1;
			for(x = nX1; x <= nX2; x++)
			{
				//pTemp[x]为当前像素值,以此为调色板项的索引值,
				//取出调色板项的相应红绿蓝分量值。
				ucRed   = pPalette[pTemp[x]].rgbRed;
				ucGreen = pPalette[pTemp[x]].rgbGreen;
				ucBlue  = pPalette[pTemp[x]].rgbBlue;

				//按关系L=0.3R+0.59G+0.11B,得到亮度值
				dwGray  = ((DWORD) ucRed * 30 +
					        (DWORD) ucGreen * 59 +
					        (DWORD) ucBlue * 11) / 100;
				dwGray &= 0x000000ff;

				//亮度直方图数据
				pBuffer[dwGray]++;
				//红色直方图数据
				pBuffer[256 + ucRed]++;
				//绿色直方图数据
				pBuffer[512 + ucGreen]++;
				//蓝色直方图数据
				pBuffer[768 + ucBlue]++;

			}
		}
		break;
	case 16:				//每像素位数为16
		for(y = nY1; y <= nY2; y++)
		{
			//数据指针定位到图像数据起始位置
			pTemp = pData;
			//数据指针定位到图像数据每行的起始零位置
			pTemp += (( nHeight - 1 - y) * nWidthBytes);
			//数据指针定位到图像数据每行的起始nX1位置
			pTemp += (nX1 * 2);
			for(x = nX1; x <= nX2; x++)
			{
				//调用GETRGB555宏获取三原色分量
				GETRGB555(ucRed, ucGreen, ucBlue, pTemp);

				//按关系L=0.3R+0.59G+0.11B,得到亮度值
				dwGray = ((DWORD) ucRed * 30 +
					       (DWORD) ucGreen * 59 +
					       (DWORD) ucBlue * 11) / 100;
				dwGray &= 0x000000ff;

				//亮度直方图数据
				pBuffer[dwGray]++;
				//红色直方图数据
				pBuffer[256 + ucRed]++;
				//绿色直方图数据
				pBuffer[512 + ucGreen]++;
				//蓝色直方图数据
				pBuffer[768 + ucBlue]++;

				//数据指针加2
				pTemp += 2;
			}
		}
		break;
	case 24:				//每像素位数为24
		for(y = nY1; y < nY2; y++)
		{
			//数据指针定位到图像数据起始位置
			pTemp = pData;
			//数据指针定位到图像数据每行的起始零位置
			pTemp += (( nHeight - 1 - y) * nWidthBytes);
			//数据指针定位到图像数据每行的起始nX1位置
			pTemp += (nX1 * 3);

			for(x=nX1; x<=nX2; x++)
			{
				//获取像素颜色的三原色。
				ucRed   = pTemp[x * 3 + 2];
				ucGreen = pTemp[x * 3 + 1];
				ucBlue  = pTemp[x * 3];

				//按关系L=0.3R+0.59G+0.11B,得到亮度值
				dwGray  = ((DWORD) ucRed * 30 +
					        (DWORD) ucGreen * 59 +
					        (DWORD) ucBlue * 11) / 100;
				dwGray &= 0x000000ff;

				//亮度直方图数据
				pBuffer[dwGray]++;
				//红色直方图数据
				pBuffer[256 + ucRed]++;
				//绿色直方图数据
				pBuffer[512 + ucGreen]++;
				//蓝色直方图数据
				pBuffer[768 + ucBlue]++;

				//数据指针加3
				pTemp += 3;
			}
		}
		break;
	case 32:				//每像素位数为24
		for(y = nY1; y <= nY2; y++)
		{
			//数据指针定位到图像数据起始位置
			pTemp = pData;
			//数据指针定位到图像数据每行的起始零位置
			pTemp += (( nHeight - 1 - y) * nWidthBytes);
			//数据指针定位到图像数据每行的起始nX1位置
			pTemp += (nX1 * 4);

			for(x = nX1; x <= nX2; x++)
			{
				//调用GETRGB888宏获取像素颜色的三原色。
				GETRGB888(ucRed, ucGreen, ucBlue, pTemp);

				//按关系L=0.3R+0.59G+0.11B,得到亮度值
				dwGray = ((DWORD) ucRed * 30 +
					       (DWORD) ucGreen * 59 +
					       (DWORD) ucBlue * 11) / 100;

				dwGray &= 0x000000ff;

				//亮度直方图数据
				pBuffer[dwGray]++;
				//红色直方图数据
				pBuffer[256 + ucRed]++;
				//绿色直方图数据
				pBuffer[512 + ucGreen]++;
				//蓝色直方图数据
				pBuffer[768 + ucBlue]++;

				//数据指针加4
				pTemp += 4;
			}
		}
		break;
	}
	
	return( pBuffer );
}

////////////////////////////////////////////////////////////////////////
//BOOL Convolution()   
//----------------------------------------------------------------------
//基本功能:本函数对指定的两个数组进行卷积运算。
//----------------------------------------------------------------------
//参数说明:float *fpData		被执行卷积的数组
//			float *fpKernel		卷积核数组
//			float fCoef			卷积系数
//			int nSize			卷积尺寸
//			unsigned char *nResult		卷积结果
//----------------------------------------------------------------------
//返    回:无。
//----------------------------------------------------------------------
//注    意:此函数声明为私有型,只能在CAreaPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
void CAreaPro::Convolution(float *fpData, float *fpKernel, float fCoef, 
						   int nSize, unsigned char *nResult)
{

	int i;
	float Sum = 0, fResult;

	//计算卷积
	for(i = 0; i < nSize; i++)
	{
		Sum += fpData[i] * fpKernel[i];
	}

	//执行卷积后的结果
	fResult = Sum / fCoef;

	//求绝对值
	fResult = (float)fabs(fResult);
	
	//判断是否超过255
	if(fResult > 255.0 )
	{
		// 直接赋值为255
		fResult = 255.0;
	}
	
	//对卷积结果四舍五入,并转换成unsigned char类型作为最后返回结果
	*nResult = (unsigned char) (fResult + 0.5);			
}

////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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