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

📄 图像增强技术doc.cpp

📁 哥们图像增强技术的毕业设计
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 图像增强技术Doc.cpp : implementation of the CMyDoc class
//


#include "stdafx.h"
#include "图像增强技术.h"

#include "图像增强技术Doc.h"

//个人加入的头文件
#include "windowsx.h"
#include "math.h"
#include "memory.h"
#include "string.h"
#include "memory.h"
#include "图像增强技术View.h"
#include "LinerParaDlg.h"
#include "StreDlg.h"
#include "ThreDlg.h"
#include "GradSharpDlg.h"
#include "MidFilterDlg.h"
#include "NeiSmoothDlg.h"
#include "AdaptiveSmoothFilterDlg.h"
#include "NormalFrequentDlg.h"
#include "BlurredAddedMeanFilterDlg.h"
#include "RecursiveMidFilterDlg.h"
#include "NoRecursiveTremendousMidFilterDlg.h"
#include "RecursiveTremendousMidFilterDlg.h"
#include "MixedMidFilterDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyDoc

IMPLEMENT_DYNCREATE(CMyDoc, CDocument)

BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
	//{{AFX_MSG_MAP(CMyDoc)
	ON_COMMAND(ID_RESERVE, OnReserve)
	ON_COMMAND(ID_LINERCHANGE, OnLinerchange)
	ON_COMMAND(ID_STRE, OnStre)
	ON_COMMAND(ID_THRE, OnThre)
	ON_COMMAND(ID_GRADSHARP, OnGradsharp)
	ON_COMMAND(ID_LPLSSHARP, OnLplssharp)
	ON_COMMAND(ID_MIDFILTER, OnMidfilter)
	ON_COMMAND(ID_NEISMOOTH, OnNeismooth)
	ON_COMMAND(ID_ADDMIDFILTER, OnAddmidfilter)
	ON_COMMAND(ID_ADAPTIVESF, OnAdaptiveSmoothFilter)
	ON_COMMAND(ID_RANDNOISE, OnRandnoise)
	ON_COMMAND(ID_SALTNOISE, OnSaltnoise)
	ON_COMMAND(ID_COPYNONOISEIMAGE, OnCopynonoiseimage)
	ON_COMMAND(ID_FFT, OnFft)
	ON_COMMAND(ID_IFFT, OnIfft)
	ON_COMMAND(ID_INTEEQUALIZE, OnInteequalize)
	ON_COMMAND(IDRECURSIVEMIDFILTER, OnRecursivemidfilter)
	ON_COMMAND(IDSMALLWAVE, OnSmallwave)
	ON_COMMAND(ID_NORMALLOWFILTER, OnNormallowfilter)
	ON_COMMAND(ID_BATERWOFULOWFILTER, OnBaterwofulowfilter)
	ON_COMMAND(ID_ZHISHULOWFILTER, OnZhishulowfilter)
	ON_COMMAND(ID_TIXINGLOWFILTER, OnTixinglowfilter)
	ON_COMMAND(ID_BATERWOFUHIGHTFILTER, OnBaterwofuhightfilter)
	ON_COMMAND(ID_ZHISHUHIGHTFILTER, OnZhishuhightfilter)
	ON_COMMAND(ID_TIXINGHIGHTFILTER, OnTixinghightfilter)
	ON_COMMAND(ID_COPYSALTNOISEIMAGE, OnCopysaltnoiseimage)
	ON_COMMAND(ID_BLURREDADDEDMEANFILTER, OnBlurredaddedmeanfilter)
	ON_COMMAND(IDMIXEDMIDFILTER, OnMixedmidfilter)
	ON_COMMAND(IDRECURSIVETREMENDOUSMIDFILTER, OnRecursivetremendousmidfilter)
	ON_COMMAND(IDNORECURSIVETREMENDOUSMIDFILTER, OnNorecursivetremendousmidfilter)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDoc construction/destruction

CMyDoc::CMyDoc()
{
	// TODO: add one-time construction code here

}

