⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imgenhance.cpp

📁 将数字图像处理的一般算法都集中在一个MFC的框架中
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************/
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 + -