资源描述
数字图像处理设计
一. 设计题目
基于VC++的数字图像处理
二.设计要求
1.图像平滑处理的编程实现:在空域中,分别用邻域平均法和中值滤波法实现图像的平滑处理。
2.图像锐化处理的编程实现:在空域中,分别用梯度法和Laplace算子法实现图像的锐化处理。
三.设计原理
图像增强不考虑图像质量下降的原因。只将图像中感兴趣的特征有选择的突出。而衰减不需要的特征.它的目的主要是提高图像的可懂度。图像增强的方法分为空域法和频域法两类,空域法主要是对图像中的各个像素点进行操作,而频域法是在图像的某个变换域内,对图像进行操作,修改变换后的系数,例如付立叶变换、DCT 变换等的系数,然后再进行反变换得到处理后的图像。图像复原技术与增强技术不同,它需要了解图像质量下降的原因。
四.源程序清单
#include "stdafx.h"
#include "DIPDemo.h"
#include "DIPDemoDoc.h"
#include "DIPDemoView.h"
#include "mainfrm.h"
#include "DlgSmooth.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDIPDemoView
IMPLEMENT_DYNCREATE(CDIPDemoView, CScrollView)
BEGIN_MESSAGE_MAP(CDIPDemoView, CScrollView)
//{{AFX_MSG_MAP(CDIPDemoView)
ON_COMMAND(ID_ENHA_SMOOTH, OnEnhaSmooth)
ON_COMMAND(ID_ENHA_GRADSHARP, OnEnhaGradsharp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDIPDemoView construction/destruction
CDIPDemoView::CDIPDemoView()
: m_bLBtnDblClkSrv(0)
{
// TODO: add construction code here
}
CDIPDemoView::~CDIPDemoView()
{
}
/////////////////////////////////////////////////////////////////////////////
// CDIPDemoView drawing
void CDIPDemoView::OnDraw(CDC* pDC)
{
// 显示等待光标
BeginWaitCursor();
// 获取文档
CDIPDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_Image.IsValidate())
{
CPalette* pOldPalette;
CPalette* pPalette = pDoc->GetDocPalette();
if(pPalette!=NULL)
{
pOldPalette = pDC->SelectPalette(pPalette, FALSE);
pDC->RealizePalette(); //更新系统调色板
}
pDoc->m_Image.Draw(pDC); //绘制图像
if(pPalette!=NULL)
pDC->SelectPalette(pOldPalette, FALSE);
}
// 恢复正常光标
EndWaitCursor();
}
void CDIPDemoView::OnEnhaSmooth()
{
// 图像平滑
// 获取文档
CDIPDemoDoc* pDoc = GetDocument();
// 输入对象
CImgProcess imgInput = pDoc->m_Image;
// 检查图像是灰度图
if (imgInput.m_pBMIH->biBitCount!=8)
{
AfxMessageBox("不是8-bpp灰度图像,无法处理!");
return;
}
// 输出的临时对象
CImgProcess imgOutput = imgInput;
int nTempH; // 模板高度
int nTempW; // 模板宽度
FLOAT fTempC;// 模板系数
int nTempMX;// 模板中心元素X坐标
int nTempMY;// 模板中心元素Y坐标
// 模板元素数组赋初值(默认为平均模板)
FLOAT aValue[25] = {1.0, 1.0, 1.0, 0.0, 0.0,
1.0, 1.0, 1.0, 0.0, 0.0,
1.0, 1.0, 1.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0,};
// 创建对话框
CDlgSmooth dlgPara;
// 初始化对话框变量值
dlgPara.m_intType = 0;
dlgPara.m_iTempH = 3;
dlgPara.m_iTempW = 3;
dlgPara.m_iTempMX = 1;
dlgPara.m_iTempMY = 1;
dlgPara.m_fTempC = (FLOAT) (1.0 / 9.0);
dlgPara.m_fpArray = aValue;
// 显示对话框,提示用户设定参数
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的参数
nTempH = dlgPara.m_iTempH;
nTempW = dlgPara.m_iTempW;
nTempMX = dlgPara.m_iTempMX;
nTempMY = dlgPara.m_iTempMY;
fTempC = dlgPara.m_fTempC;
// 更改光标形状
BeginWaitCursor();
// 调用Template()函数实现平滑滤波
imgInput.Template(&imgOutput, nTempH, nTempW, nTempMY, nTempMX, aValue, fTempC);
// 将结果返回给文档类
pDoc->m_Image = imgOutput;
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 恢复光标
EndWaitCursor();
}
void CDIPDemoView::OnEnhaGradsharp()
{
// Sobel梯度锐化
// 获取文档
CDIPDemoDoc* pDoc = GetDocument();
// 输入对象
CImgProcess imgInput = pDoc->m_Image;
// 检查图像是灰度图
if (imgInput.m_pBMIH->biBitCount!=8)
{
AfxMessageBox("不是8-bpp灰度图像,无法处理!");
return;
}
// 更改光标形状
BeginWaitCursor();
// 输出的临时对象
CImgProcess imgOutput = imgInput;
// 调用FilterSobel()函数进行Sobel梯度锐化
imgInput.FilterSobel(&imgOutput);
// 将结果返回给文档类
pDoc->m_Image = imgOutput;
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 恢复光标
EndWaitCursor();
}
五. 设计结果
1.程序运行结果
2.图像加载到界面中
3.图像平滑打开界面
4.对图像平滑后的结果
5.对图像进行梯度锐化后的结果
六.收获和体会
这次课程设计让我受益匪浅。首先,我对VC++有了一个系统的认识,不在仅限于理论上的知识,其次,我对软件开发的界面有了很好的认识,再者,通过大量资料的查询,培养了我对数字图像的处理的浓厚兴趣,为我以后的发展方向提供了机会。
七.参考文献
《Visual C++音频/视频技术开发与实战》 张玲玲
《VC++深入详解 》 孙鑫 电子工业出版社
《面向对象程序设计(VC++)》 李志聪 哈尔滨工业大学出版社
《数字图像处理(MATLAB版 》 (美)冈萨雷斯 国外电子与通信教材系列
《数字图像处理 》 孙兴华 机械工业出版社
8
展开阅读全文