数字图像处理实验三
均值滤波、中值滤波的计算机实现
12281166 崔雪莹计科 1202 班
一、实验目的:
1)熟悉均值滤波、中值滤波处理的理论基础;
2)掌握均值滤波、中值滤波的计算机实现方法;
3)学习 减函数的定义VC++ 6。0 的编程方法;
4)验证均值滤波、中值滤波处理理论;
5)观察均值滤波、中值滤波处理的结果。
二、实验的软、硬件平台:
硬件:微型图像处理系统,包括:主机, PC机;摄像机;
软件:操作系统:WINDOWS2000或 WINDOWSXP应用软件:VC++ 6.0
三、实验内容:
1)握高级语言编程技术;
2) 编制均值滤波、中值滤波处理程序的方法;
3) 编译并生成可执行文件;
4) 考察处理结果。
四、实验要求:
1) 学习VC+确6。0编程的步骤及流程;
2) 编写均值滤波、中值滤波的程序;
3) 编译并改错;
4) 把该程序嵌入试验二给出的界面中(作适当修改);
5) 提交程序及文档;
6) 写出本次实验的体会。
五、实验结果截图
实验均值滤波采用的是3X3的方块,取周围的像素点取得其均 值代替原像素点。边缘像素的处理方法是复制边缘的像素点,增 加一个边框,计算里面的像素值得均值滤波。
1W赵
六、 实验体会
本次实验在前一次的实验基础上增加均值滤波和中值滤波, 对于
椒盐噪声的处理,发现中值滤波的效果更为好一点, 而均值滤波是的
整个图像变得模糊了一点,效果差异较大。本次实验更加增加了对数 字图像处理的了解与学习。
七、 实验程序代码注释及分析
// HistDemoADIg.h :头文件
//
#in elude "ImageWnd.h"
#pragma once
// CHistDemoADIg 对话框
classCHistDemoADIg : public CDialogEx
{
//构造
public: | CHistDemoADlg(CWnd* pParent = NULL); // 标准构造函数 intnWidth; intnHeight; intnLen; intnByteWidth; BYTE *lpBackup; BYTE *lpBitmap; BYTE *lpBits; CStringFileName; CImageWndsource,dest; |
| |
// 对话框数据 enum { IDD = IDD_HISTDEMOA_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
voidLoadBitmap(void);
afx_msg void OnOpen();
afx_msg void OnHist();
voidHistogramEq(void);
voidNoColor(void);
void HistogramEq1(intnWidth,intnHeight,BYTE *lpInput,BYTE *lpOutput); voidMeanFilter(intnWidth,intnHeight,BYTE *lpInput,BYTE *lpOutput); voidMedianFilter(intnWidth,intnHeight,BYTE *lpInput,BYTE *lpOutput); afx_msg void OnBnClickedClo();
afx_msg void OnBnClickedMeanfilter();
afx_msg void OnBnClickedMedianfilter();
};
HistDemoADlg.cpp 对 HistDemoADlg.h 进行具体的实现, OnOpen() 函数响应 ID 为
IDC_OPEN的按钮事件,而且会调取文件选择对话框,选取文件之后,会显 示在原始图像区域显示对应的位图图像, 珍珠魟OnHist()函数会响应ID为IDC_HIST
的按钮事件,调用 HistogramEq()进行直方图均衡化的处理, HistogramEq()会
调用HistogramEq1()进行直方图均衡化的处理,并用 dst.tlmage()显示处理
之后的图像,以及 NoColor()函数,对原始图像转化为灰度图像之后再显示。
// HistDemoADlg.cpp : 实现文件
//
#include "stdafx.h"
#include "HistDemoA.h"
#include "HistDemoADlg.h"
成绩查
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define Point(x,y) lpPoints[(x)+(y)*nWidth]
#define Point1(x,y) lpPoints1[(x)+(y)*nWidth]
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
classCAboutDlg : public CDialogEx
{如何关闭开发者模式
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
voidCAboutDlg::DoDataExchange(CDataExchange* pDX) {
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CHistDemoADlg 对话框
CHistDemoADlg::CHistDemoADlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CHistDemoADlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
lpBitmap = 0; lpBackup = 0;
}
voidCHistDemoADlg::DoDataExchange(CDataExchange* pDX)
{ CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CHistDemoADlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_OPEN, &CHistDemoADlg::OnOpen) ON_BN_CLICKED(IDC_HIST, &CHistDemoADlg::OnHist) ON_BN_CLICKED(IDCLOSE, &CHistDemoADlg::OnBnClickedClo) ON_BN_CLICKED(IDC_MEANFILTER, &CHistDemoADlg::OnBnClickedMeanfilter) ON_BN_CLICKED(IDC_MEDIANFILTER, &CHistDemoADlg::OnBnClickedMedianfilter)
END_MESSAGE_MAP() // CHistDemoADlg 消息处理程序
BOOL CHistDemoADlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于 ...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CStringstrAboutMenu;
回忆童年作文
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{ pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标狼行千里吃肉
// TODO: 在此添加额外的初始化代码 source.Create(0,L"Source",WS_CHILD|WS_VISIBLE,CRect(40,40,360,280),this,10 000);
dest.Create(0,L"Destination",WS_CHILD|WS_VISIBLE,CRect(400,40,720,280),this ,10001);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
voidCHistDemoADlg::OnSysCommand(UINT nID, LPARAM lParam)