基于java综合图像处理课程设计.docx
《基于java综合图像处理课程设计.docx》由会员分享,可在线阅读,更多相关《基于java综合图像处理课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
基于java综合图像处理课程设计
成绩评定表
学生姓名
**
班级学号
******
专业
通信工程
课程设计题目
基于JAVA的综合图像处理的设计与实现
评
语
组长签字:
成绩
日期
20年月日
课程设计任务书
学院
信息科学与工程学院
专业
通信工程
学生姓名
***
班级学号
****
课程设计题目
基于JAVA的综合图像处理的设计与实现
实践教学要求与任务:
1、熟悉综合图像处理的根本原理
2、熟悉Java的环境
3、在Java环境中仿真实现综合图像处理
4、运行、调试综合图像处理
5、对综合图像处理进展结果验证及分析
工作方案与进度安排:
12月1日熟悉设计任务、查阅资料、进展原理分析及可行性论证
12月2日~3日在Java环境中仿真实现综合图像处理
12月4日验收、辩论、提交报告
指导教师:
201年月日
专业负责人:
201年月日
学院教学副院长:
201年月日
1背景及意义
图形图像信息是人类获得外界信息的主要来源,因为大约有70%的信息是通过人眼获得的,而人眼获得的都是图形图像信息。
在近代科学研究、军事技术、工农业生产、医学、气象及天文学领域中,人们越来越多地利用图形图像信息来认识和判断事物,解决实际问题。
本设计能实现根本的绘画功能以及图形图像的根本编辑。
本文是基于Java图形图像处理软件,Java编程语言是一种跨平台的编程语言,在编写图形用户界面方面,也要支持跨平台功能。
为此Java提供了强大而丰富的AWT包和Swing包,使得Java功能越来越强大,界面越来越美观。
Java图形图像用户界面的编写普遍采用构件化思想来进展,AWT和Swing本身提供的也是许多标准的构件和容器。
本软件将所学的理论知识与实际应用相结合,运用Java编程语言,实现读入图片、滤镜处理功能、边缘处理功能、图像复原功能,以到达图形处理的目的。
课题研究的目的及意义
随着科学技术的不断开展,计算机的更新速度不断提高,人们的思想文化素质的提高,对图形图像的要求也越来越高。
因此把原始图形图像与计算机结合起来,从而创作出许多更加完美的图像,满足人们的需求,计算机图形图像处理,是指利用计算机对图像图像进展一系列加工,以便获得人们所需要的效果。
图形图像是人们获取和交换信息的主要来源,人类感知外界信息,80%以上是通过视觉得到的。
因此,图形图像处理的应用领域必然涉及到人类生活和工作的方方面面。
图形图像是用各种观测系统以不同形式和手段观测客观世界而产生视知觉的实体。
比方人的视觉就是以观测系统,通过它得到的图形图像就是客观景物在人心目中形成的影像。
视觉是人类观察世界、认知世界的重要功能手段。
图形图像带有大量的信息,为此开发这个图形图像处理软件,能过处理一些图形图像,并对图形图像处理技术此方面进展深入的研究。
2设计原理及设计方案
图像增强
图像增强作为最根本的图像处理技术,其目的是对图像进展加工,已得到对具体应用来说视觉效果更好更有用的图像。
由于具体应用的目的和要求不同,因而好和有用的含义也不一样,因此图像增强技术是面向具体问题的。
目前图像增强技术根据其处理的空间不同,可分两大类:
空域方法和频域方法。
前者直接在图像所在的像素空间进展处理;而后者是通过对图像进展傅里叶变换后在频域上间接进展的。
在空域方法中,根据每次处理是针对单个像素还是小的子图像块〔模板〕又可分为两种:
一种是基于像素的图像增强,也叫点处理,这种增强过程中对每个像素的处理与其他像素无关;另一种是基于模板的图像增强,也叫空域滤波,这种增强过程中的每次处理操作都是基于图像中的某个小的区域。
本文中采用的图像增强方式就是空域滤波,其根据操作特点可以分为线性滤波和非线性滤波两类;而根据滤波效果又可分为平滑滤波和锐化滤波两种。
2.1.1图像平滑处理
本文中对图像的平滑处理采用的是线性平滑滤波器。
平滑滤波器的概念非常直观,它用滤波模板确定的邻域内像素的平均灰度值,去代替图像中的每一个像素点的值,这种处理减少了图像灰度的“锋利〞变化。
图1显示了一个标准3×3的平滑模板,
图1线性平滑算子
在JAVA程序中,可以通过使用ConvolveOp组件来进展模板与图像的卷积计算,局部代码如下
publicBufferedImagesmooth(BufferedImageimage1)
{
image=image1;
floatdata[]={
1/9f,1/9f,1/9f,
1/9f,1/9f,1/9f,
1/9f,1/9f,1/9f};
Kernelkernel=newKernel(3,3,data);
ConvolveOpop=newConvolveOp(kernel);
returnfilter(op);
}
源程序代码将在附录中给出,此处不做详细介绍。
图像锐化处理
图像的锐化与平滑相反,在图像传输和变换过程中,因受到干扰会退化,比拟典型的事图像模糊。
图像锐化就是使边缘轮廓线模糊的图像变得清晰,使其细节更加清晰。
拉普拉斯算子是一种各项同性的二阶导数算子,对一个连续函数
他在位置
处的拉普拉斯算子定义为:
由于任意阶微分都是线性的,因此拉普拉斯变换也是一个线性操作。
对于数字图像来说,图像
的拉普拉斯算子定义为:
其中
,
是
在
方向和
方向的二阶差分,因此离散函数
的拉普拉斯算子可表示为:
上式可用图2所示的模板表示,且拉普拉斯算子显然是各向同性的。
图2拉普拉斯算子
由于拉普拉斯是一种微分算子,它的应用强调图像中灰度的突变即降低灰度缓慢变化的区域,这将产生一幅把图像中的浅灰色边线和突变点叠加到暗背景中的图像。
将原始图像和拉普拉斯图像叠加在一起的方法可以保护拉普拉斯锐化处理的效果,同时又能复原背景信息,因此,记住拉普拉斯定义是很重要的。
如果所使用的定义具有负的中心系数,那么就必须将原始图像减去经拉普拉斯变换后的图像,从而得到锐化的结果,反之,如果拉普拉斯定义的中心系数为正,那么原始图像要加上经拉普拉斯变换后的图像。
故使用拉普拉斯算子对图像增强的根本方法可以表示为下式:
其中
也可以用算子矩阵来表示,例如对于图2模板,最终得到的增强图像相当于原图像直接与如图3算子相卷积的结果,此算子矩阵也叫锐化掩膜。
图3锐化掩膜算子
在程序中相关的代码如下:
publicBufferedImagesharp(BufferedImageimage1)
{
image=image1;
floatdata[]={
0.0f,-1.0f,0.0f,
-1.0f,5.0f,-1.0f,
0.0f,-1.0f,0.0f};
Kernelkernel=newKernel(3,3,data);
ConvolveOpop=newConvolveOp(kernel);
returnfilter(op);
}
边缘检测
图像的边缘对人类视觉而言具有重要意义。
当人们看一个带有边缘的物体时,首先感受到的便是它的边缘。
灰度或构造等信息的突变处称为边缘。
边缘时一个区域的完毕,也是另一个区域的开场,利用这种特性可以分割图像。
需要指出的是,检测出的边缘并不等同于目标的真实边缘。
由于图像数据是二维的,而实际物体是三维的,从二维到三维的投影必然会造成信息的丧失,再加上成像过程中的光照不均和噪声等因素的影响,使得有边缘的地方不一定能检测出来,而检测出来的边缘也不一定代表实际边缘。
图像的边缘有方向和幅度两个属性,沿边缘方向的像素点变化平缓,而垂直于边缘方向的像素点变化剧烈。
物体边缘上的这种变化可以用微分算子检测出来,通常用一阶或二阶导数来检测边缘。
拉普拉斯算子同样可用于图像边缘检测,由于其是基于二阶导数的边缘检测算子,该算子对噪声敏感。
一种改良方法是先对图像进展平滑滤波处理,然后再应用边缘检测算子。
这种平滑和微分合并后的算子称为高斯-拉普拉斯算子,这种边缘检测方法也称为Marr边缘检测方法。
在计算过程中可直接使用如图2所示的拉普拉斯算子进展边缘检测,其在程序中相关的代码如下:
publicBufferedImageedge(BufferedImageimage1)
{
image=image1;
floatdata[]={
0.0f,1.0f,0.0f,
1.0f,-4.0f,1.0f,
0.0f,1.0f,0.0f};
Kernelkernel=newKernel(3,3,data);
ConvolveOpop=newConvolveOp(kernel);
returnfilter(op);
}
3设计过程
本文以此在校园内拍摄的照片为例对其分别进展平滑、锐化、边缘处理
对图像进展平滑处理
对图像使用平滑处理功能对其进展平滑处理,结果如下:
3.2对图像进展锐化处理
使用图像复原功能复原图像,再使用锐化处理功能对例图进展锐化处理,结果如下:
3.3对图像进展边缘检测
使用图像复原功能复原图像,再使用边缘变换功能对例图进展边缘检测,结果如下:
4结论
本文基于Java的图形图形处理环境,设计并实现了一个图形图像处理系统,总的来说,到达了预定的目标,可以实现对图形图像进展较好的,较全面的处理。
这次的课程设计从各个方面对我所掌握的知识进展了一次考验,虽说做的比拟简单,但也花费我较长的时间,总的来说这次课程设计对本人来说是成功的,见识、知识、经历都长进了不少。
在这次课程设计的过程中,让自己的编程水平有了一定程度的提高,对自己也有一个了解,使自己从校门走出去以后,能够比拟准确的给自己定位,了解自己有从事什么工作的能力。
另外,通过这次软件的开发,对于图形图像处理方面有了真正实质上的进步。
但是,从整体上面来说,因为经历的欠缺,导致整个软件存在一些漏洞,另外一些地方做的也不是很正规,但是相信通过以后的学习和实践,这样的错误会尽量防止。
参考文献
[1]孙卫琴.JAVA面向对象编程[M]..北京:
电子工业出版社,2006:
256-297.
[4]天猜vs马头,?
图像的锐化算子
附录:
程序源代码
importjavax.swing.UIManager;
publicclassApplication1
{
publicApplication1()
{
newFrame();
}
publicstaticvoidmain(Stringargs[])
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exceptione)
{
e.printStackTrace();
}
newApplication1();
}
}
importjava.awt.*;
importjava.awt.image.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassFrameextendsJFrame
{
BufferedImageorimage;
BufferedImageimage;
JFrameframe=newJFrame("图像处理");
FilePanepane=newFilePane();
ImageFilterfilter=newImageFilter();
FileChooserchooser=newFileChooser();
JMenuBarbar=newJMenuBar();
JMenufile1=newJMenu("文件");
JMenufile2=newJMenu("编辑");
JMenuItemopen=newJMenuItem("翻开");
JMenuItemexit=newJMenuItem("退出");
JMenuItemsmooth=newJMenuItem("平滑处理");
JMenuItemsharp=newJMenuItem("锐化处理");
JMenuItemedge=newJMenuItem("边缘变换");
JMenuItemreset=newJMenuItem("图像复原");
publicFrame()
{
frame.getContentPane().setLayout(newBorderLayout());
frame.setSize(600,480);
frame.setContentPane(pane);
frame.setVisible(true);
frame.setResizable(true);
file1.add(open);
file1.add(exit);
bar.add(file1);
file2.add(smooth);
file2.add(sharp);
file2.add(edge);
file2.add(reset);
bar.add(file2);
frame.setJMenuBar(bar);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
exit.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvente)
{
System.exit(0);
}
});
open.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvente)
{
pane.showImage(chooser.chooser());
orimage=pane.PassImage();
image=pane.PassImage();
filter.setoriginalimage(orimage);
DimensionimageSize=newDimension(orimage.getWidth()+17,
orimage.getHeight()+60);
frame.setSize(imageSize);
frame.setVisible(false);
frame.setVisible(true);
repaint();
}
});
smooth.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvente)
{
image=filter.smooth(image);
pane.showImage(image);
frame.setVisible(false);
frame.setVisible(true);
repaint();
}
});
sharp.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvente)
{
image=filter.sharp(image);
pane.showImage(image);
frame.setVisible(false);
frame.setVisible(true);
repaint();
}
});
edge.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvente)
{
image=filter.edge(image);
pane.showImage(image);
frame.setVisible(false);
frame.setVisible(true);
repaint();
}
});
reset.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvente)
{
image=filter.reset();
pane.showImage(image);
frame.setVisible(false);
frame.setVisible(true);
repaint();
}
});
}
}
importjava.io.File;
importjavax.swing.JFileChooser;
publicclassFileChooserextendsJFileChooser
{
publicJFileChooserf;
publicFileChooser()
{
f=newJFileChooser();
}
publicStringchooser()
{
f.setCurrentDirectory(newFile("."));
f.setFileFilter(newjavax.swing.filechooser.FileFilter()
{
publicbooleanaccept(Filefile)
{
Stringname=file.getName().toLowerCase();
returnname.endsWith(".gif")||name.endsWith(".jpg")||
name.endsWith(".jpeg")||name.endsWith(".png")||file.isDirectory();
}
publicStringgetDescription()
{
return"Imagefiles";
}
});
f.setVisible(true);
f.showOpenDialog(f);
intresult=0;
Stringname=null;
if(result==JFileChooser.APPROVE_OPTION)
{
name=f.getSelectedFile().getAbsolutePath();
}
f.setVisible(false);
returnname;
}
}
importjava.awt.BorderLayout;
importjava.awt.Dimension;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.MediaTracker;
importjava.awt.Toolkit;
importjava.awt.image.BufferedImage;
importjavax.swing.JPanel;
classFilePaneextendsJPanel
{
BufferedImageorimage;
BufferedImageimage;
publicFilePane()
{
super();
setLayout(newBorderLayout());
}
publicvoidshowImage(Stringurl)
{
Imageimage1=Toolkit.getDefaultToolkit().getImage(url);
MediaTrackertracker=newMediaTracker(this);
tracker.addImage(image1,0);
try
{
tracker.waitForID(0);
}
catch(InterruptedExceptione){}
image=newBufferedImage(image1.getWidth(null),image1.getHeight(null),
BufferedImage.TYPE_INT_RGB);
Graphicsg=image.createGraphics();
g.drawImage(image1,0,0,null);
}
publicvoidshowImage(BufferedImageimage1)
{
MediaTrackertracker=newMediaTracker(this);
tracker.addImage(image1,0);
try
{
tracker.waitForID(0);
}
catch(InterruptedExceptione){}
image=newBufferedImage(image1.getWidth(null),image1.getHeight(null),
BufferedImage.TYPE_INT_RGB);
Graphicsg=image.createGraphics();
g.drawImage(image1,0,0,null);
}
protectedvoidpaintComponent(Graphicsg)
{
super.paintComponent(g);
if(image!
=null)
{
g.drawImage(image,0,0,null);
}
}
publicBufferedImagePassImage()
{
returnimage;
}
}
importjava.awt.Graphics;
importjava.awt.image.BufferedImage;
importjava.awt.image.BufferedImageOp;
importjava.awt.image.ConvolveOp;
importjava.awt.image.Kernel;
importjavax.swing.JPanel;
publicc