1、数字图像处理报告数字图像处理报告姓 名: 张 行 学 号: 201203284 班 级: 计科11202 序 号: 31 院 系: 计算机科学学院 1、实验目的1.了解数字图像处理技术2.通过上机实验编写算法实现各种功能3.加深对数字图像处理的认识二、实验原理1.模糊处理(1)了解空间域图像模糊的各种方法;(2)通过编写程序掌握采用直方图均衡化进行图像模糊的方法;2.图像旋转(1)改变像素矩阵值,达到旋转的效果;3.图像锐化(1)了解并掌握使用微分算子进行图像边缘检测的基本原理;(2)编写程序使用Laplacian算子(二阶导数算子)实现图像锐化,进一步理解图像锐化的实质;(3)掌握使用不同梯
2、度算子(一阶导数算子)进行图像边缘检测的原理、方法,根据实验结果分析各种算子的工作效果;三、实验内容主要是图像的几何变换的编程实现,具体包括图像的读取、改写,图像模糊,图像的锐化,图像的旋转等.具体要求如下:1编程实现图像模糊;2编程实现图像的锐化;3编程实现图像的旋转;4编程实现以任意角度对图像进行旋转变换四、源代码实现语言:javapackage cn.lk.test1;import java.awt.*;import java.awt.event.*;import java.awt.image.*;import javax.swing.*;import java.io.*;import
3、java.awt.geom.AffineTransform;public class ImagePanel extends JPanel Image image; / 被处理的图像 BufferedImage bufImage; / 用于显示的缓冲区图像 BufferedImage originalBufImage; / 原始缓冲区图像 Graphics2D g2D; / 图形环境 LookupTable LUT;/ 查找表 / 载入图像 public void loadImage(String fileName) image = this.getToolkit().getImage(file
4、Name); / 获取图像 MediaTracker mt = new MediaTracker(this); / 实例化媒体加载器 mt.addImage(image, 0); / 增加待加载图像到媒体加载器 try mt.waitForAll(); / 等待所有图像的加载完成 catch (Exception ex) ex.printStackTrace(); / 输出出错信息 / 创建原始缓冲区图像 originalBufImage = new BufferedImage(image.getWidth(this), image.getHeight(this), BufferedImage
5、.TYPE_INT_ARGB); g2D = originalBufImage.createGraphics(); / 创建缓冲区图像的图形环境 g2D.drawImage(image, 0, 0, this); / 传输源图像数据到缓冲区图像中 bufImage = originalBufImage; repaint(); / 重绘组件 / 过滤图 public void applyFilter(float data) if (bufImage = null) return; / 如果bufImage为空则直接返回 Kernel kernel = new Kernel(3, 3, data)
6、; ConvolveOp imageOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); / 创建卷积变换操作对象 BufferedImage filteredBufImage = new BufferedImage( image.getWidth(this), image.getHeight(this), BufferedImage.TYPE_INT_ARGB); / 过滤后的缓冲区图像 imageOp.filter(bufImage, filteredBufImage);/ 过滤图像,目标图像在filteredBufImage
7、bufImage = filteredBufImage; / 让用于显示的缓冲区图像指向过滤后的图像 repaint(); / 重绘组件 / 模糊图像 public void blur() 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); / 锐化图像 public void sharpen() if (bufImage = null) return; float dat
8、a = -1.0f, -1.0f, -1.0f, -1.0f, 9.0f, -1.0f, -1.0f, -1.0f, -1.0f ; applyFilter(data); / 重载applyFilter方法 public void applyFilter() LookupOp lop = new LookupOp(LUT, null); / 根据查找表,创建查找过滤器 lop.filter(bufImage, bufImage);/ 过滤图像 repaint(); public void xuZh(int degree, Color bgcolor) int iw = bufImage.get
9、Width();/ 原始图象的宽度 int ih = bufImage.getHeight();/ 原始图象的高度 int w = 0; int h = 0; int x = 0; int y = 0; degree = degree % 360; if (degree 0) degree = 360 + degree;/ 将角度转换到0-360度之间 double ang = Math.toRadians(degree);/ 将角度转为弧度 /* * 确定旋转后的图象的高度和宽度 */ if (degree = 180 | degree = 0 | degree = 360) w = iw;
10、 h = ih; else if (degree = 90 | degree = 270) w = ih; h = iw; else double cosVal = Math.abs(Math.cos(ang); double sinVal = 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); Buf
11、feredImage rotatedImage = new BufferedImage(w, h, bufImage.getType(); Graphics2D gs = (Graphics2D) rotatedImage.getGraphics(); if (bgcolor = null) rotatedImage = gs.getDeviceConfiguration().createCompatibleImage(w, h, Transparency.TRANSLUCENT); else gs.setColor(bgcolor); gs.fillRect(0, 0, w, h);/ 以给
12、定颜色绘制旋转后图片的背景 AffineTransform at = new AffineTransform(); at.rotate(ang, w / 2, h / 2);/ 旋转图象 at.translate(x, y); AffineTransformOp op = new AffineTransformOp(at, AffineTransformOp.TYPE_BICUBIC); op.filter(bufImage, rotatedImage); bufImage = rotatedImage; repaint(); / 恢复图像 public void reset() if (bu
13、fImage = null)return; bufImage = originalBufImage; / g2D.drawImage(image, 0, 0, this); repaint(); / 调用paint()方法重绘组件 public void paint(Graphics g) super.paintComponent(g); / 如果bufImage非空,则在组件上绘制它 if (bufImage != null) Graphics2D g2 = (Graphics2D) g; g2.drawImage(bufImage, (this.getWidth() - bufImage.
14、getWidth() / 2, (this.getHeight() - bufImage.getHeight() / 2, this); package cn.lk.test1;import java.awt.*;import java.awt.event.*;import java.awt.image.*;import javax.swing.*;import java.io.*;import javax.swing.JFrame;public class PicOption extends JFrame implements ActionListener private JPanel jP
15、anel = new JPanel(); / 面板jPanel用于容纳模糊、锐化、还原图像按钮 private JButton buttonFile; / 打开图像文件按钮 private JButton buttonBlur; / 模糊图像按钮 private JButton buttonSharpen; / 锐化图像按钮 private JButton buttonXuZh;/旋转图片 private JButton buttonReset; / 还原图像按钮 ImagePanel imagePanel = new ImagePanel();/ 创建ImagePanel对象用于绘制图像 /
16、 构造函数 public PicOption() super(图片处理); Container contentPane = getContentPane(); / 得到容器 buttonFile = new JButton(打开图像文件); / 实例化组件 buttonFile.addActionListener(this); / 增加事件监听 buttonBlur = new JButton(模糊图像); buttonBlur.addActionListener(this); buttonSharpen = new JButton(锐化图像); buttonSharpen.addAction
17、Listener(this); buttonXuZh=new JButton(旋转图片); buttonXuZh.addActionListener(this); buttonReset = new JButton( 还原图片 ); buttonReset.addActionListener(this); buttonReset.setEnabled(false); jPanel.add(buttonBlur); / 增加组件到面板上 jPanel.add(buttonSharpen); jPanel.add(buttonXuZh); jPanel.add(buttonReset); cont
18、entPane.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.EXI
19、T_ON_CLOSE); / 关闭窗口时退出程序 public static void main(String args) new PicOption(); Override public void actionPerformed(ActionEvent e) JButton button = (JButton) e.getSource(); / 获取事件源 / 打开图像文件按钮buttonFile事件处理 if (button = this.buttonFile) JFileChooser chooser = new JFileChooser(); / 实例化文件选择器 chooser.se
20、tFileSelectionMode(JFileChooser.FILES_ONLY); / 设置文件打开模式为仅打开文件 chooser.setCurrentDirectory(new File(.); / 设置文件选择器当前目录 / 设置图像文件过滤器 chooser.setFileFilter(new javax.swing.filechooser.FileFilter() public boolean accept(File file) / 可接受的文件类型 String name = file.getName().toLowerCase(); return name.endsWith
21、(.gif) | name.endsWith(.jpg) | name.endsWith(.jpeg) | file.isDirectory(); public String getDescription() / 文件描述 return 图像文件 ); int result = chooser.showOpenDialog(this); / 显示文件选择对话框 if (result = JFileChooser.APPROVE_OPTION) / 得到用户行为 String fileName = chooser.getSelectedFile().getAbsolutePath(); / 得到
22、选择的文件名 imagePanel.loadImage(fileName); / 截入图像并显示 / 模糊图像按钮buttonBlur事件处理 else if (button = this.buttonBlur) imagePanel.blur(); / 模糊图像 buttonReset.setEnabled(true); / 设置还原图像按钮可用 / 锐化图像按钮buttonSharpen事件处理 else if (button = this.buttonSharpen) imagePanel.sharpen(); / 锐化图像 buttonReset.setEnabled(true); /
23、 设置还原图像按钮可用 /旋转图片事件处理 else if(button=this.buttonXuZh) imagePanel.xuZh(30, Color.black); buttonReset.setEnabled(true); / 还原图像按钮buttonReset事件处理 else if (button = this.buttonReset) imagePanel.reset(); / 还原图像 buttonReset.setEnabled(false); / 设置还原图像按钮不可用 五、实验结果1.实验原图2.模糊3.锐化2.旋转5、实验小结 通过本次实验,让我能熟练的运用java语言来编写代码,掌握了java语言文件操作的一些基本函数及其含义。领悟到了编程过程中,变量定义的重要性。以及对数字图像处理知识的掌握及应用。了解了图像的处理过程以及如何读取,写入,获取像素点。对数字图像处理有了更深的了解,以后会更加努力学习知识,让自己不打断成长。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1