数字图像处理实验三中值滤波和均值滤波实验报告

数字图像处理实验三中值滤波和均值滤波实验报告
数字图像处理实验三中值滤波和均值滤波实验报告

数字图像处理实验三

均值滤波、中值滤波的计算机实现

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 OnBnClickedClose();

afx_msg void OnBnClickedMeanfilter();

afx_msg void OnBnClickedMedianfilter();

};

HistDemoADlg.cpp 对HistDemoADlg.h 进行具体的实现,OnOpen() 函数响应ID 为IDC_OPEN的按钮事件,而且会调取文件选择对话框,选取文件之后,会显示在原

始图像区域显示对应的位图图像,OnHist()函数会响应ID为IDC_HIST

的按钮事件,调用HistogramEq()进行直方图均衡化的处理,HistogramEq()会

调用HistogramEq1()进行直方图均衡化的处理,并用dst.setlmage()显示处理

之后的图像,以及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::OnBnClickedClose)

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)

{

if ((nID& 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlgdlgAbout;

dlgAbout.DoModal();

}

else

{

CDialogEx::OnSysCommand(nID, lParam);

}

}

// 如果向对话框添加最小化按钮,则需要下面的代码

// 来绘制该图标。对于使用文档/ 视图模型的MFC 应用程序,// 这将由框架自动完成。

voidCHistDemoADlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND,

reinterpret_cast(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中

intcxIcon = GetSystemMetrics(SM_CXICON);

intcyIcon = GetSystemMetrics(SM_CYICON);

CRectrect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialogEx::OnPaint();

}

}

// 当用户拖动最小化窗口时系统调用此函数取得光标// 显示。

HCURSOR CHistDemoADlg::OnQueryDragIcon()

{

returnstatic_cast(m_hIcon); }

voidCHistDemoADlg::LoadBitmap()

{

// 位图文件:BITMAPFILEHEADER+BITMAPINFOHEAD有效信息部分

BITMAPINFOHEADER *pInfo; //位图文件的头部信息指针pInfo

pInfo=(BITMAPINFOHEADER*)(lpBitmap+sizeof(BITMAPFILEHEADER)); //pInfo 指

向位图文件的头部信息

nWidth=pInfo->biWidth; // 图片宽度

nByteWidth=nWidth*3; // 字节宽度

if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4); // 使字节宽度为4 的整数倍

nHeight=pInfo->biHeight; // 图片高度

if (pInfo->biBitCount!=24) // 位图的位深度不为24 {

if (pInfo->biBitCount!=8) // 位深度不为8

{

AfxMessageBox(L无效位图");

deletelpBitmap; lpBitmap=0;

return;

}

// 位深度为8

unsigned intPaletteSize=1?plnfo->biBitCount; // 左移8 位,PaletteSize调色板尺

if (pInfo->biClrUsed!=0 &&pInfo->biClrUsed

PaletteSize=pInfo->biClrUsed; // biClrUsed 位图实际使用的颜色表中的颜色数

lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);//lp

Bits 指向有效信息部分

RGBQUAD *pPalette=(RGBQUAD *)lpBits; //颜色表部分

/*

typedefstructtagRGBQUAD {

BYTE rgbBlue;

BYTE rgbGreen;

BYTE rgbRed;

BYTE rgbReserved;

} RGBQUAD; */

lpBits+=sizeof(RGBQUAD)*PaletteSize;//lpBits 指向图像有效信息部分

nLen=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nByteWidth*

n

Height;// 整个位图文件的长度

BYTE *lpTemp=lpBitmap;

lpBitmap=new BYTE[nLen];

BITMAPFILEHEADER bmh;

BITMAPINFOHEADER bmi;

bmh.bfType='B'+'M'*256; bmh.bfSize=nLen;

bmh.bfReserved1=0;

bmh.bfReserved2=0; bmh.bfOffBits=54;

bmi.biSize=sizeof(BITMAPINFOHEADER); bmi.biWidth=nWidth;

bmi.biHeight=nHeight;

bmi.biPlanes=1;

bmi.biBitCount=24;

bmi.biCompression=BI_RGB; bmi.biSizeImage=0;

bmi.biXPelsPerMeter=0;

bmi.biYPelsPerMeter=0; bmi.biClrUsed=0;

bmi.biClrImportant=0; intnBWidth=pInfo->biWidth;

if (nBWidth%4) nBWidth+=4-(nBWidth%4); memset(lpBitmap,0,nLen);

memcpy(lpBitmap,&bmh,sizeof(BITMAPFILEHEADER));/位图文件头部

memcpy(lpBitmap+sizeof(BITMAPFILEHEADER),&bmi,sizeof(BITMAPINFOHEAD

ER));//位图信息头部

BYTE

*lpBits2=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);//

位图图像信息部分

int x,y,p1,p2,Palette;

for(y=0;y

{ for(x=0;x

p1=y*nBWidth+x;

p2=y*nByteWidth+x*3;

if (lpBits[p1]

else Palette=0; lpBits2[p2]=pPalette[Palette].rgbBlue;

lpBits2[p2+1]=pPalette[Palette].rgbGreen;

lpBits2[p2+2]=pPalette[Palette].rgbRed;

}

}

deletelpTemp;

} lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); if

(lpBackup) delete lpBackup;

lpBackup=new BYTE[nLen]; memcpy(lpBackup,lpBitmap,nLen);

}

void CHistDemoADlg::OnOpen() // 点击打开文件之后,对应的事件处理函数

{

// TODO: 在此添加控件通知处理程序代码

CFile File;

CFileDialogdlg(TRUE,0,0,OFN_HIDEREADON"Y位图文件|*bmp| 所有文件

|*.*||",this);// 新建文件选择对话框if (dlg.DoModal()==IDOK)

{

FileName=dlg.GetPathName(); // 得到文件的路径

if (!File.Open(FileName,CFile::modeRead)) return; // 以只读方式打开文件//

TODO: add loading code here

if (lpBitmap) delete lpBitmap; // 保证lpBitmap 为空

nLen=(int)File.GetLength(); // 得到文件的长度lpBitmap=new BYTE[nLen]; // 为

lpBitmap 分配空间File.Read(lpBitmap,nLen); // 将文件的内容读入到lpBitmap 所指

向的内存区域

LoadBitmap(); //调用LoadBitmap(),加载位图图像

if (lpBitmap) source.SetImage(nWidth,nHeight,lpBits);

}

}

voidCHistDemoADlg::OnHist()

{

// TODO: 在此添加控件通知处理程序代码

HistogramEq();

}

voidGetPoints(intnWidth,intnHeight,BYTE *lpBits,BYTE *lpPoints)

{

intx,y,p;

intnByteWidth=nWidth*3;

if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4);

for(y=0;y

{

for(x=0;x

{

p=x*3+y*nByteWidth;

lpPoints[x+y*nWidth]=(BYTE)(0.299*(float)lpBits[p+2]+0.587*(float)lpBits[p+1]

+0.114*(float)lpBits[p]+0.1); // 三种颜色的比例计算对应点的颜色值,并且强制转

换成BYTE

}

}

}

void PutPoints(intnWidth,intnHeight,BYTE *lpBits,BYTE *lpPoints) // 逐个对lpBits 进行赋值{

intnByteWidth=nWidth*3;

if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4);

int x,y,p,p1;

for(y=0;y

{

for(x=0;x

{ p=x*3+y*nByteWidth; p1=x+y*nWidth; lpBits[p]=lpPoints[p1];

lpBits[p+1]=lpPoints[p1]; lpBits[p+2]=lpPoints[p1];

}

}

}

voidCHistDemoADlg::HistogramEq(void)

{

if (lpBitmap==0) return;

BYTE *lpOutput=new BYTE[nByteWidth*nHeight];

HistogramEq1(nWidth,nHeight,lpBits,lpOutput);

dest.SetImage(nWidth,nHeight,lpOutput); // 在直方图均衡化的区域显示结果

deletelpOutput;

NoColor(); // 将原始图像转换成灰度图像

}

voidCHistDemoADlg:: NoColor()

{

if (lpBitmap==0) return; intx,y,p;

BYTE Point;

for(y=0;y

{

for(x=0;x

{

p=x*3+y*nByteWidth;

Point=(BYTE)(0.299*(float)lpBits[p+2]+0.587*(float)lpBits[p+1]+0.114*(float)lp

Bits[p]+0.1);// 计算颜色值,在0-255 的灰度级之间

lpBits[p+2]=Point;

lpBits[p+1]=Point;

lpBits[p]=Point;

}

} source.SetImage(nWidth,nHeight,lpBits);// 将彩色图像转化成灰度图像

}

voidCHistDemoADlg::HistogramEq1(intnWidth, intnHeight, BYTE *lpInput, BYTE *lpOutput) {

intx,y;

BYTE *lpPoints=new BYTE[nWidth*nHeight];// 像素点的个数

GetPoints(nWidth,nHeight,lpInput,lpPoints); //lpPoints 存的是颜色值int

r[256],s[256]; // 颜色值数组,统计对应颜色值像素点的个数ZeroMemory(r,1024);

ZeroMemory(s,1024);

for(y=0;y

数,Point(x,y) 是

lpPoints( x,y)

for(x=0;x

}

}

s[0]=r[0];

for(y=1;y<256;y++)

{

s[y]=s[y-1];

s[y]+=r[y];

} // 计算颜色值的前y 种颜色的总像素点的个数(像素点颜色值<=y)

for(y=0;y

lpPoints

for(x=0;x

}

}

PutPoints(nWidth,nHeight,lpOutput,lpPoints); // 输出lpPoints 到lpOutput

deletelpPoints;

voidCHistDemoADlg::OnBnClickedClose()

{

// TODO: 在此添加控件通知处理程序代码

//ExitProcess(0);// 注意使用时先释放分配的内存,以免造成内存泄露//exit(0) ;// 正常终止程序; exit( 非0)非正常终止程序

PostQuitMessage(0);// 最常用

}

voidCHistDemoADlg::OnBnClickedMeanfilter()

{

// TODO: 在此添加控件通知处理程序代码

if (lpBitmap==0) return;

BYTE *lpOutput=new BYTE[nByteWidth*nHeight];

MeanFilter(nWidth,nHeight,lpBits,lpOutput);

dest.SetImage(nWidth,nHeight,lpOutput); // 在直方图均衡化的区域显示结果

deletelpOutput;

NoColor(); // 将原始图像转换成灰度图像

}

voidCHistDemoADlg::MeanFilter (intnWidth,intnHeight,BYTE *lpInput,BYTE *lpOutput) { intx,y;

BYTE *lpPoints=new BYTE[nWidth*nHeight];// 像素点的个数

BYTE *lpPoints1 = new BYTE[(nWidth+2)*(nHeight+2)];

GetPoints(nWidth,nHeight,lpInput,lpPoints); //lpPoints 存的是颜色值

for(y=1;y

//lpPoints1[y][x] = lpPoints[y-1][x-1];

}

} for(y=1;y

Point1(0,y) = Point(0,y-1);

Point1(nWidth+1,y) = Point(nWidth-1,y-1);

//lpPoints1[y][0] = lpPoints[y-1][0];

//lpPoints1[y][nWidth+1] = lpPoints[y-1][nWidth-1];

}

for(x=0;x

Point1(x,0) = Point1(x,1);

Point1(x,nHeight+1) = Point1(x,nHeight);

//lpPoints1[0][x] = lpPoints1[1][x]; //lpPoints1[nHeight+1][x] =

lpPoints1[nHeight][x];

}

for(y=0;y

for (x=0;x

Point(x,y) = ( Point1(x,y) + Point1(x+1,y) + Point1(x+2,y) + Point1(x,y+1) +

Point1(x+1,y+1) + Point1(x+2,y+1) + Point1(x,y+2) +

Point1(x+1,y+2) + Point1(x+2,y+2) )/9;

/*

lpPoints[y][x] = (lpPoints1[y][x] + lpPoints1[y][x+1] + lpPoints1[y][x+2] +

lpPoints1[y+1][x] + lpPoints1[y+1][x+1] + lpPoints1[y+1][x+2] +

lpPoints1[y+2][x] + lpPoints1[y+2][x+1] + lpPoints1[y+2][x+2])/9;

*/

}

}

PutPoints(nWidth,nHeight,lpOutput,lpPoints); // 输出lpPoints 到lpOutput

deletelpPoints;

}

voidCHistDemoADlg::MedianFilter(intnWidth,intnHeight,BYTE *lpInput,BYTE *lpOutput) { intx,y;

BYTE *lpPoints=new BYTE[nWidth*nHeight];// 像素点的个数

BYTE *lpPoints1 = new BYTE[(nWidth+2)*(nHeight+2)];

GetPoints(nWidth,nHeight,lpInput,lpPoints); //lpPoints 存的是颜色值

for(y=1;y

for(x=1;x

Point1(x,y) = Point(x-1,y-1);

}

}

for(y=1;y

1);

Point1(nWidth+1,y) = Point(nWidth-1,y-1);

}

for(x=0;x

Point1(x,0) = Point1(x,1);

Point1(x,nHeight+1) = Point1(x,nHeight); }

BYTE *window = new BYTE[9]; for(y=0;y

int k = 0;

for(inti=y ; i<= y+2 ; i++){ for(int j=x ; j <= x+2; j++){ if(k < 9)

window[k++] = Point1(j,i);

} }

for (int m = 0; m < 5; ++m) // 求9 个数的中值,window[4] 为中值{

int min = m;

for (int n = m + 1; n < 9; ++n)

if (window[n] < window[min])

min = n;

// Put found minimum element in its place BYTE temp = window[m];

window[m] = window[min]; window[min] = temp;

}

Point(x,y) = window[4];

}

}

PutPoints(nWidth,nHeight,lpOutput,lpPoints); // 输出lpPoints 到lpOutput

deletelpPoints;

voidCHistDemoADlg::OnBnClickedMedianfilter()

{

// TODO: 在此添加控件通知处理程序代码if (lpBitmap==0) return;

BYTE *lpOutput=new BYTE[nByteWidth*nHeight];

MedianFilter(nWidth,nHeight,lpBits,lpOutput);

dest.SetImage(nWidth,nHeight,lpOutput); // 在中值滤波的区域显示结果

deletelpOutput;

NoColor(); // 将原始图像转换成灰度图像

}

CImageWnd.h 类继承自CWnd 主要是图像显示方面的函数,如水平滚轮和垂直滚轮的事件函数,以及绘制函数On Pa in t(),初始化函数等等,以及存放需要绘制的图

像信息的成员变量。setlmage(),外接提供绘制的信息,通过参数传递给内部的成

员变量。

#pragma once classClmageWnd:publicCWnd

{ public:

intHCurrentPosition; // 当前位置(水平) intHScrollMax; // 滑动最大位置(水平)

intHScrollPosition; // 滑动位置(水平) intVCurrentPosition; // 当前位置(垂直)

intVScrollMax; // 滑动最大位置(垂直) intVScrollPosition; // 滑动位置(垂直)

intnWidth; // 宽度

intnHeight; // 高度intnByteWidth; // 字节宽度

BYTE *lpBits; // 指向字节的指针

public:

ClmageWnd(void); ~ClmageWnd(void); voidSetlmage(intcx,intcy,const void *bits);

voidSetScroll(intcx,int cy);

protected:

afx_msg BOOL OnEraseBkgnd(CDC *pDC);

afx_msg void OnHScroll(UlNT nSBCode,UlNTnPos,CScrollBar *pScrollBar);

afx_msg void OnVScroll(UlNT nSBCode,UlNTnPos,CScrollBar *pScrollBar);

afx_msg void OnPaint();

afx_msgintOnCreate(LPCREATESTRUCT lpCreateStruct);

DECLARE_MESSAGE_MAP() /* protected:

//{{AFX_MSG(ClmageWnd)

afx_msg BOOL OnEraseBkgnd(CDC* pDC);

afx_msg void OnHScroll(UlNT nSBCode, UlNT nPos, CScrollBar* pScrollBar);

afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

afx_msg void OnPaint();

afx_msgintOnCreate(LPCREATESTRUCT lpCreateStruct); //}}AFX_MSG

DECLARE_MESSAGE_MAP()

*/

};

ImageWnd.cpp 具体实现ImageWnd.h 的一些功能函数,注释已经给出,在此不再赘述

#include "StdAfx.h"

#include "ImageWnd.h"

#define BACKGROUND RGB(128,128,128)

CImageWnd::CImageWnd(void) // 初始化,将其全设为0 {

HScrollPosition = 0;

HCurrentPosition = 0;

HScrollMax = 0;

VScrollPosition = 0;

VCurrentPosition = 0;

VScrollMax = 0; lpBits = 0;

}

CImageWnd::~CImageWnd(void) // 析构函数,释放空间

{

if(lpBits) delete lpBits;

}

BEGIN_MESSAGE_MAP(CImageWnd, CWnd) //{{AFX_MSG_MAP(CImageWnd) ON_WM_ERASEBKGND() ON_WM_HSCROLL() ON_WM_VSCROLL()

ON_WM_PAINT() ON_WM_CREATE()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

BOOL CImageWnd::OnEraseBkgnd(CDC *pDC) // 设置背景色,320,240

{

if(!lpBits) pDC->FillSolidRect(0,0,320,240,BACKGROUND);

return TRUE;

}

void CImageWnd::OnPaint() // 绘制函数,每次需要显示的图像发生变化,就会重画,重复调用这个函数进行重画

{

CPaintDC dc(this); //当前对象作为参数

if(lpBits)

{

intx,y;

x = -HScrollPosition;

y = -VScrollPosition;

if(nWidth<320) x = (320-nWidth)/2;

if(nHeight<240) y = (240-nHeight)/2;

// 设置绘制位图文件的头信息

BITMAPINFOHEADER bmi;

bmi.biSize = sizeof(BITMAPINFOHEADER);

bmi.biWidth = nWidth;

bmi.biHeight = nHeight;

bmi.biPlanes = 1;

bmi.biBitCount = 24;

bmi.biCompression = BI_RGB;

bmi.biSizeImage = 0;

bmi.biXPelsPerMeter = 0;

bmi.biYPelsPerMeter = 0;

bmi.biClrUsed = 0;

bmi.biClrImportant = 0;

// 将像素点填充到绘图区域

StretchDIBits(dc.m_hDC,x,y,nWidth,nHeight,0,0,nWidth,nHeight,lpBits,(BITMA

PINFO *)&bmi,DIB_RGB_COLORS,SRCCOPY);

}

}

void CImageWnd::OnHScroll(UINT nSBCode,UINTnPos,CScrollBar* pScrollBar) /水/ 平滚轮事件处理函数,

switch(nSBCode)

{

case SB_LINEDOWN: //每次滑动的间隔为5 个像素点

HScrollPosition += 5;

break;

case SB_LINEUP:

HScrollPosition -= 5;

break;

case SB_PAGEDOWN: // 滑到最底端

HScrollPosition+=320;

break;

case SB_PAGEUP: // 滑到最顶端

HScrollPosition -= 320;

break;

case SB_THUMBPOSITION:

case SB_THUMBTRACK:

HScrollPosition=nPos;

break;

}

if(HScrollPosition< 0) HScrollPosition = 0; // 滑动位置小于0,设为0

if(HScrollPosition>HScrollMax) HScrollPosition = HScrollMax; // 滑动位置大于最

大值,设为最大值

SetScrollPos(SB_HORZ,HScrollPosition); // 水平方向滑动距离

if(HCurrentPosition != HScrollPosition) //HCurrentPosition 和HScrollPosition 不

相等就滑动

{

ScrollWindow(HCurrentPosition-HScrollPosition,0); // 窗口滑动多少

HCurrentPosition = HScrollPosition; // 将当前滑动位置设为

HScrollPosition

}

CWnd::OnHScroll(nSBCode,nPos,pScrollBar);

}

void CImageWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) //垂直方向的滑动事件处理

{

switch(nSBCode)

{

case SB_LINEDOWN: VScrollPosition+=5; break;

case SB_LINEUP: VScrollPosition-=5;

数字图像处理实验三中值滤波和均值滤波实验报告

数字图像处理实验三中值滤波和均值滤波实验报告

数字图像处理实验三 均值滤波、中值滤波的计算机实现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的方块,取周围的像素点取得其均值代替原像素点。边缘像素的处理方法是复制边缘的像素点,增加一个边框,计算里面的像素值得均值滤波。

六、实验体会 本次实验在前一次的实验基础上增加均值滤波和中值滤波,对于椒盐噪声的处理,发现中值滤波的效果更为好一点,而均值滤波是的整个图像变得模糊了一点,效果差异较大。本次实验更加增加了对数字图像处理的了解与学习。 七、实验程序代码注释及分析 // HistDemoADlg.h : 头文件 // #include "ImageWnd.h" #pragma once // CHistDemoADlg 对话框 class CHistDemoADlg : public CDialogEx { // 构造

有源滤波实验报告

姓名: 学号:2009118125 班级:电工二班 实验十一 有源滤波器 实验目的 1. 掌握有缘滤波器的构成及其特性 2. 学习有缘滤波器的幅频特性的测量方法 实验仪器 数字示波器 信号发生器 交流毫伏表 直流电源 预习要求 1. 复习有缘滤波器的概念、工作原理。 2. 分析计算图5-11-1、图5-11-2电路的截止频率,图5-11-3电路 的中心频率。 3. 画出三个电路的幅频特性曲线 实验原理 有源滤波器又称作有源选频电路,通常用继承运放和电阻,电容网络构成。它的作用是让指定频段信号通过,而将其余频段信号加以抑制或大幅度衰减。分低通、高通、带通、带阻等电路。 1. 低通滤波电路 低通滤波器是指通过低频而抑制高频信号的滤波器,如图5-11-1所示为二阶低通滤波器。 传输函数: 200 11()f A j Q ωωωω-+ 1 (1)f f R A R =+ 1( )3f Q A =- 01 RC ω= 根据上式可知,当Q 取不同值时,可使电路的频率特性具有不同的特点。一般Q 取0.7。 2. 高通滤波器 高通滤波器的功能是使频率高于某一数值(如fo )的信号通过,而低于fo 的信号不能通过。图5-11-2电路为二阶高通滤波器。

其频率特性为:200()11()f A H j j Q ωωωωω = -- 1 1f f R A R =+ 13f Q A = - 01RC ω = 3. 带通滤波器 带通滤波器可由低通滤波器和高通滤波器构成,也可以直接由集成运放外加RC 网络构成,不同的构成方法,其滤波特性也不同。带通滤波器的功能是指定频段内的信号通过而衰减其它频段的信号。 4.带阻滤波器 带阻滤波器又称陷波器,它衰减指定频段的信号,而让其它频段的信号通过。带阻滤波器可由低通电路和高通电路构成,也可由集成运放外加RC 网络构成。常用的带阻滤波器是由双T 网络构成的,如图5-11-3所示。 其幅频特性为:

数字图像处理实验报告

数字图像处理实验报告 实验一数字图像基本操作及灰度调整 一、实验目的 1)掌握读、写图像的基本方法。 2)掌握MATLAB语言中图像数据与信息的读取方法。 3)理解图像灰度变换处理在图像增强的作用。 4)掌握绘制灰度直方图的方法,理解灰度直方图的灰度变换及均衡化的方 法。 二、实验内容与要求 1.熟悉MATLAB语言中对图像数据读取,显示等基本函数 特别需要熟悉下列命令:熟悉imread()函数、imwrite()函数、size()函数、Subplot()函数、Figure()函数。 1)将MATLAB目录下work文件夹中的forest.tif图像文件读出.用到imread, imfinfo 等文件,观察一下图像数据,了解一下数字图像在MATLAB中的处理就是处理一个矩阵。将这个图像显示出来(用imshow)。尝试修改map颜色矩阵的值,再将图像显示出来,观察图像颜色的变化。 2)将MATLAB目录下work文件夹中的b747.jpg图像文件读出,用rgb2gray() 将其 转化为灰度图像,记为变量B。 2.图像灰度变换处理在图像增强的作用 读入不同情况的图像,请自己编程和调用Matlab函数用常用灰度变换函数对输入图像进行灰度变换,比较相应的处理效果。 3.绘制图像灰度直方图的方法,对图像进行均衡化处理 请自己编程和调用Matlab函数完成如下实验。 1)显示B的图像及灰度直方图,可以发现其灰度值集中在一段区域,用 imadjust函 数将它的灰度值调整到[0,1]之间,并观察调整后的图像与原图像的差别,调整后的灰

度直方图与原灰度直方图的区别。 2) 对B 进行直方图均衡化处理,试比较与源图的异同。 3) 对B 进行如图所示的分段线形变换处理,试比较与直方图均衡化处理的异同。 图1.1 分段线性变换函数 三、实验原理与算法分析 1. 灰度变换 灰度变换是图像增强的一种重要手段,它常用于改变图象的灰度范围及分布,是图象数字化及图象显示的重要工具。 1) 图像反转 灰度级范围为[0, L-1]的图像反转可由下式获得 r L s --=1 2) 对数运算:有时原图的动态范围太大,超出某些显示设备的允许动态范围, 如直接使用原图,则一部分细节可能丢失。解决的方法是对原图进行灰度压缩,如对数变换: s = c log(1 + r ),c 为常数,r ≥ 0 3) 幂次变换: 0,0,≥≥=γγc cr s 4) 对比拉伸:在实际应用中,为了突出图像中感兴趣的研究对象,常常要求 局部扩展拉伸某一范围的灰度值,或对不同范围的灰度值进行不同的拉伸处理,即分段线性拉伸: 其对应的数学表达式为:

空间域滤波器(实验报告)

数字图像处理作业 ——空间域滤波器 摘要 在图像处理的过程中,消除图像的噪声干扰是一个非常重要的问题。本文利用matlab软件,采用空域滤波的方式,对图像进行平滑和锐化处理。平滑空间滤波器用于模糊处理和减小噪声,经常在图像的预处理中使用;锐化空间滤波器主要用于突出图像中的细节或者增强被模糊了的细节。本文使用的平滑滤波器有中值滤波器和高斯低通滤波器,其中,中值滤波器对去除椒盐噪声特别有效,高斯低通滤波器对去除高斯噪声效果比较好。使用的锐化滤波器有反锐化掩膜滤波、Sobel边缘检测、Laplacian边缘检测以及Canny算子边缘检测滤波器。不同的滤波方式,在特定的图像处理应用中有着不同的效果和各自的优势。

1、分别用高斯滤波器和中值滤波器去平滑测试图像test1和2,模板大小分别 是3x3 , 5x5 ,7x7;利用固定方差 sigma=1.5产生高斯滤波器. 附件有产生高斯滤波器的方法。 实验原理分析: 空域滤波是直接对图像的数据做空间变换达到滤波的目的。它是一种邻域运算,其机理就是在待处理的图像中逐点地移动模板,滤波器在该点地响应通过事先定义的滤波器系数与滤波模板扫过区域的相应像素值的关系来计算。如果输出像素是输入像素邻域像素的线性组合则称为线性滤波(例如最常见的均值滤波和高斯滤波),否则为非线性滤波(中值滤波、边缘保持滤波等)。 空域滤波器从处理效果上可以平滑空间滤波器和锐化空间滤波器:平滑空间滤波器用于模糊处理和减小噪声,经常在图像的预处理中使用;锐化空间滤波器主要用于突出图像中的细节或者增强被模糊了的细节。 模板在源图像中移动的过程中,当模板的一条边与图像轮廓重合后,模板中心继续向图像边缘靠近,那么模板的某一行或列就会处于图像平面之外,此时最简单的方法就是将模板中心点的移动范围限制在距离图像边缘不小于(n-1)/2个像素处,单处理后的图像比原始图像稍小。如果要处理整幅图像,可以在图像轮廓边缘时用全部包含于图像中的模板部分来滤波所有图像,或者在图像边缘以外再补上一行和一列灰度为零的像素点(或者将边缘复制补在图像之外)。 ①中值滤波器的设计: 中值滤波器是一种非线性统计滤波器,它的响应基于图像滤波器包围的图像区域中像素的排序,然后由统计排序的中间值代替中心像素的值。它比小尺寸的线性平滑滤波器的模糊程度明显要低,对处理脉冲噪声(椒盐噪声)非常有效。中值滤波器的主要功能是使拥有不同灰度的点看起来更接近于它的邻近值,去除那些相对于其邻域像素更亮或更暗,并且其区域小于滤波器区域一半的孤立像素集。 在一维的情况下,中值滤波器是一个含有奇数个像素的窗口。在处理之后,位于窗口正中的像素的灰度值,用窗口内各像素灰度值的中值代替。例如若窗口长度为5,窗口中像素的灰度值为80、90、200、110、120,则中值为110,因为按小到大(或大到小)排序后,第三位的值是110。于是原理的窗口正中的灰度值200就由110取代。如果200是一个噪声的尖峰,则将被滤除。然而,如果它是一个信号,则滤波后就被消除,降低了分辨率。因此中值滤波在某些情况下抑制噪声,而在另一些情况下却会抑制信号。 将中值滤波推广到二维的情况。二维窗口的形式可以是正方形、近似圆形的或十字形等。本次作业使用正方形模板进行滤波,它的中心一般位于被处理点上。窗口的大小对滤波效果影响较大。 根据上述算法利用MATLAB软件编程,对源图像test1和test2进行滤波处理,结果如下图:

IIR数字滤波器的设计实验报告

IIR数字滤波器的设计 一、实验目的: 掌握冲激相应不变法和双线性变换法设计IIR数字滤波器的原理和方法; 观察冲激相应不变法和双线性变换法设计IIR数字滤波器的频率特性; 了解冲激相应不变法和双线性变换法的特点和区别。 二、实验原理: 无限长单位冲激响应(IIR)数字滤波器的设计思想: a)设计一个合适的模拟滤波器 b)利用一定的变换方法将模拟滤波器转换成满足预定指 标的数字滤波器 切贝雪夫I型:通带中是等波纹的,阻带是单调的

切贝雪夫II型:通带中是单调的,阻带是等波纹的 1.用冲击响应不变法设计一个低通切贝雪夫I型数字滤波器通带上限截止频率为400Hz 阻带截止频率为600Hz 通带最大衰减为0.3分贝 阻带最小衰减为60分贝 抽样频率1000Hz 2.用双线性变换法设计切贝雪夫II型高通滤波器 通带截止频率2000Hz 阻带截止频率1500Hz 通带最大衰减0.3分贝 阻带最小衰减50分贝 抽样频率20000Hz 四、实验程序:

1) Wp=2*pi*400; Ws=2*pi*600; Rp=0.3; Rs=60; Fs=1000; [N,Wn]=cheb1ord(Wp,Ws,Rp,Rs,'s'); [Z,P,K]=cheb1ap(N,Rp); [A,B,C,D]=zp2ss(Z,P,K); [At,Bt,Ct,Dt]=lp2lp(A,B,C,D,Wn); [num1,den1]=ss2tf(At,Bt,Ct,Dt); [num2,den2]=impinvar(num1,den1,Fs); [H,W1]=freqs(num1,den1); figure(1) subplot(2,1,1); semilogx(W1/pi/2,20*log10(abs(H)));grid; xlabel(' 频率/ Hz'); ylabel(' 模拟滤波器幅值(db)'); [H,W2]=freqz(num2,den2,512,'whole',Fs); subplot(2,1,2); plot(W2,20*log10(abs(H)));grid; xlabel(' 频率/ Hz');

东南大学数字图像处理实验报告

数字图像处理 实验报告 学号:04211734 姓名:付永钦 日期:2014/6/7 1.图像直方图统计 ①原理:灰度直方图是将数字图像的所有像素,按照灰度值的大小,统计其所出现的频度。 通常,灰度直方图的横坐标表示灰度值,纵坐标为半个像素个数,也可以采用某一灰度值的像素数占全图像素数的百分比作为纵坐标。 ②算法: clear all PS=imread('girl-grey1.jpg'); %读入JPG彩色图像文件figure(1);subplot(1,2,1);imshow(PS);title('原图像灰度图'); [m,n]=size(PS); %测量图像尺寸参数 GP=zeros(1,256); %预创建存放灰度出现概率的向量 for k=0:255 GP(k+1)=length(find(PS==k))/(m*n); %计算每级灰度出现的概率end figure(1);subplot(1,2,2);bar(0:255,GP,'g') %绘制直方图 axis([0 255 min(GP) max(GP)]); title('原图像直方图') xlabel('灰度值') ylabel('出现概率') ③处理结果:

原图像灰度图 100 200 0.005 0.010.0150.020.025 0.030.035 0.04原图像直方图 灰度值 出现概率 ④结果分析:由图可以看出,原图像的灰度直方图比较集中。 2. 图像的线性变换 ①原理:直方图均衡方法的基本原理是:对在图像中像素个数多的灰度值(即对画面起主 要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并。从而达到清晰图像的目的。 ②算法: clear all %一,图像的预处理,读入彩色图像将其灰度化 PS=imread('girl-grey1.jpg'); figure(1);subplot(2,2,1);imshow(PS);title('原图像灰度图'); %二,绘制直方图 [m,n]=size(PS); %测量图像尺寸参数 GP=zeros(1,256); %预创建存放灰度出现概率的向量 for k=0:255

数字图像处理实验报告[邻域平均法和中值滤波法]

数字图像处理实验报告 班级: 姓名: 学号: 日期: 邻域平均法和中值滤波处理

一、实验目的 图像变换是数字图像处理中的一种综合变换,如直方图变换、几何变换等。通过本实验,使得学生掌握两种变换的程序实现方法。 二、实验任务 请设计程序,分别用邻域平均法,其模板为:和中值滤波法对testnoise图像进行去噪处理(中值滤波的模板的大小也设为3×3)。 三、实验环境 本实验在Windows平台上进行,对内存及cpu主频无特别要求,使用VC或者MINGW(gcc)编译器均可。 四、设计思路 介绍代码的框架结构、所用的数据结构、各个类的介绍(类的功能、类中方法的功能、类的成员变量的作用)、各方法间的关系写。在此不进行赘述。 五、具体实现 实现设计思路中定义的所有的数据类型,对每个操作给出实际算法。对主程序和其他模块也都需要写出实际算法。 代码: <邻域平均法>(3*3) #include

#include #include #include "hdr.h" /*------定义结构指针------*/ struct bmphdr *hdr; //定义用于直方图变量 unsigned char *bitmap,*count,*new_color; /*------main() 函数编------*/ int main() { //定义整数i,j 用于函数循环时的,nr_pixels为图像中像素的个数 int i, j ,nr_pixels,nr_w,nr_h; //定义两个文件指针分别用于提取原图的数据和生成直方图均衡化后的图像 FILE *fp, *fpnew; //定义主函数的参数包括:输入的位图文件名和输出的位图文件名,此处内容可以不要,在DOS下执行命令的时候再临时输入也可,为了方便演示,我这里直接把函数的参数确定了。// argc=3; // argv[1]="test.bmp"; // argv[2]="testzf.bmp"; //参数输入出错显示 /* if (argc != 3) { printf("please input the name of input and out bitm ap files\n");

FIR数字滤波器设计与使用

实验报告 课程名称:数字信号处理指导老师:刘英成绩:_________________实验名称: FIR数字滤波器设计与使用同组学生姓名:__________ 一、实验目的和要求 设计和应用FIR低通滤波器。掌握FIR数字滤波器的窗函数设计法,了解设计参数(窗型、窗长)的影响。 二、实验内容和步骤 编写MATLAB程序,完成以下工作。 2-1 设计两个FIR低通滤波器,截止频率 C =0.5。 (1)用矩形窗,窗长N=41。得出第一个滤波器的单位抽样响应序列h 1(n)。记下h 1 (n) 的各个抽样值,显示h 1 (n)的图形(用stem(.))。求出该滤波器的频率响应(的N 个抽样)H 1(k),显示|H 1 (k)|的图形(用plot(.))。 (2)用汉明窗,窗长N=41。得出第二个滤波器的单位抽样响应序列h 2(n)。记下h 2 (n) 的各个抽样值,显示h 2(n)的图形。求出滤波器的频率响应H 2 (k),显示|H 2 (k)|的 图形。 (3)由图形,比较h 1(n)与h 2 (n)的差异,|H 1 (k)|与|H 2 (k)|的差异。 2-2 产生长度为200点、均值为零的随机信号序列x(n)(用rand(1,200)0.5)。显示x(n)。 求出并显示其幅度谱|X(k)|,观察特征。 2-3 滤波 (1)将x(n)作为输入,经过第一个滤波器后的输出序列记为y 1(n),其幅度谱记为|Y 1 (k)|。 显示|X(k)|与|Y 1 (k)|,讨论滤波前后信号的频谱特征。 (2)将x(n)作为输入,经过第二个滤波器后的输出序列记为y 2(n),其幅度谱记为|Y 2 (k)|。 比较|Y 1(k)|与|Y 2 (k)|的图形,讨论不同的窗函数设计出的滤波器的滤波效果。 2-4 设计第三个FIR低通滤波器,截止频率 C =0.5。用矩形窗,窗长N=127。用它对x(n)进行滤波。显示输出信号y

电路实验报告12 有源滤波器设计

课程名称:电路与电子技术实验II 指导老师:沈连丰成绩:__________________ 实验名称:有源滤波器设计实验类型:________________同组学生姓名:__________ 一、实验目的和要求(必填)二、实验内容和原理(必填) 三、主要仪器设备(必填)四、操作方法和实验步骤 五、实验数据记录和处理六、实验结果与分析(必填) 七、讨论、心得 一、实验目的和要求 1、掌握有源滤波器的分析和设计方法。 2、学习有源滤波器的调试、幅频特性的测量方法。 3、了解滤波器的结构和参数对滤波器性能的影响。 4、用EDA仿真的方法来研究滤波电路,了解元件参数对滤波效果的影响。 二、实验内容和原理 1、滤波器的5个主要指标: (1) 传递函数A v(s) :反映滤波器增益随频率的变化关系,也称为电路的频率响应、频率特性。 (2) 通带增益A v p:为一个实数。(针对LPF)、(针对HPF)、(针对BPF)、(针对BEF)。 (3) 固有频率f0:也称自然频率、特征频率,其值由电路元件的参数决定。 (4) 通带截止频率f p:滤波器增益下降到其通带增益A v p 的0.707倍时所对应的频率(也称–3dB 频率、半功率点、上限频率(ωH 、f H )或下限频率(ωL 、f L )。 (5) 品质因数Q:反映滤波器频率特性的一项重要指标,不同类型滤波器的定义不同。例如,在低通和高通滤波器中,定义为当时增益的模与通带增益之比。 2、有源滤波器的设计流程: 设计一个有源低通滤波器时,一般可以先按照预定的性能指标,选择一定的电路形式,然后写出电路的电压传递函数,计算并选定电路中的各个元器件参数。最后再通过实验进行调试,确定实际的器件参数。 三、实验器材 运放LM358、 四、操作方法和实验步骤 1、实验内容 (1) 在实验板上安装所设计的电路。 (2) 有源滤波器的静态调零。 (3) 测量滤波器的通带增益A v p、通带截止频率f p。 (4) 测量滤波器的频率特性(有条件时可使用扫频仪)。 (5) 改变电路参数,研究品质因数Q 对滤波器频率特性的影响。 2、设计一个二阶有源低通滤波器。具体要求如下: (1) 通带截止频率:f p=1kHz;

数字图像处理实验三中值滤波和均值滤波实验报告材料

数字图像处理实验三 均值滤波、中值滤波的计算机实现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的方块,取周围的像素点取得其均值代替原像素点。边缘像素的处理方法是复制边缘的像素点,增加一个边框,计算里面的像素值得均值滤波。

六、实验体会 本次实验在前一次的实验基础上增加均值滤波和中值滤波,对于椒盐噪声的处理,发现中值滤波的效果更为好一点,而均值滤波是的整个图像变得模糊了一点,效果差异较大。本次实验更加增加了对数字图像处理的了解与学习。 七、实验程序代码注释及分析 // HistDemoADlg.h : 头文件 // #include "ImageWnd.h" #pragma once // CHistDemoADlg 对话框 class CHistDemoADlg : public CDialogEx { // 构造

实验四数字滤波器的设计实验报告

数字信号处理 实验报告 实验四 IIR数字滤波器的设计学生姓名张志翔 班级电子信息工程1203班 学号 指导教师 实验四 IIR数字滤波器的设计 一、实验目的: 1. 掌握双线性变换法及脉冲响应不变法设计IIR数字滤波器的具体设 计方法及其原理,熟悉用双线性变换法及脉冲响应不变法设计低通、高通和带通IIR数字滤波器的MATLAB编程。 2. 观察双线性变换及脉冲响应不变法设计的滤波器的频域特性,了解双线性变换法及脉冲响应不变法的特点。 3.熟悉Butterworth滤波器、切比雪夫滤波器和椭圆滤波器的频率特性。 二、实验原理: 1.脉冲响应不变法 用数字滤波器的单位脉冲响应序列模仿模拟滤波器的冲激响应 ,让正好等于的采样值,即,其中为采样间隔,如果以及分别表示的拉式变换及的Z变换,则 2.双线性变换法 S平面与z平面之间满足以下映射关系:

s平面的虚轴单值地映射于z平面的单位圆上,s平面的左半平面完全映射到z平面的单位圆内。 双线性变换不存在混叠问题。 双线性变换是一种非线性变换,这种非线性引起的幅频特性畸变可通过预畸而得到校正。 三、实验内容及步骤: 实验中有关变量的定义: fc 通带边界频率; fr阻带边界频率;δ通带波动;At 最小阻带衰减; fs采样频率; T采样周期 (1) =0.3KHz, δ=0.8Db, =0.2KHz, At =20Db,T=1ms; 设计一个切比雪夫高通滤波器,观察其通带损耗和阻带衰减是否满足要求。 MATLAB源程序: wp=2*1000*tan(2*pi*300/(2*1000)); ws=2*1000*tan(2*pi*200/(2*1000)); [N,wn]=cheb1ord(wp,ws,0.8,20,'s'); %给定通带(wp)和阻带(ws)边界角频率,通带波动波动0.8,阻带最小衰减20dB,求出最低阶数和通带滤波器的通带边界频率Wn [B,A]=cheby1(N,0.5,wn,'high','s');%给定通带(wp)和阻带(ws)边界角频率,通带波动 [num,den]=bilinear(B,A,1000); [h,w]=freqz(num,den); f=w/(2*pi)*1000; plot(f,20*log10(abs(h)));

有源滤波器实验报告

有源滤波器实验报告文件编码(008-TTIG-UTITD-GKBTT-PUUTI-WYTUI-8256)

实验七集成运算放大器的基本应用(Ⅱ)—有源滤波器 一、实验目的 1、熟悉用运放、电阻和电容组成有源低通滤波、高通滤波和带通、带阻滤波器。 2、学会测量有源滤波器的幅频特性。 二、实验原理 (a)低通(b)高通 (c) 带通(d)带阻 图7-1 四种滤波电路的幅频特性示意图 由RC元件与运算放大器组成的滤波器称为RC有源滤波器,其功能是让一定频率范围内的信号通过,抑制或急剧衰减此频率范围以外的信号。可用在信息处理、数据传输、抑制干扰等方面,但因受运算放大器频带限制,这类滤波器主要用于低频范围。根据对频率范围的选择不同,可分为低通(LPF)、高通(HPF)、带通(BPF)与带阻(BEF)等四种滤波器,它们的幅频特性如图7-1所示。 具有理想幅频特性的滤波器是很难实现的,只能用实际的幅频特性去逼近理想的。一般来说,滤波器的幅频特性越好,其相频特性越差,反之亦然。滤波器的阶数越高,幅频特性衰减的速率越快,但RC网络的节数越多,元件参数计算越繁琐,电路调试越困难。任何高阶滤波器均可以用较低的二阶RC有滤波器级联实现。 1、低通滤波器(LPF) 低通滤波器是用来通过低频信号衰减或抑制高频信号。

如图7-2(a )所示,为典型的二阶有源低通滤波器。它由两级RC 滤波环节与同相比例运算电路组成,其中第一级电容C 接至输出端,引入适量的正反馈,以改善幅频特性。图7-2(b )为二阶低通滤波器幅频特性曲线。 (a)电路图 (b)频率特性 图7-2 二阶低通滤波器 电路性能参数 1 f uP R R 1A + = 二阶低通滤波器的通带增益 RC 2π1 f O = 截止频率,它是二阶低通滤波器通带与阻带的界限频率。 uP A 31 Q -= 品质因数,它的大小影响低通滤波器在截止频率处幅频特性的形状。 2、高通滤波器(HPF ) 与低通滤波器相反,高通滤波器用来通过高频信号,衰减或抑制低频信号。 只要将图7-2低通滤波电路中起滤波作用的电阻、电容互换,即可变成二阶有源高通滤波器,如图7-3(a)所示。高通滤波器性能与低通滤波器相反,其频率响应和低通滤波器是“镜象”关系,仿照LPH 分析方法,不难求得HPF 的幅频特性。

数字图像处理实验报告

数字图像处理试验报告 实验二:数字图像的空间滤波和频域滤波 姓名:XX学号:2XXXXXXX 实验日期:2017 年4 月26 日 1.实验目的 1. 掌握图像滤波的基本定义及目的。 2. 理解空间域滤波的基本原理及方法。 3. 掌握进行图像的空域滤波的方法。 4. 掌握傅立叶变换及逆变换的基本原理方法。 5. 理解频域滤波的基本原理及方法。 6. 掌握进行图像的频域滤波的方法。 2.实验内容与要求 1. 平滑空间滤波: 1) 读出一幅图像,给这幅图像分别加入椒盐噪声和高斯噪声后并与前一张图显示在同一 图像窗口中。 2) 对加入噪声图像选用不同的平滑(低通)模板做运算,对比不同模板所形成的效果,要 求在同一窗口中显示。 3) 使用函数 imfilter 时,分别采用不同的填充方法(或边界选项,如零填 充、’replicate’、’symmetric’、’circular’)进行低通滤波,显示处理后的图 像。 4) 运用 for 循环,将加有椒盐噪声的图像进行 10 次,20 次均值滤波,查看其特点, 显 示均值处理后的图像(提示:利用fspecial 函数的’average’类型生成均值滤波器)。 5) 对加入椒盐噪声的图像分别采用均值滤波法,和中值滤波法对有噪声的图像做处理,要 求在同一窗口中显示结果。 6) 自己设计平滑空间滤波器,并将其对噪声图像进行处理,显示处理后的图像。 2. 锐化空间滤波 1) 读出一幅图像,采用3×3 的拉普拉斯算子 w = [ 1, 1, 1; 1 – 8 1; 1, 1, 1] 对其进行滤波。 2) 编写函数w = genlaplacian(n),自动产生任一奇数尺寸n 的拉普拉斯算子,如5 ×5的拉普拉斯算子 w = [ 1 1 1 1 1 1 1 1 1 1 1 1 -24 1 1 1 1 1 1 1 1 1 1 1 1] 3) 分别采用5×5,9×9,15×15和25×25大小的拉普拉斯算子对

有限冲激响应数字滤波器设计实验报告

/ 实验6 有限冲激响应数字滤波器设计 一、实验目的: 1、加深对数字滤波器的常用指标理解。 2、学习数字滤波器的设计方法。 二、实验原理: 低通滤波器的常用指标: } (1)通带边缘频率; (2)阻带边缘频率; (3)通带起伏;

(4)通带峰值起伏, (5)阻带起伏,最小阻带衰减。 三、实验内容: 利用MATLAB编程,用窗函数法设计FIR数字滤波器,指标要求如下: 通带边缘频率:,通带峰值起伏:。] 阻带边缘频率:,最小阻带衰减:。 采用汉宁窗函数法的程序: wp1=*pi;wp2=*pi; ws1=*pi;ws2=*pi; width1=wp1-ws1; width2=ws2-wp2; width=min(width1,width2) N1=ceil(8*pi/width) … b1=fir1(N1,[ ],hanning(N1+1)); [h1,f]=freqz(b1,1,512); plot(f/pi,20*log10(abs(h1)),'-') grid; 图形:

采用切比雪夫窗函数法德程序: 】 wp1=*pi;wp2=*pi; ws1=*pi;ws2=*pi; width1=wp1-ws1; width2=ws2-wp2; width=min(width1,width2) N1=ceil(8*pi/width) b1=fir1(N1,[ ],chebwin(N1+1,20)); [h1,f]=freqz(b1,1,512); … plot(f/pi,20*log10(abs(h1)),'-') grid; 图形:

四.小结 FIR和IIR滤波器各自的特点: ①结构上看,IIR滤波器必须采用递归结构,极点位置必须在单位圆内,否则系统将不稳定,IIR滤波器脱离不了模拟滤波器的格局,FIR滤波器更灵活,尤其能使适应某些特殊的应用。设计选择:在对相位要求不敏感的场合,用IIR较为适合,而对图像处理等对线性要求较高,采用FIR滤波器较好。 ②性能上说,IIR滤波器传输函数的几点可位于单位圆内的任何地方,可以用较低的结束获得较高的选择性,但是是相位的非线性为代价,FIR滤波器却可以得到严格的线性相位,然而FIR滤波器传输函数的极点固定在原点,只能用较高的阶数达到的选择性。

有源模拟滤波器实验报告

实验报告

工程大学教务处制 一、实验目的 1.掌握滤波器的滤波性能特点。 2.掌握常规模拟滤波器的设计、实现、调试、测试方法。 3.掌握滤波器主要参数的调试方法。 4.了解电路软件的仿真方法。 二、实验原理 有源滤波器的设计,就是根据所给定的指标要求,确定滤波器的结束n,选择具体的电路形式,算出电路中各元件的具体数值,安装电路和调试,使设计的滤波器满足指标要求,具体步骤如下: 1.根据阻带衰减速率要求,确定滤波器的阶数n。 2.选择具体的电路形式。 3.根据电路的传递函数和归一化滤波器传递函数的分母多项式,建立起系数的方程 组。 4.解方程组求出电路中元件的具体数值。 5.安装电路并进行调试,使电路的性能满足指标要求。 根据滤波器所能通过信号的频率围或阻带信号频率围的不同,滤波器可分为低通、高通、带通与带阻等四种滤波器。 a)有源二阶低通滤波器(LPF) 图1 压控电压源二阶低通滤波器 b)有源二阶高通滤波器(HPF)

图2 压控电压源二阶高通滤波器 c)有源带通滤波器(BPF) 图3 压控电压源二阶带通滤波器 d)带阻滤波器(NF) 图4 压控电压源双T 二阶有源带阻滤波器 三、实验仪器 1.示波器 2.信号源 3.万用表 4.直流稳压电源 四、实验容

1.二阶低通滤波器 ①参照图4 电路安装二阶低通滤波器。元件值取:R1 = R2 = R = 1.6kΩ,R3 = 17k Ω,R4 =10k Ω, C1 = C2 = C =0.1μF,计算截止频率fc、通带电压放大倍数Auo 和Q 的值。 ②利用MULTISIM 电路仿真软件对上述电路进行仿真,给出幅频特性曲线的仿真 结果。 ③取Ui = 2V,由低到高改变输入信号的频率(注意:保持Ui = 2V 不变),用万用 表测量滤波器的输出电压和截止频率fc,根据测量值,画出幅频特性曲线,并将 测量结果与理论值相比较。 2.二阶高通滤波器 ①参照图6 电路安装二阶高通滤波器。元件值取:R1 = R2 = R = 1.6kΩ,R3 = 1.7k Ω,R4 = 10kΩ,C1 = C2 = C = 0.1μF,Q = 0.707,计算截止频率fc 和通带电压放大倍数Auo 的值。 ②利用MULTISIM 电路仿真软件对上述电路进行仿真,给出幅频特性曲线的仿真 结果。 ③取Ui = 2V,由低到高改变输入信号的频率(注意:保持Ui = 2V 不变),用万 用表测量滤波器的输出电压和截止频率fc,根据测量值,画出幅频特性曲线,并 将测量结果与理论值相比较。 3.二阶带通滤波器 ①参照图9 电路安装二阶带通滤波器。元件值取:R1 = R2 = R = 1.5kΩ,R3 = 2R = 3kΩ,R4 = 10kΩ, R5 = 19kΩ,C1 = C2 = C = 0.1μF,计算截止频率fc、通带电压放大倍数Auo 和 Q 的值。 ②利用MULTISIM 电路仿真软件对上述电路进行仿真,给出幅频特性曲线的仿真 结果。 ③取Ui = 2V,由低到高改变输入信号的频率(注意:保持Ui = 2V 不变),用万 用表测量滤波器的输出电压和截止频率fc,根据测量值,画出幅频特性曲线,测 出带宽BW,并将测量结果与理论值相比较。 4.二阶带阻滤波器 ①参照图12 电路安装二阶带通滤波器。元件值取:R1 = R2 =R = 3kΩ,R3 = 0.5R = 1.5kΩ,R4 = 20kΩ, R5 = 10kΩ,C1 = C2 = C = 0.1μF,C3 = 2C = 0.2μF,计算截止频率fc、通带 电压放大倍数Auo 和Q 的值。 ②利用MULTISIM 电路仿真软件对上述电路进行仿真,给出幅频特性曲线的仿真 结果。 ③取Ui = 2V,由低到高改变输入信号的频率(注意:保持Ui = 2V 不变),用万 用表测量滤波器的输出电压和截止频率fc,根据测量值,画出幅频特性曲线,测 出带宽BW,并将测量结果与理论值相比较。 五、实验预习和仿真 1.压控电压源型有源二阶低通滤波器 仿真电路:

数字图像处理实验报告

数字图像处理实验 报告 学生姓名:学号: 专业年级: 09级电子信息工程二班

实验一常用MATLAB图像处理命令 一、实验内容 1、读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分成三个子窗口来分别显示RGB图像和灰度图像,注上文字标题。 实验结果如右图: 代码如下: Subplot (1,3,1) i=imread('E:\数字图像处理\2.jpg') imshow(i) title('RGB') Subplot (1,3,2) j=rgb2gray(i) imshow(j) title('灰度') Subplot (1,3,3) k=im2bw(j,0.5) imshow(k) title('二值') 2、对两幅不同图像执行加、减、乘、除操作,在同一个窗口内分成五个子窗口来分别显示,注上文字标题。 实验结果如右图: 代码如下: Subplot (3,2,1) i=imread('E:\数字图像处理 \16.jpg') x=imresize(i,[250,320]) imshow(x) title('原图x') Subplot (3,2,2) j=imread(''E:\数字图像处理 \17.jpg') y=imresize(j,[250,320]) imshow(y) title('原图y') Subplot (3,2,3) z=imadd(x,y) imshow(z)

title('相加结果');Subplot (3,2,4);z=imsubtract(x,y);imshow(z);title('相减结果') Subplot (3,2,5);z=immultiply(x,y);imshow(z);title('相乘结果') Subplot (3,2,6);z=imdivide(x,y);imshow(z);title('相除结果') 3、对一幅图像进行灰度变化,实现图像变亮、变暗和负片效果,在同一个窗口内分成四个子窗口来分别显示,注上文字标题。 实验结果如右图: 代码如下: Subplot (2,2,1) i=imread('E:\数字图像处理 \23.jpg') imshow(i) title('原图') Subplot (2,2,2) J = imadjust(i,[],[],3); imshow(J) title('变暗') Subplot (2,2,3) J = imadjust(i,[],[],0.4) imshow(J) title('变亮') Subplot (2,2,4) J=255-i Imshow(J) title('变负') 二、实验总结 分析图像的代数运算结果,分别陈述图像的加、减、乘、除运算可能的应用领域。 解答:图像减运算与图像加运算的原理和用法类似,同样要求两幅图像X、Y的大小类型相同,但是图像减运算imsubtract()有可能导致结果中出现负数,此时系统将负数统一置为零,即为黑色。 乘运算实际上是对两幅原始图像X、Y对应的像素点进行点乘(X.*Y),将结果输出到矩阵Z中,若乘以一个常数,将改变图像的亮度:若常数值大于1,则乘运算后的图像将会变亮;叵常数值小于是,则图像将会会暗。可用来改变图像的灰度级,实现灰度级变换,也可以用来遮住图像的某些部分,其典型应用是用于获得掩膜图像。 除运算操作与乘运算操作互为逆运算,就是对两幅图像的对应像素点进行点(X./Y), imdivide()同样可以通过除以一个常数来改变原始图像的亮度,可用来改变图像的灰度级,其典型运用是比值图像处理。 加法运算的一个重要应用是对同一场景的多幅图像求平均值 减法运算常用于检测变化及运动的物体,图像相减运算又称为图像差分运算,差分运算还可以用于消除图像背景,用于混合图像的分离。

数字图像处理实验报告:灰度变换与空间滤波(附带程序,不看后悔)

1.灰度变换与空间滤波 一种成熟的医学技术被用于检测电子显微镜生成的某类图像。为简化检测任务,技术决定采用数字图像处理技术。发现了如下问题:(1)明亮且孤立的点是不感兴趣的点;(2)清晰度不够,特别是边缘区域不明显;(3)一些图像的对比度不够;(4)技术人员发现某些关键的信息只在灰度值为I1-I2 的范围,因此,技术人员想保留I1-I2 区间范围的图像,将其余灰度值显示为黑色。(5)将处理后的I1-I2 范围内的图像,线性扩展到0-255 灰度,以适应于液晶显示器的显示。请结合本章的数字图像处理处理,帮助技术人员解决这些问题。 1.1 问题分析及多种方法提出 (1)明亮且孤立的点是不够感兴趣的点 对于明亮且孤立的点,其应为脉冲且灰度值为255(uint8)噪声,即盐噪声,为此,首先对下载的细胞图像增加盐噪声,再选择不同滤波方式进行滤除。 均值滤波:均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8 个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。 优点:速度快,实现简单; 缺点:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。 其公式如下: 使用矩阵表示该滤波器则为: 中值滤波:

滤除盐噪声首选的方法应为中值滤波,中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。 其过程为: a、存储像素1,像素2 ....... 像素9 的值; b、对像素值进行排序操作; c、像素5 的值即为数组排序后的中值。优点:由于中值滤波本身为一种利用统计排序方法进行的非线性滤波方法,故可以滤除在排列矩阵两边分布的脉冲噪声,并较好的保留图像的细节信息。 缺点:当噪声密度较大时,使用中值滤波后,仍然会有较多的噪声点出现。自适应中值滤波: 自适应的中值滤波器也需要一个矩形的窗口S xy ,和常规中值滤波器不同的是这个窗口的大小会在滤波处理的过程中进行改变(增大)。需要注意的是,滤波器的输出是一个像素值,该值用来替换点(x, y)处的像素值,点(x, y)是滤波窗口的中心位置。 其涉及到以下几个参数: 其计算过程如下:

有源滤波器实验报告

实验七 集成运算放大器的基本应用(H)—有源滤波器 一、实验目的 1、熟悉用运放、电阻和电容组成有源低通滤波、高通滤波和带通、带阻滤波器。 2、学会测量有源滤波器的幅频特性。 二、实验原理 图7 —1四种滤波电路的幅频特性示意图 由RC元件与运算放大器组成的滤波器称为RC有源滤波器,其功能是让一定频率范围内 的信号通过,抑制或急剧衰减此频率范围以外的信号。可用在信息处理、数据传输、抑制干扰等方面,但因受运算放大器频带限制,这类滤波器主要用于低频范围。根据对频率范围的 选择不同,可分为低通(LPF)、高通(HPF)、带通(BPF)与带阻(BEF)等四种滤波器,它们的幅频特性如图7 —1所示。 具有理想幅频特性的滤波器是很难实现的,只能用实际的幅频特性去逼近理想的。一般来说,滤波器的幅频特性越好,其相频特性越差,反之亦然。滤波器的阶数越高,幅频特性 (a)低通 (C)带通(d)带阻

衰减的速率越快,但RC网络的节数越多,元件参数计算越繁琐,电路调试越困难。任何高阶滤波器均可以用较低的二阶RC有滤波器级联实现。 1、低通滤波器(LPF) 低通滤波器是用来通过低频信号衰减或抑制高频信号。 如图7 —2 (a)所示,为典型的二阶有源低通滤波器。它由两级RC滤波环节与同相比例运算电路组成,其中第一级电容C接至输出端,弓I入适量的正反馈,以改善幅频特性。 图7—2 ( b)为二阶低通滤波器幅频特性曲线。 图7 —2二阶低通滤波器 电路性能参数 R f A UP=^- 二阶低通滤波器的通带增益 R I 截止频率,它是二阶低通滤波器通带与阻带的界限频率。 状。 2、高通滤波器(HPF 与低通滤波器相反,高通滤波器用来通过高频信号,衰减或抑制低频信号。 只要将图7—2低通滤波电路中起滤波作用的电阻、电容互换,即可变成二阶有源高通滤波器,如图7 —3(a)所示。高通滤波器性能与低通滤波器相反,其频率响应和低通滤波器是“镜象”关系,仿照 LPH分析方法,不难求得HPF的幅频特性。 1 2ΠR 1 3 -A UP 品质因数,它的大小影响低通滤波器在截止频率处幅频特性的形 (a) 电路图(b)频率特性

相关文档
最新文档