📄 imgenhance.cpp
字号:
/************************************************************************/
void CImgEnhance::GradSharp(unsigned char Thre)
{
unsigned char* pSrc; // 指向源图像的指针
unsigned char* pDst;
unsigned char* pSrc1;
unsigned char* pSrc2;
LONG i,j; // 循环变量
int bTemp;
if(m_pImgDataOut != NULL)
{
delete []m_pImgDataOut;
m_pImgDataOut = NULL;
}
int lineByte = (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4;
if(m_nBitCount != 8)
{
AfxMessageBox("只能处理8位灰度图像!");
return ;
}
//创建要复制的图像区域
m_nBitCountOut = m_nBitCount;
int lineByteOut = (m_imgWidth * m_nBitCountOut / 8 + 3) / 4 * 4;
if (!m_pImgDataOut)
{
m_pImgDataOut = new unsigned char[lineByteOut * m_imgHeight];
}
int pixelByte = m_nBitCountOut / 8;
for(i = 0; i < m_imgHeight; i++){
for(j = 0; j < m_imgWidth * pixelByte; j++)
*(m_pImgDataOut + i * lineByteOut + j) = *(m_pImgData + i * lineByteOut + j);
}
for(i = 0; i < m_imgHeight; i++) // 每行
{
for(j = 0; j < m_imgWidth; j++) // 每列
{
//指向新DIB第i行第j列的像素的指针
pDst = m_pImgDataOut + lineByte * (m_imgHeight -1 - i) + j;
// 进行梯度运算
// 指向DIB第i行,第j个象素的指针
pSrc = (unsigned char*)m_pImgData + lineByte * (m_imgHeight - 1 - i) + j;
// 指向DIB第i+1行,第j个象素的指针
pSrc1 = (unsigned char*)m_pImgData + lineByte * (m_imgHeight - 2 - i) + j;
// 指向DIB第i行,第j+1个象素的指针
pSrc2 = (unsigned char*)m_pImgData + lineByte * (m_imgHeight - 1 - i)
+ j + 1;
bTemp = abs((*pSrc)-(*pSrc1)) + abs((*pSrc)-(*pSrc2));
// 判断是否小于阈值
if ((bTemp+120) < 255)
{
// 判断是否大于阈值,对于小于情况,灰度值不变。
if (bTemp >= Thre)
{
*pSrc = bTemp + 120;
}
}
else
{
*pSrc = 255;
}
//生成新的DIB像素值
*pDst = *pSrc;
}
}
}
/**********************************************************************
*
* 函数名称:
* LapTemplate(int TempH, int TempW, int TempCX, int TempCY, float *fpTempArray, float fCoef)
*
* 参数:
* int TempH 模板的高度
* int TempW 模板的宽度
* int TempCX 模板的中心元素X坐标 ( < iTempW - 1)
* int TempCY 模板的中心元素Y坐标 ( < iTempH - 1)
* float *fpTempArray 指向模板数组的指针
* float f 模板系数
*
* 返回值:
* void
*
* 说明:
* 该函数用指定的模板(任意大小)来对图像进行操作,参数TempH指定模板
* 的高度,参数TempW指定模板的宽度,参数TempCX和iTempCY指定模板的中心
* 元素坐标,参数fpTempArray指定模板元素,f指定系数
* 拉普拉斯锐化
**********************************************************************/
void CImgEnhance::LapTemplate(int TempH, int TempW, int TempCX, int TempCY, float *fpTempArray, float f)
{
unsigned char* pSrc;
unsigned char* pDst;
int i,j,k,l;
float value;
if(m_pImgDataOut != NULL)
{
delete []m_pImgDataOut;
m_pImgDataOut = NULL;
}
int lineByte = (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4;
if(m_nBitCount != 8)
{
AfxMessageBox("只能处理8位灰度图像!");
return ;
}
//创建要复制的图像区域
m_nBitCountOut = m_nBitCount;
int lineByteOut = (m_imgWidth * m_nBitCountOut / 8 + 3) / 4 * 4;
if (!m_pImgDataOut)
{
m_pImgDataOut = new unsigned char[lineByteOut * m_imgHeight];
}
int pixelByte = m_nBitCountOut / 8;
for(i = 0; i < m_imgHeight; i++){
for(j = 0; j < m_imgWidth * pixelByte; j++)
*(m_pImgDataOut + i * lineByteOut + j) = *(m_pImgData + i * lineByteOut + j);
}
//行处理
for (i = TempCY; i < m_imgHeight - TempH + TempCY + 1; i++)
{
//列处理
for (j = TempCX; j <m_imgWidth - TempW + TempCX + 1; j++)
{
//指向新DIB第i行第j列的像素的指针
pDst = m_pImgDataOut + lineByte * (m_imgHeight -1 - i) + j;
value=0;
//计算
for (k = 0; k < TempH; k++)
{
for (l = 0; l < TempW; l++)
{
pSrc = m_pImgData + lineByte * (m_imgHeight - 1 - i + TempCY - k)
+ j - TempCX + l;
//计算加权平均
value += (*pSrc) * fpTempArray[k * TempW + l];
}
}
//乘以系数
value *= f;
//取结果的绝对值
value = (float)fabs(value);
if (value > 255)
{
*pDst = 255;
}
else
{
*pDst = (unsigned char)(value+0.5);
}
}
}
}
void CImgEnhance::ChooseMask()
{
if(m_nBitCount!=8)
{
AfxMessageBox("只能处理8位灰度图像!");
return ;
}
int n,ji[9],nmin;
float mean[9],bunsan[9],bmin;
if(m_pImgDataOut!=NULL)
{
delete []m_pImgDataOut;
m_pImgDataOut=NULL;
}
//创建要复制的图像区域
m_nBitCountOut=m_nBitCount;
int lineByteOut=(m_imgWidth*m_nBitCountOut/8+3)/4*4;
if (!m_pImgDataOut)
{
m_pImgDataOut=new unsigned char[lineByteOut*m_imgHeight];
}
memset(m_pImgDataOut,255,lineByteOut * m_imgHeight);
for(int j=2;j<=m_imgHeight-3;j++)
for(int i=2;i<=m_imgWidth-3;i++)
{
//求9种近邻区域的均值及其方差
//第1近邻区域
ji[0]=m_pImgData[(j-1)*lineByteOut+(i-1)];
ji[1]=m_pImgData[(j-1)*lineByteOut+i];
ji[2]=m_pImgData[(j-1)*lineByteOut+(i+1)];
ji[3]=m_pImgData[j*lineByteOut+(i-1)];
ji[4]=m_pImgData[j*lineByteOut+i];
ji[5]=m_pImgData[j*lineByteOut+(i+1)];
ji[6]=m_pImgData[(j+1)*lineByteOut+(i-1)];
ji[7]=m_pImgData[(j+1)*lineByteOut+i];
ji[8]=m_pImgData[(j+1)*lineByteOut+(i+1)];
mean[0]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6]+ji[7]+ji[8])/9;
bunsan[0]=0;
for(n=0;n<=8;n++)
bunsan[0]+=ji[n]*ji[n]-mean[0]*mean[0];
//第2近邻区域
ji[0]=m_pImgData[(j-2)*lineByteOut+(i-1)];
ji[1]=m_pImgData[(j-2)*lineByteOut+i];
ji[2]=m_pImgData[(j-2)*lineByteOut+(i+1)];
ji[3]=m_pImgData[(j-1)*lineByteOut+(i-1)];
ji[4]=m_pImgData[(j-1)*lineByteOut+i];
ji[5]=m_pImgData[(j-1)*lineByteOut+(i+1)];
ji[6]=m_pImgData[j*lineByteOut+i];
mean[1]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[1]=0;
for(n=0;n<=6;n++)
bunsan[1]+=ji[n]*ji[n]-mean[1]*mean[1];
//第3近邻区域
ji[0]=m_pImgData[(j-1)*lineByteOut+(i-2)];
ji[1]=m_pImgData[(j-1)*lineByteOut+(i-1)];
ji[2]=m_pImgData[j*lineByteOut+(i-2)];
ji[3]=m_pImgData[j*lineByteOut+(i-1)];
ji[4]=m_pImgData[j*lineByteOut+i];
ji[5]=m_pImgData[(j+1)*lineByteOut+(i-2)];
ji[6]=m_pImgData[(j+1)*lineByteOut+(i-1)];
mean[2]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[2]=0;
for(n=0;n<=6;n++)
bunsan[2]+=ji[n]*ji[n]-mean[2]*mean[2];
//第4近邻区域
ji[0]=m_pImgData[j*lineByteOut+i];
ji[1]=m_pImgData[(j+1)*lineByteOut+(i-1)];
ji[2]=m_pImgData[(j+1)*lineByteOut+i];
ji[3]=m_pImgData[(j+1)*lineByteOut+(i+1)];
ji[4]=m_pImgData[(j+2)*lineByteOut+(i-1)];
ji[5]=m_pImgData[(j+2)*lineByteOut+i];
ji[6]=m_pImgData[(j+2)*lineByteOut+(i+1)];
mean[3]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[3]=0;
for(n=0;n<=6;n++)
bunsan[3]+=ji[n]*ji[n]-mean[3]*mean[3];
//第5近邻区域
ji[0]=m_pImgData[(j-1)*lineByteOut+(i+1)];
ji[1]=m_pImgData[(j-1)*lineByteOut+(i+2)];
ji[2]=m_pImgData[j*lineByteOut+i];
ji[3]=m_pImgData[j*lineByteOut+(i+1)];
ji[4]=m_pImgData[j*lineByteOut+(i+2)];
ji[5]=m_pImgData[(j+1)*lineByteOut+(i+1)];
ji[6]=m_pImgData[(j+1)*lineByteOut+(i+2)];
mean[4]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[4]=0;
for(n=0;n<=6;n++)
bunsan[4]+=ji[n]*ji[n]-mean[4]*mean[4];
//第6近邻区域
ji[0]=m_pImgData[(j-2)*lineByteOut+(i+1)];
ji[1]=m_pImgData[(j-2)*lineByteOut+(i+2)];
ji[2]=m_pImgData[(j-1)*lineByteOut+i];
ji[3]=m_pImgData[(j-1)*lineByteOut+(i+1)];
ji[4]=m_pImgData[(j-1)*lineByteOut+(i+2)];
ji[5]=m_pImgData[j*lineByteOut+i];
ji[6]=m_pImgData[j*lineByteOut+(i+1)];
mean[5]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[5]=0;
for(n=0;n<=6;n++)
bunsan[5]+=ji[n]*ji[n]-mean[5]*mean[5];
//第7近邻区域
ji[0]=m_pImgData[(j-2)*lineByteOut+(i-2)];
ji[1]=m_pImgData[(j-2)*lineByteOut+(i-1)];
ji[2]=m_pImgData[(j-1)*lineByteOut+(i-2)];
ji[3]=m_pImgData[(j-1)*lineByteOut+(i-1)];
ji[4]=m_pImgData[(j-1)*lineByteOut+i];
ji[5]=m_pImgData[j*lineByteOut+(i-1)];
ji[6]=m_pImgData[j*lineByteOut+i];
mean[6]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[6]=0;
for(n=0;n<=6;n++)
bunsan[6]+=ji[n]*ji[n]-mean[6]*mean[6];
//第8近邻区域
ji[0]=m_pImgData[j*lineByteOut+(i-1)];
ji[1]=m_pImgData[j*lineByteOut+i];
ji[2]=m_pImgData[(j+1)*lineByteOut+(i-2)];
ji[3]=m_pImgData[(j+1)*lineByteOut+(i-1)];
ji[4]=m_pImgData[(j+1)*lineByteOut+i];
ji[5]=m_pImgData[(j+2)*lineByteOut+(i-2)];
ji[6]=m_pImgData[(j+2)*lineByteOut+(i-1)];
mean[7]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[7]=0;
for(n=0;n<=6;n++)
bunsan[7]+=ji[n]*ji[n]-mean[7]*mean[7];
//第9近邻区域
ji[0]=m_pImgData[j*lineByteOut+i];
ji[1]=m_pImgData[j*lineByteOut+(i+1)];
ji[2]=m_pImgData[(j+1)*lineByteOut+i];
ji[3]=m_pImgData[(j+1)*lineByteOut+(i+1)];
ji[4]=m_pImgData[(j+1)*lineByteOut+(i+2)];
ji[5]=m_pImgData[(j+2)*lineByteOut+(i+1)];
ji[6]=m_pImgData[(j+2)*lineByteOut+(i+2)];
mean[8]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[8]=0;
for(n=0;n<=6;n++)
bunsan[8]+=ji[n]*ji[n]-mean[8]*mean[8];
//求方差最小的近邻区域nmin
bmin=bunsan[0];
nmin=0;
for(n=0;n<=8;n++)
{
if(bmin>bunsan[n])
{
bmin=bunsan[n];
nmin=n;
}
//把nmin的值四舍五入后作为显示图像的值
m_pImgDataOut[j*lineByteOut+i]=(int)(mean[nmin]+0.5);
}
}
}
CString CImgEnhance::SNR(unsigned char* m_pSrcImgData)
{
int byteCount; // DIB位图的字节数
int i;
// LPBITMAPINFOHEADER lpbmi;
// lpbmi=(LPBITMAPINFOHEADER)lpSrcDIB;
// m_pSrcImgData=(LPBYTE)lpbmi+lpbmi->biSize+sizeof(RGBQUAD)*lpbmi->biClrUsed;
//计算图像信噪比
double temp1=0.0;
double temp2=0.0;
//处理8位灰度图像
if (m_nBitCount==8)
{
//计算整幅DIB位图的字节数
byteCount =m_imgHeight*m_imgWidth*m_nBitCount/8;
for( i=0; i<byteCount; i++)
{
temp1=temp1+(double)m_pImgData[i]*m_pImgData[i];
temp2=temp2+(double)(m_pImgData[i]-m_pSrcImgData[i])*(m_pImgData[i]-m_pSrcImgData[i]);
}
}
else
{
AfxMessageBox("只能处理8位灰度图像!");
return "ERROR";
}
double SNR=temp1/temp2;
SNR=10*log10(SNR);
CString StrSNR;
StrSNR.Format("%f",SNR);
return StrSNR;
}
CString CImgEnhance::PSNR(unsigned char* m_pSrcImgData)
{
int byteCount; // DIB位图的字节数
int i;
//计算图像峰值信噪比
double temp1=0.0;
double temp2=0.0;
//处理8位灰度图像
if (m_nBitCount==8)
{
//计算整幅DIB位图的字节数
byteCount =m_imgHeight*m_imgWidth*m_nBitCount/8;
for( i=0; i<byteCount; i++)
{
temp1=temp1+(double)m_pImgData[i]*m_pImgData[i];
temp2=temp2+(double)(m_pImgData[i]-m_pSrcImgData[i])*(m_pImgData[i]-m_pSrcImgData[i]);
}
}
else
{
AfxMessageBox("只能处理8位灰度图像!");
return "ERROR";
}
double PSNR=m_imgHeight*m_imgWidth/temp2;
PSNR=10*log10(255*255*PSNR); //PSNR即为峰值信噪比
CString StrPSNR;
StrPSNR.Format("%f",PSNR);
return StrPSNR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -