?? areapro.cpp
字號:
pNeighborTemp += nWidthBytes * (nTempYc - i);
//第x - nTempXc + j列像素的指針
pNeighborTemp += (j - nTempXc);
//獲取像素值
Data = *pNeighborTemp;
pGray[i * nTempW + j] = (float)Data;
}
}
//卷積核尺寸
int nSize = nTempW * nTempH;
//對紅色分量作卷積
Convolution(pGray, fpArray, fCoef, nSize, &Data);
//將計算結果賦于新圖像
*pNewTemp = Data;
//新舊圖像數據指針加1
pOldTemp++;
pNewTemp++;
}
}
//釋放內存
delete [] pGray;
//復制圖像數據
memcpy( pOldBits, pNewBits, nWidthBytes * nHeight );
::GlobalUnlock( hNewDib );
::GlobalFree( hNewDib );
return( TRUE );
}
BOOL CAreaPro::GradSharping(int Threshold, int nX1, int nY1, int nX2, int nY2,
CDibObject *pDibObject)
{
//圖像指針為空,無法操作返回
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();
int nTempXc = 0;
int nTempYc = 0;
int nTempW = 2;
int nTempH = 2;
//對邊界像素不作處理
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 aTemplate[4];
//Roberts H1模板
aTemplate[0] = 1.0;
aTemplate[1] = 0.0;
aTemplate[2] = -1.0;
aTemplate[3] = 0.0;
//調用Template操作函數
if(!TemplateOperation(aTemplate, 1.0, nTempW, nTempH, nTempXc, nTempYc,
pNewBits1, nWidthBytes,
nX1, nY1, nX2, nY2))
{
return(FALSE);
}
//Roberts H2模板
aTemplate[0] = 0.0;
aTemplate[1] = 1.0;
aTemplate[2] = 0.0;
aTemplate[3] = -1.0;
//調用Template操作函數
if(!TemplateOperation(aTemplate, 1.0, nTempW, nTempH, nTempXc, nTempYc,
pNewBits2, nWidthBytes,
nX1, nY1, nX2, nY2))
{
return(FALSE);
}
//定義與圖像數據操作有關的變量
unsigned char *pOldTemp, *pNewTemp1, *pNewTemp2;
int x, y;
DWORD dwTemp;
switch(m_pDibObject->GetNumBits())
{
case 8: //8位圖像
//行位置
for(y = nY1; y <= nY2; y++ )
{
//原圖像數據指針定位到起始位置
pOldTemp = pBits;
//原圖像數據指針定位到圖像數據每行的起始零位置
pOldTemp += y * nWidthBytes;
//原圖像數據指針定位到圖像數據每行的起始nX1-1位置
pOldTemp += nX1;
//新圖像數據指針定位到起始位置
pNewTemp1 = pNewBits1;
//新圖像數據指針定位到圖像數據每行的起始零位置
pNewTemp1 += y * nWidthBytes;
//新圖像數據指針定位到圖像數據每行的起始nX1位置
pNewTemp1 += nX1;
//新圖像數據指針定位到起始位置
pNewTemp2 = pNewBits2;
//新圖像數據指針定位到圖像數據每行的起始零位置
pNewTemp2 += y * nWidthBytes;
//新圖像數據指針定位到圖像數據每行的起始nX1位置
pNewTemp2 += nX1;
//列位置
for(x = nX1; x <= nX2; x++)
{
//計算目標圖像中當前點的最終像素值
dwTemp = (DWORD)(pNewTemp1[x] + pNewTemp2[x]);
//dwTemp = (DWORD)(sqrt(pNewTemp1[x] * pNewTemp1[x]
// + pNewTemp2[x] * pNewTemp2[x]));
//判斷是否小于閾值
if(dwTemp < 255)
{
//判斷是否大于閾值,對于小于的情況,灰度值不變
if((int)dwTemp >= Threshold)
{
pOldTemp[x] = (unsigned char)dwTemp;
}
}
else
{
//直接賦值為255
pOldTemp[x] = 255;
}
}
}
break;
}
//內存解鎖
::GlobalUnlock(m_pDibObject->GetDib());
//釋放不再使用的內存
::GlobalUnlock( hNewDib1 );
::GlobalFree( hNewDib1 );
::GlobalUnlock( hNewDib2 );
::GlobalFree( hNewDib2 );
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//BOOL TemplateRotating()
//----------------------------------------------------------------------
//基本功能:該函數用于對傳入的模板進行旋轉操作,以獲取不同方向上的模板。
//----------------------------------------------------------------------
//參數說明:float *fpTemplate 指向模板數組的指針
//----------------------------------------------------------------------
//返 回:無
//----------------------------------------------------------------------
//注 意:此函數為保護型,只能在CAreaPro類中使用,并只能用于3×3的模板。
// 此函數每次旋轉45°
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
void CAreaPro::TemplateRotating(float *fpTemplate)
{
float fTemp[8];
float fDataTemp;
//將模板周圍值按順時針方向賦于一臨時數組
fTemp[0] = fpTemplate[0];
fTemp[1] = fpTemplate[1];
fTemp[2] = fpTemplate[2];
fTemp[3] = fpTemplate[5];
fTemp[4] = fpTemplate[8];
fTemp[5] = fpTemplate[7];
fTemp[6] = fpTemplate[6];
fTemp[7] = fpTemplate[3];
//f進行數據旋轉
fDataTemp = fTemp[7];
for(int i = 7; i > 0; i--)
{
fTemp[i] = fTemp[i - 1];
}
fTemp[0] = fDataTemp;
//求得結果
fpTemplate[0] = fTemp[0];
fpTemplate[1] = fTemp[1];
fpTemplate[2] = fTemp[2];
fpTemplate[5] = fTemp[3];
fpTemplate[8] = fTemp[4];
fpTemplate[7] = fTemp[5];
fpTemplate[6] = fTemp[6];
fpTemplate[3] = fTemp[7];
}
////////////////////////////////////////////////////////////////////////
//BOOL GetMedian()
//----------------------------------------------------------------------
//基本功能:本函數對指定的一個數組進行排序,并得到其中值。
//----------------------------------------------------------------------
//參數說明:int nType 排序方式,其取值如下:
// 0——冒泡排序
// 1——數組排序
// unsigned char *pData 數組
// int nSize 數組大小
//----------------------------------------------------------------------
//返 回:無。
//----------------------------------------------------------------------
//注 意:此函數聲明為私有型,只能在CAreaPro類中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
unsigned char CAreaPro::GetMedian(unsigned char *pData, int nSize, int nType)
{
int nMedian;
//指定的排序算法不可識別,用冒泡排序算法。
if(nType < 0 || nType > 1) nType = 1;
switch( nType )
{
case 0: //冒泡排序
{
int nTemp;
int nLast = nSize - 1;
bool bSorted = true;
do
{
bSorted = true;
for (int i = 0; i < nLast; i++)
{
if (pData[i] > pData[i + 1])
{
nTemp = pData[i];
pData[i] = pData[i + 1];
pData[i + 1] = nTemp;
bSorted = false;
}
}
nLast--;
} while (!bSorted);
}
nMedian = pData[nSize / 2];
break;
case 1:
{
int i;
int nHisto[256];
for( i = 0; i < 256; i++) nHisto[ i ] = 0;
//統計相同灰度值出現的次數
for( i = 0; i < nSize; i++)
{
nHisto[(int)pData[i]]++;
}
//取直方圖的中值
int nCount = 0;
for( i = 0; i < 256; i++)
{
//存放直方圖中相同灰度值出現次數的累加和
nCount += nHisto[i];
if(nCount >= (int)(nSize / 2 + 1))
{
nMedian = i;
break;
}
}
}
break;
}
return nMedian;
}
////////////////////////////////////////////////////////////////////////
//BOOL EdgeTracing()
//----------------------------------------------------------------------
//基本功能:本函數對傳入的CDibObject圖像對象進行輪廓跟蹤。
//----------------------------------------------------------------------
//參數說明:CDibObject *pDibObject 圖像對象指針
//----------------------------------------------------------------------
//返 回:BOOL
// 成功時返回TRUE,失敗時返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CAreaPro::EdgeTracing(CDibObject *pDibObject)
{
//圖像指針為空,無法操作返回
if(m_pDibObject == NULL) return(FALSE);
//只支持8位圖像
if(m_pDibObject->GetNumBits() != 8)
{
// 提示用戶參數設置錯誤
AfxMessageBox("只支持8位圖像,請重新載入!");
// 返回
return( FALSE );
}
//獲取圖像寬度和高度(以像素為單位)
int nWidth = m_pDibObject->GetWidth();
int nHeight = m_pDibObject->GetHeight();
//定義變量
unsigned char *pOldBuffer;
unsigned char *pOldBits, *pNewBits;
unsigned char *pOldTemp, *pNewTemp;
BITMAPFILEHEADER *pOldBFH;
BITMAPINFOHEADER *pOldBIH;
RGBQUAD *pOldPalette;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -