图像增强实验.docx
《图像增强实验.docx》由会员分享,可在线阅读,更多相关《图像增强实验.docx(17页珍藏版)》请在冰豆网上搜索。
图像增强实验
数字图像处理实验报告
1-图像增强
学生姓名:
学号:
实验时间:
地点:
指导教师:
实验名称:
图像增强
试验目的
(1)MATLAB中的实验验证。
通过在MATLAB环境中相关函数的调用,验证图像增强的结果,增强感性认识,促进对课程内容的理解。
(2)通过编写C++程序。
进一步理解算法的实现过程,为在实际项目软件中的应用打下基础。
实验内容
(1)MATLAB中的实验验证
1灰度线性变换,利用imadjust等
2直方图均衡化,利用histeq等
3基于模版的平滑滤波验,证各种滤波模板对椒盐噪声的滤波效果。
filter2,imfilter等函数。
4中值滤波,验证对中值滤波椒盐噪声的滤波效。
medfilt2等函数。
5图像锐化。
验证图像锐化效果。
edge,filter2,gradient等函数。
(2)c语言直方图均衡化编程
用VC++编写程序,将自己的YUV格式的照片转换成灰度图像,并进行直方图均衡化处理,结果存放到res.yuv文件。
后附参考程序代码。
实验记录与结果分析:
(1)①利用imadjust函数来实现灰度的线性化。
先读出图像finley.jpg,然后调用matlab函数imadjust,实现灰度线性化。
程序详见附录1.1,调整结果如下:
调整前:
调整后:
由此可见视觉效果得到明显改善。
②利用histeq函数实现直方图均衡化。
先读出图像finley.jpg,然后调用matlab函数histeq,实现直方图均衡化,最后在显示图像。
程序详见附录1.2。
其图像变化结果和直方图如下:
均衡前:
均衡后:
由此可见,直方图均衡化后,图像均匀性得到了很好的改善。
③基于模版的平滑滤波验。
先读出图像finley.jpg,然后调用matlab函数imnoise给图像加上高斯白噪声(为什么加高斯白噪声,因为这种噪声最常见),用书上的P116页的相关模板,构造滤波器来实现相关滤波。
程序详见附录1.3.结果如下:
原图像:
加过噪声以及滤波图像如下:
④中值滤波。
先读出图像finley.jpg,然后调用matlab函数imnoise给图像加上高斯白噪声,再通过中值滤波函数medfilt2来给图像进行中值滤波。
程序详见1.4.结果如下:
⑤图像锐化。
先读出图像finley.jpg,然后调用matlab函数edge对图像进行边缘锐化。
程序详见附录1.5.结果如下:
(2)c语言直方图均衡化编程。
根据公式以及理论对图像的均衡化进行C语言的实现,首先把finley.jpg转成finley.yuv格式然后对文件读取,处理,最后放回原文件。
程序详见2。
结果如下:
处理前:
处理后:
实验小结
本次实验可谓是收货颇多,我不仅学会了用matlab简单的处理数字图像,还会用c语言创建exe软件了并且能自己做一些简单的图像处理并把它做成想要的软件,如果再加以学习,就可以成功的编出像Photoshop一样的软件,在这高速发展的社会能掌握这样的技能还是非常不错的。
附录(源程序等)
程序1.1:
%====读出图像finley.jpg====%
i=imread('E:
\电力\数字图像处理\实验\实验二\finley.jpg');
i=rgb2gray(i);%转成灰度图像
figure
(1);
subplot(121)
imshow(i);%显示原图像
subplot(122)
imhist(i);%画出频率分布直方图
j=imadjust(i,[0.3,0.7],[]);%图像的均衡化调整
figure
(2)
subplot(121)
imshow(j);%画出均衡化调整之后的图像
subplot(122)
imhist(j)%画出调整之后的频率分布直方图
程序1.2:
%====读出图像finley.jpg====%
i=imread('E:
\电力\数字图像处理\实验\实验二\finley.jpg');
i=rgb2gray(i);%转成灰度图像
j=histeq(i);%直方图的均衡化
%======均衡化之前的图像======%
subplot(121)
imshow(i);
subplot(122)
imhist(i);
%=====均衡化之后的图像====%
figure
(2);
subplot(121);
imshow(j);
subplot(122)
imhist(j);
程序1.3:
%====读出图像finley.jpg====%
i=imread('E:
\电力\数字图像处理\实验\实验二\finley.jpg');
i=rgb2gray(i);%转成灰度图像
figure
(1)
imshow(i);
I=imnoise(i,'gaussian');%给图像见高斯白噪声
%定义相关模板
h0=1/9.*[111;111;111];
h1=1/10.*[111;121;111];
h2=1/16.*[121;242;121];
h3=1/8.*[111;101;111];
h4=1/2.*[01/40;1/411/4;01/40];
%用上述模板进行滤波
g0=imfilter(I,h0);
g1=imfilter(I,h1);
g2=imfilter(I,h2);
g3=imfilter(I,h3);
g4=imfilter(I,h4);
%画图显示
figure
(2)
subplot(231)
imshow(I);
title('噪声图像')
subplot(232)
imshow(g0);
title('平滑滤波')
subplot(233)
imshow(g1);
title('h1模板处理结果')
subplot(234)
imshow(g2);
title('高斯模板处理结果')
subplot(235)
imshow(g3);
title('h3模板处理结果')
subplot(236)
imshow(g4);
title('用h4模板处理结果')
程序1.4:
%====读出图像finley.jpg====%
i=imread('E:
\电力\数字图像处理\实验\实验二\finley.jpg');
i=rgb2gray(i);%转成灰度图像
I=imnoise(i,'gaussian');%给图像见高斯白噪声
k=medfilt2(I);%中值滤波
%画图像
subplot(121)
imshow(I);
title('噪声图像');
subplot(122);
imshow(k);
title('中值滤波后图像');
程序1.5:
%====读出图像finley.jpg====%
i=imread('E:
\电力\数字图像处理\实验\实验二\finley.jpg');
i=rgb2gray(i);%转成灰度图像
BW=edge(i,'roberts',0.1);%求罗伯茨梯度
figure;imshow(BW);
title('图像锐化');
程序2:
(其中黑体部分是程序功能部分其他为建立对话框的辅助部分)
//adjustDlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"adjust.h"
#include"adjustDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CAdjustDlgdialog
CAdjustDlg:
:
CAdjustDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CAdjustDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CAdjustDlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCAdjustDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAdjustDlg)
//NOTE:
theClassWizardwilladdDDXandDDVcallshere
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAdjustDlg,CDialog)
//{{AFX_MSG_MAP(CAdjustDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1,adjust)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CAdjustDlgmessagehandlers
BOOLCAdjustDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCAdjustDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCAdjustDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCAdjustDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCAdjustDlg:
:
adjust()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
unsignedchar*pic_from=NULL,*pic_to=NULL;
intw=352,h=288,Pixels=w*h,ImgBytes=Pixels*1.5;
doublen[256]={0.0},N=Pixels;
doublep[256]={0.0};
doubles[256]={0.0};
doubler[256]={0};
inti,k;
FILE*fp_from=fopen("C:
\\finley","rb");
FILE*fp_to=fopen("C:
\\finley_adjust","wb");
pic_from=(unsignedchar*)malloc(ImgBytes);
pic_to=(unsignedchar*)malloc(ImgBytes);
//从文件读取
fread(pic_from,1,ImgBytes,fp_from);
//-->n,0~N
for(i=0;i{
k=pic_from[i];
n[k]++;
}
//-->p0~1
for(k=0;k<256;k++)
{
p[k]=n[k]/N;
}
s[0]=p[0];
for(k=1;k<256;k++)
{
s[k]=s[k-1]+p[k];
}
for(k=0;k<256;k++)
{
r[k]=(int)(s[k]*255+0.5);
}
memset(pic_to,127,ImgBytes);
for(i=0;i{
k=pic_from[i];
pic_to[i]=r[k];
}
fwrite(pic_to,1,ImgBytes,fp_to);
if(pic_from)
free(pic_from);
if(pic_to)
free(pic_to);
if(fp_from)
fclose(fp_from);
if(fp_to)
fclose(fp_to);
}