CMyDoc::~CMyDoc()
{
}

BOOL CMyDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CMyDoc serialization

void CMyDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CMyDoc diagnostics

#ifdef _DEBUG
void CMyDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CMyDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyDoc commands

BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	
	// TODO: Add your specialized creation code here
	//该代码用于实现图像文件的打开
	CFile fp;
	fp.Open(lpszPathName,CFile::modeRead);

	fp.Read((LPSTR)&bmh,sizeof(BITMAPFILEHEADER));
	if(bmh.bfType!=(WORD)('M'<<8|'B'))
	{
		MessageBox(NULL," not image file !","false",MB_OK);
        fp.Close();
		return FALSE;
	}

	DWORD dwBitsSize=bmh.bfSize;
	lpbmi=(BITMAPINFO*)GlobalAllocPtr(GHND,dwBitsSize-sizeof(BITMAPFILEHEADER));

	fp.Read(lpbmi,dwBitsSize-sizeof(BITMAPFILEHEADER));
	if((lpbmi->bmiHeader.biBitCount!=8)||(lpbmi->bmiHeader.biCompression!=BI_RGB))
	{
		MessageBox(NULL,"not 256 or compressed image","error",MB_OK);
		GlobalFreePtr(lpbmi);
		lpbmi=NULL;
		fp.Close();
		return FALSE;
	}
	lpBits=(LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);

	m_size.cx=lpbmi->bmiHeader.biWidth;
	m_size.cy=lpbmi->bmiHeader.biHeight;
	fp.Close();
	
	return TRUE;
}
//1.图像文件打开函数代码完毕

void CMyDoc::OnDraw(CDC *pDC)
{
    //该函数用于辅助图像文件打开函数
    ::StretchDIBits(pDC->GetSafeHdc(),0,0,m_size.cx,m_size.cy,
		0,0,m_size.cx,m_size.cy,
		lpBits,lpbmi,DIB_RGB_COLORS,SRCCOPY);
	{
		CString str;
      
		if(PSNR==1)
		{
		    //显示
			pDC->TextOut(m_size.cx+20,40,Caption);
            str.Format("峰值信噪比为:");
		    pDC->TextOut(m_size.cx+40,100,str);
            str.Format("PSNR=");
		    pDC->TextOut(m_size.cx+150,130,str);
			str.Format("归一化均方误差为:");
		    pDC->TextOut(m_size.cx+40,160,str);
			str.Format("NMSE=");
		    pDC->TextOut(m_size.cx+150,190,str);
			str.Format("信噪比改善因子为:");
		    pDC->TextOut(m_size.cx+40,220,str);
            str.Format("SIF=");
		    pDC->TextOut(m_size.cx+150,250,str);

		    //输出信噪比
		    str.Format("%f",FPSNR);
		    pDC->TextOut(m_size.cx+210,130,str);
			//输出归一化均方误差
			str.Format("%f",FNMSE);
		    pDC->TextOut(m_size.cx+210,190,str);
			//输出信噪比改善因子
			str.Format("%f",FSIF);
		    pDC->TextOut(m_size.cx+210,250,str);
		}
	
	}

}
//2.辅助图像文件打开函数代码完毕

BOOL CMyDoc::OnSaveDocument(LPCTSTR lpszPathName) 
{
	// TODO: Add your specialized code here and/or call the base class
	//该代码用于实现文件的保存
	CFile fp;
	fp.Open(lpszPathName,CFile::modeWrite|CFile::modeCreate);
	fp.Write((LPSTR)&bmh,sizeof(BITMAPFILEHEADER));
	fp.Write(lpbmi,bmh.bfSize-sizeof(BITMAPFILEHEADER));
	fp.Close();
	SetModifiedFlag(FALSE);
	return TRUE;
	
	return CDocument::OnSaveDocument(lpszPathName);
}
//3.文件保存的函数代码完毕

void CMyDoc::OnRandnoise() 
{
	// TODO: Add your command handler code here
	//该函数用于实现对图像加入随机噪声

	//循环变量
	int i,j;
	//图像每行的字节数
	LONG lLineBytes=(8*m_size.cx+31)/32*4;
	//噪声
	BYTE NoisePoint;
	//生成伪随机种子
	srand((unsigned)time(NULL));

	//在图像中加入噪声
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			NoisePoint=rand()/1024;
			
			lpBits[j*lLineBytes+i]=(unsigned char)(lpBits[j*lLineBytes+i]*224/256+NoisePoint);
		}
	}

	UpdateAllViews(NULL);
	SetModifiedFlag();
}
//4.对图像加入随机噪声函数完毕

void CMyDoc::OnSaltnoise() 
{
	// TODO: Add your command handler code here
	//该函数用于对图像加入椒盐噪声

    //循环变量
	int i,j;
	//图像每行的字节数
	LONG lLineBytes=(8*m_size.cx+31)/32*4;
	//生成伪随机种子
	srand((unsigned)time(NULL));

	//在图像中加入噪声
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			if(rand()>31500)
			{
				if(rand()%2==0)
				{
			        lpBits[j*lLineBytes+i]=0;
				}
				else
				{
					lpBits[j*lLineBytes+i]=255;
				}
			}
		}
	}

	UpdateAllViews(NULL);
	SetModifiedFlag();
}
//5.对图像加入椒盐噪声函数代码完毕

void CMyDoc::OnReserve() 
{
	// TODO: Add your command handler code here
	//该函数用于实现图像的反色

	int i,j;

	for(i=0;i<m_size.cx;i++)
	{
	   for(j=0;j<m_size.cy;j++)
	   {
		   lpBits[i*m_size.cy+j]=255-lpBits[i*m_size.cy+j];
	   }
	}
	UpdateAllViews(NULL);
	SetModifiedFlag();
	
}
//6.图像反色函数代码完毕

void CMyDoc::OnLinerchange() 
{
	// TODO: Add your command handler code here
	//该代码实现图像的线性变换

	//中间变量
	float fTemp;

	//线性变换的系数和截距
	float XiShu,JieJu;
	//循环变量
	int i,j;

	CLinerParaDlg dlg;
	//初始化参数值
	dlg.m_Liner_A=1;
	dlg.m_Liner_B=0;

	//图像每行的字节数
	LONG lLineBytes;
	lLineBytes=(8*m_size.cx+31)/32*4;

	//当单击参数对话框的确定按钮时进行线性变换
    if(dlg.DoModal()==IDOK)
	{
		XiShu=dlg.m_Liner_A;
		JieJu=dlg.m_Liner_B;

        for(i=0;i<m_size.cy;i++)
		{
		   for(j=0;j<m_size.cx;j++)
		   {
		      fTemp=lpBits[(m_size.cy-i-1)*lLineBytes+j]*XiShu+JieJu;
			  if(fTemp>255)
			  {
				  lpBits[(m_size.cy-i-1)*lLineBytes+j]=255;
			  }
			  else if(lpBits[i*m_size.cx+j]<0)
			  {
				  lpBits[(m_size.cy-i-1)*lLineBytes+j]=0;
			  }
			  else
			  {
				  lpBits[(m_size.cy-i-1)*lLineBytes+j]=(unsigned char)(fTemp+0.5);
			  }
		   }
		}
	}
	UpdateAllViews(NULL);
	SetModifiedFlag();
}
//7.图像的线性变换函数代码完毕

