📄 filter.cpp
字号:
case 8:
//image loop
for (j=iY; j<iHeight-iY; j++)
{
for (i=iX; i<iWidth-iX; i++)
{
//template loop
for (jj=0; jj<m_iWinSize; jj++)
{
for (ii=0; ii<m_iWinSize; ii++)
{
//Get gray value of the pixel in line (j-iY+jj) and column (i-iX+ii)
piTemplate[jj*m_iWinSize+ii] =
pOldBits[(iHeight-1-(j-iY+jj))*nWidthBytes + (i-iX+ii)];
}
}
//Sort the elements in the template
BubbleSort(piTemplate, iAmount);
//Get the median value in the template
pNewBits[(iHeight-1-j)*nWidthBytes + i] = piTemplate[0];
}
}
break;
case 16:
break;
case 24:
break;
case 32:
break;
}
//Free the temporary memory
delete [] piTemplate;
piTemplate = NULL;
//Free the memory for the old image
::GlobalUnlock(m_pImageObject->GetDib());
::GlobalFree(m_pImageObject->GetDib());
//Update the DIB in the object pointed by m_pImaeObject
::GlobalUnlock(hNewDib);
m_pImageObject->SetDib(hNewDib);
return TRUE;
}
/**********************************************************************
* Copyright (c) 2003, Medical Image Processing Lab, Sichuan University
* All rights reserved.
*
* 文件名称:Equalize.cpp
* 摘 要:图像滤波中冒泡法CFilter的源文件
*
* 当前版本:1.1
* 作 者:jian wei zhang
* 完成日期:2004年11月8日
************************************************************************/
inline BOOL CFilter::BubbleSort(int *pdData, int iAmount)
{
ASSERT(pdData != NULL);
if (iAmount <= 0)
{
return FALSE;
}
int dTemp = 0;
for (int j=iAmount-1; j>=0; j--)
{
for (int i=0; i<j; i++)
{
if (pdData[i] > pdData[i+1])
{
dTemp = pdData[i];
pdData[i] = pdData[i+1];
pdData[i+1] = dTemp;
}
}
}
return TRUE;
}
BOOL CFilter::OnLinerFilter()
{
if (m_pImageObject == NULL)
{
return FALSE;
}
int iWidth = m_pImageObject->GetWidth();
int iHeight = m_pImageObject->GetHeight();
int iNumBits=m_pImageObject->GetNumBits();
/******************************the old image*****************************/
unsigned char *pOldBuffer, *pNewBuffer, *pOldBits, *pNewBits;
BITMAPFILEHEADER *pOldBFH, *pNewBFH;
BITMAPINFOHEADER *pOldBIH, *pNewBIH;
RGBQUAD *pOldPalette, *pNewPalette;
int nWidthBytes, nNumColors;
pOldBuffer = (unsigned char *) m_pImageObject->GetDIBPointer(&nWidthBytes, m_pImageObject->GetNumBits());
if (pOldBuffer == NULL)
{
return FALSE;
}
pOldBFH = (BITMAPFILEHEADER *) pOldBuffer;
pOldBIH = (BITMAPINFOHEADER *) &pOldBuffer[sizeof(BITMAPFILEHEADER)];
nNumColors = m_pImageObject->GetNumColors();
pOldPalette = (RGBQUAD *) &pOldBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
pOldBits = (unsigned char *) &pOldBuffer[sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
/*****************************the new image*****************************/
DWORD dwNewSize;
HGLOBAL hNewDib;
//Allocate a global memory block for the new image
dwNewSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ nNumColors * sizeof(RGBQUAD)
+ nWidthBytes * (m_pImageObject->GetHeight());
hNewDib = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwNewSize);
if (hNewDib == NULL)
{
m_pImageObject->m_nLastError = IMAGELIB_MEMORY_ALLOCATION_ERROR;
::GlobalUnlock(m_pImageObject->GetDib());
return FALSE;
}
//Get the pointer to the new memory block
pNewBuffer = (unsigned char *) ::GlobalLock(hNewDib);
if (pNewBuffer == NULL)
{
::GlobalFree( hNewDib );
m_pImageObject->m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
::GlobalUnlock(m_pImageObject->GetDib());
return FALSE;
}
pNewBFH = (BITMAPFILEHEADER *) pNewBuffer;
pNewBIH = (BITMAPINFOHEADER *) &pNewBuffer[sizeof(BITMAPFILEHEADER)];
pNewPalette = (RGBQUAD *) &pNewBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
pNewBits = (unsigned char *) &pNewBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
//Make a copy of the old image
memcpy(pNewBuffer,pOldBuffer,dwNewSize);
/*******************************Liner filter****************************/
//初始化一些变量
int iAmount = m_iWinSize*m_iWinSize;
double totalworth=0;
double worth;
double newworth;
//the original processing point
int iX = m_iWinSize / 2;
int iY = m_iWinSize / 2;
//begin to process
int i, j, ii, jj;
switch (iNumBits)
{
case 8:
//image loop
for (j=iY; j<iHeight-iY; j++)
{
for (i=iX; i<iWidth-iX; i++)
{
//template loop
for (jj=0; jj<m_iWinSize; jj++)
{
for (ii=0; ii<m_iWinSize; ii++)
{
worth+=m_piTemplate[jj*m_iWinSize+ii]*pOldBits[(iHeight-1-(j-iY+jj))*nWidthBytes + (i-iX+ii)];
if (m_piTemplate[jj*m_iWinSize+ii]>=0)
{
totalworth+=m_piTemplate[jj*m_iWinSize+ii];
}
}
}
newworth=worth/totalworth;
pNewBits[(iHeight-1-j)*nWidthBytes + i] = (int)newworth;
newworth=0;
worth=0;
totalworth=0;
}
}
for(i=0;i<m_iWinSize;i++)
{
m_piTemplate[i]=0;
}
break;
case 16:
break;
case 24:
break;
case 32:
break;
}
//Free the temporary memory
delete [] m_piTemplate;
m_piTemplate = NULL;
//Free the memory for the old image
::GlobalUnlock(m_pImageObject->GetDib());
::GlobalFree(m_pImageObject->GetDib());
//Update the DIB in the object pointed by m_pImaeObject
::GlobalUnlock(hNewDib);
m_pImageObject->SetDib(hNewDib);
return TRUE;
}
BOOL CFilter::OnSelectFilter()
{
if (m_pImageObject == NULL)
{
return FALSE;
}
int iWidth = m_pImageObject->GetWidth();
int iHeight = m_pImageObject->GetHeight();
/*************************************the old image*****************************/
unsigned char *pOldBuffer, *pNewBuffer, *pOldBits, *pNewBits;
BITMAPFILEHEADER *pOldBFH, *pNewBFH;
BITMAPINFOHEADER *pOldBIH, *pNewBIH;
RGBQUAD *pOldPalette, *pNewPalette;
int nWidthBytes, nNumColors;
pOldBuffer = (unsigned char *) m_pImageObject->GetDIBPointer(&nWidthBytes, m_pImageObject->GetNumBits());
if (pOldBuffer == NULL)
{
return FALSE;
}
pOldBFH = (BITMAPFILEHEADER *) pOldBuffer;
pOldBIH = (BITMAPINFOHEADER *) &pOldBuffer[sizeof(BITMAPFILEHEADER)];
nNumColors = m_pImageObject->GetNumColors();
pOldPalette = (RGBQUAD *) &pOldBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
pOldBits = (unsigned char *) &pOldBuffer[sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
/*************************************the new image*****************************/
DWORD dwNewSize;
HGLOBAL hNewDib;
//Allocate a global memory block for the new image
dwNewSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ nNumColors * sizeof(RGBQUAD)
+ nWidthBytes * (m_pImageObject->GetHeight());
hNewDib = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwNewSize);
if (hNewDib == NULL)
{
m_pImageObject->m_nLastError = IMAGELIB_MEMORY_ALLOCATION_ERROR;
::GlobalUnlock(m_pImageObject->GetDib());
return FALSE;
}
//Get the pointer to the new memory block
pNewBuffer = (unsigned char *) ::GlobalLock(hNewDib);
if (pNewBuffer == NULL)
{
::GlobalFree( hNewDib );
m_pImageObject->m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
::GlobalUnlock(m_pImageObject->GetDib());
return FALSE;
}
pNewBFH = (BITMAPFILEHEADER *) pNewBuffer;
pNewBIH = (BITMAPINFOHEADER *) &pNewBuffer[sizeof(BITMAPFILEHEADER)];
pNewPalette = (RGBQUAD *) &pNewBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
pNewBits = (unsigned char *) &pNewBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
//Make a copy of the old image
memcpy(pNewBuffer,pOldBuffer,dwNewSize);
/******************模板选择滤波*********************************/
//定义存放平均值的变量
int lpaver[10];
//int plaver[10];
int miniv;
//定义循环变量
int i, j, n, m;
//导入10个模板值
int ptemp[10][25]={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},
{1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,1,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0}};
/***************************根据方差选择模板****************************/
int pfangcha[10];
//临时变量
int temp;
int ptemplate;
for(j=2;j<iHeight-2;j++)
{
for(i=2;i<iWidth-2;i++)
{
//循环取点
int pixarray[25]={pOldBits[(iHeight-1-j)*nWidthBytes+i],pOldBits[(iHeight-1-j)*nWidthBytes+i+1],
pOldBits[(iHeight-1-j)*nWidthBytes+i+2],pOldBits[(iHeight-1-j)*nWidthBytes+i+3],pOldBits[(iHeight-1-j)*nWidthBytes+i+4],
pOldBits[(iHeight-1-j-1)*nWidthBytes+i],pOldBits[(iHeight-1-j-1)*nWidthBytes+i+1],pOldBits[(iHeight-1-j-1)*nWidthBytes+i+2],
pOldBits[(iHeight-1-j-1)*nWidthBytes+i+3],pOldBits[(iHeight-1-j-1)*nWidthBytes+i+4],pOldBits[(iHeight-1-j-2)*nWidthBytes+i],
pOldBits[(iHeight-1-j-2)*nWidthBytes+i+1],pOldBits[(iHeight-1-j-2)*nWidthBytes+i+2],pOldBits[(iHeight-1-j-2)*nWidthBytes+i+3],
pOldBits[(iHeight-1-j-2)*nWidthBytes+i+4],pOldBits[(iHeight-1-j-3)*nWidthBytes+i],pOldBits[(iHeight-1-j-3)*nWidthBytes+i+1],
pOldBits[(iHeight-1-j-3)*nWidthBytes+i+2],pOldBits[(iHeight-1-j-3)*nWidthBytes+i+3],pOldBits[(iHeight-1-j-3)*nWidthBytes+i+4],
pOldBits[(iHeight-1-j-4)*nWidthBytes+i],pOldBits[(iHeight-1-j-4)*nWidthBytes+i+1],pOldBits[(iHeight-1-j-4)*nWidthBytes+i+2],
pOldBits[(iHeight-1-j-4)*nWidthBytes+i+3],pOldBits[(iHeight-1-j-4)*nWidthBytes+i+4]};
for(n=0;n<10;n++)
{
temp=0;
ptemplate=0;
for(m=0;m<25;m++)
{
temp+=(ptemp[n][m]*pixarray[m])*(ptemp[n][m]*pixarray[m]);
ptemplate+=ptemp[n][m]*pixarray[m];
}
pfangcha[n]=temp;
lpaver[n]=ptemplate;
}
//取均值
lpaver[0]=lpaver[0]/25;
lpaver[1]=lpaver[1]/7;
lpaver[2]=lpaver[2]/7;
lpaver[3]=lpaver[3]/7;
lpaver[4]=lpaver[4]/7;
lpaver[5]=lpaver[5]/9;
lpaver[6]=lpaver[6]/7;
lpaver[7]=lpaver[7]/7;
lpaver[8]=lpaver[8]/7;
lpaver[9]=lpaver[9]/7;
/*****************************判断最小方差*******************************/
miniv=pfangcha[0];
for(n=1;n<10;n++)
{
if (pfangcha[n]<miniv)
{
miniv=pfangcha[n];
}
}
//方差到均值的映射
//模板0
if (miniv==pfangcha[0])
{
pNewBits[(iHeight-1-j-2)*nWidthBytes+i+2]=lpaver[0];
}
//模板1
else if (miniv==pfangcha[1])
{
pNewBits[(iHeight-1-j-1)*nWidthBytes+i+2]=lpaver[1];
}
//模板2
else if (miniv==pfangcha[2])
{
pNewBits[(iHeight-1-j-2)*nWidthBytes+i+2]=lpaver[2];
}
//模板3
else if (miniv==pfangcha[3])
{
pNewBits[(iHeight-1-j-1)*nWidthBytes+i]=lpaver[3];
}
//模板4
else if (miniv==pfangcha[4])
{
pNewBits[(iHeight-1-j)*nWidthBytes+i+1]=lpaver[4];
}
//模板5
else if (miniv==pfangcha[5])
{
pNewBits[(iHeight-1-j-1)*nWidthBytes+i+1]=lpaver[5];
}
//模板6
else if (miniv==pfangcha[6])
{
pNewBits[(iHeight-1-j-2)*nWidthBytes+i+1]=lpaver[6];
}
//模板7
else if (miniv==pfangcha[7])
{
pNewBits[(iHeight-1-j-2)*nWidthBytes+i]=lpaver[7];
}
//模板8
else if (miniv==pfangcha[8])
{
pNewBits[(iHeight-1-j)*nWidthBytes+i+1]=lpaver[8];
}
//模板9
else if (miniv==pfangcha[9])
{
pNewBits[(iHeight-1-j)*nWidthBytes+i]=lpaver[9];
}
}
}
//Free the memory for the old image
::GlobalUnlock(m_pImageObject->GetDib());
::GlobalFree(m_pImageObject->GetDib());
//Update the DIB in the object pointed by m_pImaeObject
::GlobalUnlock(hNewDib);
m_pImageObject->SetDib(hNewDib);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -