📄 areapro.cpp
字号:
//void Smoothing()
//----------------------------------------------------------------------
//基本功能:该函数用指定的模板(任意大小)来对指针m_pDibObject中的图像
// 对象进行平滑操作,参数nTempH指定模板的高度,参数nTempW指定模
// 板的宽度,参数nTempXc和nTempYc指定模板的中心元素坐标,参数
// fpArray为指定模板元素数组的指针,fCoef指定系数。任何未指
// 定的或默认为-1的坐标将被置为图像的边缘值。比如:nX1和nY1会被
// 置为0;nX2和nY2会被置为图像的宽和高。对整个图像进行低通滤波
// 的最好方法是不传递任何参数。函数使用原先传入的CDibObject对
// 象指针。
//----------------------------------------------------------------------
//参数说明:float *fpArray 指向模板数组的指针
// float fCoef 模板系数
// int nTempW 模板的宽度
// int nTempH 模板的高度
// int nTempXc 模板的中心元素X坐标 ( <= nTempW - 1)
// int nTempYc 模板的中心元素Y坐标 ( <= nTempH - 1)
// int nX1 默认为-1
// int nY1 默认为-1
// int nX2 默认为-1
// int nY2 默认为-1
//----------------------------------------------------------------------
//返 回:无。
//----------------------------------------------------------------------
//注 意:此函数调用区处理类的TemplateOperation()模板操作函数对图像进行
// 平滑操作,默认的模板是3×3的Box平滑模板。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CAreaPro::Smoothing(float *fpArray, float fCoef, int nTempW,
int nTempH, int nTempXc, int nTempYc,
int nX1, int nY1, int nX2, int nY2)
{
//图像指针为空,无法操作返回
if(m_pDibObject == NULL) return(FALSE);
//只处理8位图像
if(m_pDibObject->GetNumBits() != 8)
{
AfxMessageBox("目前只支持8位灰度图像的处理!");
return( FALSE );
}
//坐标规整化
m_pDibObject->NormalizeCoordinates( &nX1, &nY1, &nX2, &nY2 );
//获取图像宽度和高度(以像素为单位)
int nWidth = m_pDibObject->GetWidth();
int nHeight = m_pDibObject->GetHeight();
//对边界像素不作处理
if( nX1 < nTempXc ) nX1 = nTempXc;
if( nY1 < nTempYc ) nY1 = nTempYc;
if( nX2 > nWidth - nTempW + nTempXc + 1) nX2 = nWidth - nTempW + nTempXc + 1;
if( nY2 > nHeight - nTempH + nTempYc + 1) nY2 = nHeight - nTempH + nTempYc + 1;
//定义变量
unsigned char *pBuffer, *pBits;
RGBQUAD *pPalette;
int nWidthBytes, nNewWidthBytes, nNumColors;
DWORD dwNewSize;
//获得图像指针
pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes,
m_pDibObject->GetNumBits(),
&nNewWidthBytes, 8);
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)];
dwNewSize = nNewWidthBytes * nHeight;
//定义用于存储色相值的临时数组
double *pHue = new double [dwNewSize];
if(pHue == NULL) return(FALSE);
memset(pHue, 0, dwNewSize * sizeof(double));
//定义用于存储饱和度值的临时数组
double *pSaturation = new double [dwNewSize];
if(pSaturation == NULL) return(FALSE);
memset(pSaturation, 0, dwNewSize * sizeof(double));
//定义用于存储亮度值的临时数组
unsigned char *pLight = new unsigned char [dwNewSize];
if(pLight == NULL) return(FALSE);
memset(pLight, 0, dwNewSize * sizeof(unsigned char));
float *fTempArray;
//默认为3×3的高通滤波器1模板
static float fpDefaultArray[] = {1.0, 1.0, 1.0,
1.0, 1.0, 1.0,
1.0, 1.0, 1.0};
//没有传入模板,用默认模板
if( fpArray == NULL )
{
fTempArray = fpDefaultArray;
fCoef = 9;
}
//采用传入的模板
else fTempArray = fpArray;
//调用Template操作函数
if(!TemplateOperation(fTempArray, fCoef, nTempW, nTempH, nTempXc, nTempYc,
pBits, nWidthBytes, nX1, nY1, nX2, nY2))
{
return(FALSE);
}
//内存解锁
::GlobalUnlock(m_pDibObject->GetDib());
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//void Sharping()
//----------------------------------------------------------------------
//基本功能:该函数用指定的模板(任意大小)来对指针m_pDibObject中的图像
// 对象进行锐化操作,参数nTempH指定模板的高度,参数nTempW指定模
// 板的宽度,参数nTempXc和nTempYc指定模板的中心元素坐标,参数
// fpArray为指定模板元素数组的指针,fCoef指定系数。任何未指
// 定的或默认为-1的坐标将被置为图像的边缘值。比如:nX1和nY1会被
// 置为0;nX2和nY2会被置为图像的宽和高。对整个图像进行低通滤波
// 的最好方法是不传递任何参数。函数使用原先传入的CDibObject对
// 象指针。
//----------------------------------------------------------------------
//参数说明:float *fpArray 指向模板数组的指针
// int nTempNum 模板个数
// int nTempW 模板的宽度
// int nTempH 模板的高度
// int nTempXc 模板的中心元素X坐标 ( <= nTempW - 1)
// int nTempYc 模板的中心元素Y坐标 ( <= nTempH - 1)
// int nX1 默认为-1
// int nY1 默认为-1
// int nX2 默认为-1
// int nY2 默认为-1
//----------------------------------------------------------------------
//返 回:BOOL
// 成功时返回TRUE,失败时返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CAreaPro::Sharping(float *fpArray, int *nDirection, int nTempW,
int nTempH, int nTempXc, int nTempYc,
int nX1, int nY1, int nX2, int nY2)
{
//图像指针为空,无法操作返回
if(m_pDibObject == NULL) return(FALSE);
//只处理8位图像
if(m_pDibObject->GetNumBits() != 8)
{
AfxMessageBox("目前只支持8位灰度图像的处理!");
return( FALSE );
}
//坐标规整化
m_pDibObject->NormalizeCoordinates( &nX1, &nY1, &nX2, &nY2 );
//获取图像宽度和高度(以像素为单位)
int nWidth = m_pDibObject->GetWidth();
int nHeight = m_pDibObject->GetHeight();
//对边界像素不作处理
if( nX1 < nTempXc ) nX1 = nTempXc;
if( nY1 < nTempYc ) nY1 = nTempYc;
if( nX2 > nWidth - nTempW + nTempXc + 1) nX2 = nWidth - nTempW + nTempXc + 1;
if( nY2 > nHeight - nTempH + nTempYc + 1) nY2 = nHeight - nTempH + nTempYc + 1;
//定义变量
unsigned char *pBuffer, *pBits, *pNewBits1, *pNewBits2;
RGBQUAD *pPalette;
int nWidthBytes, nNumColors;
DWORD dwNewSize;
//获得图像指针
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)];
HGLOBAL hNewDib1, hNewDib2;
//新图像文件大小(以字节为单位)
dwNewSize = nWidthBytes * nHeight;
//为新图像分配内存
hNewDib1 = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwNewSize );
//内存分配失败
if( hNewDib1 == NULL )
{
m_pDibObject->m_nLastError = IMAGELIB_MEMORY_ALLOCATION_ERROR;
::GlobalUnlock( m_pDibObject->GetDib() );
return( FALSE );
}
//新图像指针
pNewBits1 = (unsigned char *) ::GlobalLock( hNewDib1 );
if( pNewBits1 == NULL )
{
::GlobalFree( hNewDib1 );
m_pDibObject->m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
return( FALSE );
}
//复制图像数据
memcpy(pNewBits1, pBits, nWidthBytes * nHeight);
//为新图像分配内存
hNewDib2 = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwNewSize );
//内存分配失败
if( hNewDib2 == NULL )
{
m_pDibObject->m_nLastError = IMAGELIB_MEMORY_ALLOCATION_ERROR;
::GlobalUnlock( m_pDibObject->GetDib() );
return( FALSE );
}
//新图像指针
pNewBits2 = (unsigned char *) ::GlobalLock( hNewDib2 );
if( pNewBits2 == NULL )
{
::GlobalFree( hNewDib2 );
m_pDibObject->m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
return( FALSE );
}
//复制图像数据
memcpy(pNewBits2, pBits, nWidthBytes * nHeight);
float *fTempArray;
//默认为3×3的Kirsch梯度模板
static float fpDefaultArray[] = {5.0, 5.0, 5.0,
-3.0, 0.0, -3.0,
-3.0, -3.0, -3.0};
//没有传入模板,用默认模板
if( fpArray == NULL ) fTempArray = fpDefaultArray;
//采用传入的模板
else fTempArray = fpArray;
int *nTempDirection;
//默认为8个方向
static int nDefaultDirection[] = {1, 1, 1, 1, 1, 1, 1, 1};
//没有传入方向,用默认方向
if( nDirection == NULL ) nTempDirection = nDefaultDirection;
//采用传入的方向
else nTempDirection = nDirection;
//起始方向
int nStartD = 0;
int i = 0;
//查找起始方向
while(nTempDirection[i] == 0 && i < 8)
{
//方向旋转45°
i++;
//给起始方向赋值
nStartD = i;
//对模板进行旋转
TemplateRotating(fTempArray);
}
//没指定起始方向,返回
if(i == 8) return(FALSE);
//调用Template操作函数
if(!TemplateOperation(fTempArray, 1.0, nTempW, nTempH, nTempXc, nTempYc,
pNewBits1, nWidthBytes,
nX1, nY1, nX2, nY2))
{
return(FALSE);
}
//定义与图像数据操作有关的变量
unsigned char *pNewTemp1, *pNewTemp2;
int x, y;
for(i = nStartD + 1; i < 8; i++)
{
//对模板进行旋转
TemplateRotating(fTempArray);
if(nTempDirection[i] == 1)
{
//调用Template操作函数
if(!TemplateOperation(fTempArray, 1.0, nTempW, nTempH, nTempXc, nTempYc,
pNewBits2, nWidthBytes,
nX1, nY1, nX2, nY2))
{
return(FALSE);
}
switch(m_pDibObject->GetNumBits())
{
case 8: //8位图像
//行位置
for(y = nY1; y <= nY2; y++ )
{
//新图像数据指针定位到起始位置
pNewTemp1 = pNewBits1;
//新图像数据指针定位到图像数据每行的起始零位置
pNewTemp1 += y * nWidthBytes;
//新图像数据指针定位到图像数据每行的起始nX1位置
pNewTemp1 += nX1;
//新图像数据指针定位到起始位置
pNewTemp2 = pNewBits2;
//新图像数据指针定位到图像数据每行的起始零位置
pNewTemp2 += y * nWidthBytes;
//新图像数据指针定位到图像数据每行的起始nX1位置
pNewTemp2 += nX1;
//列位置
for(x = nX1; x <= nX2; x++)
{
if(pNewTemp2[x] > pNewTemp1[x])
pNewTemp1[x] = pNewTemp2[x];
}
}
break;
}
//复制图像数据
memcpy(pNewBits2, pBits, nWidthBytes * nHeight);
}
}
//复制图像数据
memcpy(pBits, pNewBits1, nWidthBytes * nHeight);
//内存解锁
::GlobalUnlock(m_pDibObject->GetDib());
//释放不再使用的内存
::GlobalUnlock( hNewDib1 );
::GlobalFree( hNewDib1 );
::GlobalUnlock( hNewDib2 );
::GlobalFree( hNewDib2 );
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//BOOL LapSharping()
//----------------------------------------------------------------------
//基本功能:该函数用指定的模板(任意大小)来对指针m_pDibObject中的图像
// 对象进行Laplacian锐化操作,参数nTempH指定模板的高度,参数
// nTempW指定模板的宽度,参数nTempXc和nTempYc指定模板的中心元素
// 坐标,参数fpArray为指定模板元素数组的指针,fCoef指定系数。任
// 何未指定的或默认为-1的坐标将被置为图像的边缘值。比如:nX1和
// nY1会被置为0;nX2和nY2会被置为图像的宽和高。对整个图像进行低
// 通滤波的最好方法是不传递任何参数。函数使用原先传入的
// CDibObject对象指针。
//----------------------------------------------------------------------
//参数说明:float *fpArray 指向模板数组的指针
// float fCoef 模板系数
// int nTempW 模板的宽度
// int nTempH 模板的高度
// int nTempXc 模板的中心元素X坐标 ( <= nTempW - 1)
// int nTempYc 模板的中心元素Y坐标 ( <= nTempH - 1)
// int nX1 默认为-1
// int nY1 默认为-1
// int nX2 默认为-1
// int nY2 默认为-1
//----------------------------------------------------------------------
//返 回:BOOL
// 成功时返回TRUE,失败时返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CAreaPro::LapSharping(float *fpArray, float fCoef, int nTempW,
int nTempH, int nTempXc, int nTempYc,
int nX1, int nY1, int nX2, int nY2)
{
//图像指针为空,无法操作返回
if(m_pDibObject == NULL) return(FALSE);
//只处理8位图像
if(m_pDibObject->GetNumBits() != 8)
{
AfxMessageBox("目前只支持8位灰度图像的处理!");
return( FALSE );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -