📄 图像增强技术doc.cpp
字号:
// 图像增强技术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 + -