void CMyDoc::OnStre() 
{
	// TODO: Add your command handler code here
	//该函数用于实现图像的拉伸

	int i,j;
	int X1,X2,Y1,Y2;

	CStreDlg dlg;

    //初始化参数值
	dlg.m_Stre_X1=0;
	dlg.m_Stre_Y1=0;
    dlg.m_Stre_X2=255;
	dlg.m_Stre_Y2=255;

	//当单击参数对话框的确定按钮时进行图像拉伸
    if(dlg.DoModal()==IDOK)
	{
		X1=dlg.m_Stre_X1;
		Y1=dlg.m_Stre_Y1;
		X2=dlg.m_Stre_X2;
		Y2=dlg.m_Stre_Y2;

        for(i=0;i<m_size.cx;i++)
		{
		   for(j=0;j<m_size.cy;j++)
		   {
			   if(lpBits[i*m_size.cy+j]<X1)
			   {
				   lpBits[i*m_size.cy+j]=Y1*lpBits[i*m_size.cy+j]/X1;
			   }
			   else if(lpBits[i*m_size.cy+j]>X2)
			   {
				   lpBits[i*m_size.cy+j]=(255-Y2)*(lpBits[i*m_size.cy+j]-X2)/(255-X2)+Y2;
			   }
			   else
			   {
				   lpBits[i*m_size.cy+j]=(Y2-Y1)*(lpBits[i*m_size.cy+j]-X1)/(X2-X1)+Y1;
			   }
		      
		   }
		}
	}
	UpdateAllViews(NULL);
	SetModifiedFlag();
}
//8.图像拉伸函数的代码完毕

void CMyDoc::OnThre() 
{
	// TODO: Add your command handler code here
	//该函数用于实现图像的阈值变换

	CThreDlg dlg;
	int i,j;

    //初始化参数值
	dlg.m_ThreValue=128;

	//当单击参数对话框的确定按钮时进行线性变换
    if(dlg.DoModal()==IDOK)
	{
      for(i=0;i<m_size.cx;i++)
	  {
		 for(j=0;j<m_size.cy;j++)
		 {
			 if(lpBits[i*m_size.cx+j]<dlg.m_ThreValue)
			 {
		        lpBits[i*m_size.cx+j]=0;
			 }
			 else
			 {
				 lpBits[i*m_size.cx+j]=255;
			 }
		 }
	  }
	}
	UpdateAllViews(NULL);
	SetModifiedFlag();
}
//9.阈值变换函数的代码完毕

void CMyDoc::OnMidfilter() 
{
	// TODO: Add your command handler code here
	//该函数用于对图像进行中值滤波

    //定义中值滤波参数设置对话框
	CMidFilterDlg dlg;
    //循环变量
	LONG i,j,x,y;
    //模板的高度,宽度,系数及中心元素的X坐标,Y坐标
	int iTempH,iTempW,iTempMX,iTempMY;
    //图像每行的字节数
	long lLineBytes=(8*m_size.cx+31)/32*4;
	
    //中间变量
 	BYTE bTemp;

	//复制原始图像
	LPBYTE lpNewDIB;
    HLOCAL hNew;
    hNew=LocalAlloc(LHND,lLineBytes*m_size.cy);
	if(hNew==NULL)
	{
		MessageBox(NULL,"分配内存失败!","flase",MB_OK);
	}
	lpNewDIB=(BYTE*)LocalLock(hNew);
	memcpy(lpNewDIB,lpBits,lLineBytes*m_size.cy);
  
	//模板数组
	unsigned char* bValue;
	
    //初始化对话框
	dlg.m_MidFH=3;
	dlg.m_MidFW=3;
	dlg.m_MidFMX=1;
	dlg.m_MidFMY=1;

	if(dlg.DoModal()==IDOK)
	{
        //接受用户设置
	    iTempH=dlg.m_MidFH;
	    iTempW=dlg.m_MidFW;
	    iTempMX=dlg.m_MidFMX;
	    iTempMY=dlg.m_MidFMY;

		PSNR=0;
        FPSNR=0.0;
	    //中值滤波模板长度
 	    int iFilterLen=iTempH*iTempW;
		bValue=(unsigned char*)malloc(iFilterLen);
	    //开始中值滤波
		//由于模板的原因,除去边缘几行
	    for(j=iTempMY;j<m_size.cy-iTempH+iTempMY+1;j++)
		{
		    //由于模板的原因,除去边缘几列
		    for(i=iTempMX;i<lLineBytes-iTempW+iTempMX+1;i++)
			{
			    //读取滤波器数组
			    for(y=0;y<iTempH;y++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -