数字图像处理报告.docx
- 文档编号:23770737
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:14
- 大小:2.18MB
数字图像处理报告.docx
《数字图像处理报告.docx》由会员分享,可在线阅读,更多相关《数字图像处理报告.docx(14页珍藏版)》请在冰豆网上搜索。
数字图像处理报告
数字图像处理报告
姓名:
张行
学号:
201203284
班级:
计科11202
序号:
31
院系:
计算机科学学院
1、实验目的
1.了解数字图像处理技术
2.通过上机实验编写算法实现各种功能
3.加深对数字图像处理的认识
二、实验原理
1. 模糊处理
(1)了解空间域图像模糊的各种方法;
(2)通过编写程序掌握采用直方图均衡化进行图像模糊的方法;
2. 图像旋转
(1)改变像素矩阵值,达到旋转的效果;
3. 图像锐化
(1)了解并掌握使用微分算子进行图像边缘检测的基本原理;
(2)编写程序使用Laplacian算子(二阶导数算子)实现图像锐化,进一步理解图像锐化的实质;
(3)掌握使用不同梯度算子(一阶导数算子)进行图像边缘检测的原理、方法,根据实验结果分析各种算子的工作效果;
三、实验内容
主要是图像的几何变换的编程实现,具体包括图像的读取、改写,图像模糊,图像的锐化,图像的旋转等.
具体要求如下:
1.编程实现图像模糊;
2.编程实现图像的锐化;
3.编程实现图像的旋转;
4.编程实现以任意角度对图像进行旋转变换
四、源代码
实现语言:
java
packagecn.lk.test1;
importjava.awt.*;
importjava.awt.event.*;
importjava.awt.image.*;
importjavax.swing.*;
importjava.io.*;
importjava.awt.geom.AffineTransform;
publicclassImagePanelextendsJPanel{
Imageimage;//被处理的图像
BufferedImagebufImage;//用于显示的缓冲区图像
BufferedImageoriginalBufImage;//原始缓冲区图像
Graphics2Dg2D;//图形环境
LookupTableLUT;//查找表
//载入图像
publicvoidloadImage(StringfileName){
image=this.getToolkit().getImage(fileName);//获取图像
MediaTrackermt=newMediaTracker(this);//实例化媒体加载器mt.addImage(image,0);//增加待加载图像到媒体加载器
try{
mt.waitForAll();//等待所有图像的加载完成
}catch(Exceptionex){
ex.printStackTrace();//输出出错信息
}
//创建原始缓冲区图像
originalBufImage=new
BufferedImage(image.getWidth(this),image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
g2D=originalBufImage.createGraphics();//创建缓冲区图像的图形环境
g2D.drawImage(image,0,0,this);//传输源图像数据到缓冲区图像中
bufImage=originalBufImage;
repaint();//重绘组件
}
//过滤图
publicvoidapplyFilter(float[]data){
if(bufImage==null)
return;//如果bufImage为空则直接返回
Kernelkernel=newKernel(3,3,data);
ConvolveOpimageOp=newConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,
null);//创建卷积变换操作对象
BufferedImagefilteredBufImage=newBufferedImage(
image.getWidth(this),image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);//过滤后的缓冲区图像
imageOp.filter(bufImage,filteredBufImage);//过滤图像,目标图像在filteredBufImage
bufImage=filteredBufImage;//让用于显示的缓冲区图像指向过滤后的图像
repaint();//重绘组件
}
//模糊图像
publicvoidblur(){
if(bufImage==null)
return;
float[]data={
0.0625f,0.125f,0.0625f,
0.125f,0.025f,0.125f,
0.0625f,0.125f,0.0625f
};
applyFilter(data);
}
//锐化图像
publicvoidsharpen(){
if(bufImage==null)
return;
float[]data={
-1.0f,-1.0f,-1.0f,
-1.0f,9.0f,-1.0f,
-1.0f,-1.0f,-1.0f
};
applyFilter(data);
}
//重载applyFilter方法
publicvoidapplyFilter(){
LookupOplop=newLookupOp(LUT,null);//根据查找表,创建查找过滤器
lop.filter(bufImage,bufImage);//过滤图像
repaint();
}
publicvoidxuZh(intdegree,Colorbgcolor){
intiw=bufImage.getWidth();//原始图象的宽度
intih=bufImage.getHeight();//原始图象的高度
intw=0;
inth=0;
intx=0;
inty=0;
degree=degree%360;
if(degree<0)
degree=360+degree;//将角度转换到0-360度之间
doubleang=Math.toRadians(degree);//将角度转为弧度
/**
*确定旋转后的图象的高度和宽度
*/
if(degree==180||degree==0||degree==360){
w=iw;
h=ih;
}elseif(degree==90||degree==270){
w=ih;
h=iw;
}else{
doublecosVal=Math.abs(Math.cos(ang));
doublesinVal=Math.abs(Math.sin(ang));
w=(int)(sinVal*ih)+(int)(cosVal*iw);
h=(int)(sinVal*iw)+(int)(cosVal*ih);
}
x=(w/2)-(iw/2);//确定原点坐标
y=(h/2)-(ih/2);
BufferedImagerotatedImage=newBufferedImage(w,h,bufImage.getType());
Graphics2Dgs=(Graphics2D)rotatedImage.getGraphics();
if(bgcolor==null){
rotatedImage=gs.getDeviceConfiguration().createCompatibleImage(w,
h,Transparency.TRANSLUCENT);
}else{
gs.setColor(bgcolor);
gs.fillRect(0,0,w,h);//以给定颜色绘制旋转后图片的背景
}
AffineTransformat=newAffineTransform();
at.rotate(ang,w/2,h/2);//旋转图象
at.translate(x,y);
AffineTransformOpop=newAffineTransformOp(at,
AffineTransformOp.TYPE_BICUBIC);
op.filter(bufImage,rotatedImage);
bufImage=rotatedImage;
repaint();}
//恢复图像
publicvoidreset(){
if(bufImage==null)return;
bufImage=originalBufImage;//
g2D.drawImage(image,0,0,this);
repaint();//调用paint()方法重绘组件
}
publicvoidpaint(Graphicsg){
super.paintComponent(g);
//如果bufImage非空,则在组件上绘制它
if(bufImage!
=null){
Graphics2Dg2=(Graphics2D)g;
g2.drawImage(bufImage,(this.getWidth()-bufImage.getWidth())/2,
(this.getHeight()-bufImage.getHeight())/2,this);
}}
}
packagecn.lk.test1;
importjava.awt.*;
importjava.awt.event.*;
importjava.awt.image.*;
importjavax.swing.*;
importjava.io.*;
importjavax.swing.JFrame;
publicclassPicOptionextendsJFrameimplementsActionListener{
privateJPaneljPanel=newJPanel();//面板jPanel用于容纳模糊、锐化、还原图像按钮
privateJButtonbuttonFile;//打开图像文件按钮
privateJButtonbuttonBlur;//模糊图像按钮
privateJButtonbuttonSharpen;//锐化图像按钮
privateJButtonbuttonXuZh;//旋转图片
privateJButtonbuttonReset;//还原图像按钮
ImagePanelimagePanel=newImagePanel();//创建ImagePanel对象用于绘制图像
//构造函数
publicPicOption(){
super("图片处理");
ContainercontentPane=getContentPane();//得到容器
buttonFile=newJButton("打开图像文件");//实例化组件
buttonFile.addActionListener(this);//增加事件监听
buttonBlur=newJButton("模糊图像");
buttonBlur.addActionListener(this);
buttonSharpen=newJButton("锐化图像");
buttonSharpen.addActionListener(this);
buttonXuZh=newJButton("旋转图片");
buttonXuZh.addActionListener(this);
buttonReset=newJButton("还原图片");
buttonReset.addActionListener(this);
buttonReset.setEnabled(false);
jPanel.add(buttonBlur);//增加组件到面板上
jPanel.add(buttonSharpen);
jPanel.add(buttonXuZh);
jPanel.add(buttonReset);
contentPane.add(jPanel,BorderLayout.SOUTH);//增加组件到容器上
contentPane.add(buttonFile,BorderLayout.NORTH);
contentPane.add(imagePanel,BorderLayout.CENTER);//设置窗口
this.setSize(900,600);//设置窗口大小
this.setLocation(200,50);//设置窗口出现的位置
this.setVisible(true);//设置窗口可见
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时退出程序
}
publicstaticvoidmain(String[]args){
newPicOption();
}
@Override
publicvoidactionPerformed(ActionEvente){
JButtonbutton=(JButton)e.getSource();//获取事件源
//打开图像文件按钮buttonFile事件处理
if(button==this.buttonFile){
JFileChooserchooser=newJFileChooser();//实例化文件选择器chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);//设置文件打开模式为仅打开文件
chooser.setCurrentDirectory(newFile("."));//设置文件选择器当前目录
//设置图像文件过滤器
chooser.setFileFilter(newjavax.swing.filechooser.FileFilter(){
publicbooleanaccept(Filefile){//可接受的文件类型
Stringname=file.getName().toLowerCase();
returnname.endsWith(".gif")
||name.endsWith(".jpg")
||name.endsWith(".jpeg")
||file.isDirectory();
}
publicStringgetDescription(){//文件描述
return"图像文件"}});
intresult=chooser.showOpenDialog(this);//显示文件选择对话框
if(result==JFileChooser.APPROVE_OPTION){//得到用户行为
StringfileName=chooser.getSelectedFile().getAbsolutePath();//得到选择的文件名
imagePanel.loadImage(fileName);//截入图像并显示
}
}
//模糊图像按钮buttonBlur事件处理
elseif(button==this.buttonBlur)
imagePanel.blur();//模糊图像
buttonReset.setEnabled(true);//设置还原图像按钮可用
}
//锐化图像按钮buttonSharpen事件处理
elseif(button==this.buttonSharpen){
imagePanel.sharpen();//锐化图像
buttonReset.setEnabled(true);//设置还原图像按钮可用
}
//旋转图片事件处理
elseif(button==this.buttonXuZh){
imagePanel.xuZh(30,Color.black);
buttonReset.setEnabled(true);
}
//还原图像按钮buttonReset事件处理
elseif(button==this.buttonReset){
imagePanel.reset();//还原图像
buttonReset.setEnabled(false);//设置还原图像按钮不可用
}}
}
五、实验结果
1.实验原图
2.模糊
3.锐化
2.旋转
5、实验小结
通过本次实验,让我能熟练的运用java语言来编写代码,掌握了java语言文件操作的一些基本函数及其含义。
领悟到了编程过程中,变量定义的重要性。
以及对数字图像处理知识的掌握及应用。
了解了图像的处理过程以及如何读取,写入,获取像素点。
对数字图像处理有了更深的了解,以后会更加努力学习知识,让自己不打断成长。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 报告