?? 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 + -