《数字图像处理灰度化直方图均衡化灰度拉伸》由会员分享,可在线阅读,更多相关《数字图像处理灰度化直方图均衡化灰度拉伸(12页珍藏版)》请在金锄头文库上搜索。
1、数字图像处理与模式识别实验目的打开一幅图像,进行直方图均衡化。并将其灰度线性变化,将灰度线性拉伸。实验准备实验之前,收集数字图像处理编程的相关资料,查阅 C 或 Java 关于本实验图像处理的相关类库和编程核心。经过 C 和 Java 相关资料编程的比较,Java 将图像处理的类封装的较完整,运用起来比 C 灵活方便。以下是相关类库和实现操作的方法:import java.awt.image.*;import javax.imageio.*; /相关的图像处理类库和方法封装在两个包中/Java读取图像的方法BufferedImage newImage = ImageIO.read(new Fi
2、le(filePath);int width = newImage.getWidth(); /获得图像的像素宽度int height = newImage.getHeight(); /获得图像像素的长度/获得图像的色彩模型RGB分量ColorModel colorModel = ColorModel.getRGBdefault(); int r = colorModel.getRed(currPixArrayk);int g = colorModel.getGreen(currPixArrayk);int b = colorModel.getBlue(currPixArrayk); /分别获得
3、图像的rgb分量PixelGrabber p = new PixelGrabber(image, 0, 0, width, height, array, 0, width); /将image图像像素值读入一位矩阵实验步骤算法实现RGB 图像转灰度图由于数字图像的直方图均衡化和灰度的线性拉伸都是基于灰度图的算法实现,本框架中增加了由彩色图转灰度图的功能。简单讲述下算法思想:将存储图像的一维矩阵像素点彩色分量用ColorModel类中的getRed(),getGreen()和getBlue()方法读取,按照(r * 0.3 + g * 0.59 + b * 0.11)公式计算灰度值。部分关键代码如
4、下:for (i = 0; i height; i+) for (j = 0; j width; j+) k = i * width + j;r = colorModel.getRed(currPixArrayk);g = colorModel.getGreen(currPixArrayk);b = colorModel.getBlue(currPixArrayk);gray = (int) (r * 0.3 + g * 0.59 + b * 0.11);r = g = b = gray;grayArrayk = (255 24) | (r 16) | (g 8) | b;测试效果:原 图 灰
5、度图直方图均衡化一幅数字图像存在一个灰度范围,每个像素都有不同的灰度值,因此每个灰度级别出现的概率都会有所不同。直方图的均衡化就是将每个灰度级出现的概率尽量均匀的分布在灰度范围之内(实际操作不可能完全均匀分布),达到图像增强,图像信息最多的效果。首先进行每个灰度级别(0-255)出现的在数字图像的概率,然后通过概率累计的方式将离散的概率值进行累加,得到新的灰度级别的概率进行均匀分布在灰度范围内,修改更新数字图像一维像素矩阵的的灰度值,便可达到直方图均衡化的效果。(Java具体实现还应注意些小细节,代码中的注释将给出) 核心代码如下:int grayLevel; / 每个像素的灰度级int gr
6、ayArray = new int256; / 记录每个灰度级出现的像素数量int resPixArray = new intwidth * height; / 均衡化之后的新像素矩阵for (int i = 0; i height; i+) for (int j = 0; j width; j+) grayLevel = currPixArrayi * width + j / 后8位为该像素的灰度级grayArraygrayLevel+;double p = new double256; / 记录每个灰度级的出现的概率for (int i = 0; i 256; i+) pi = (doub
7、le) grayArrayi / (width * height);p0 = (double) grayArray0 / (width * height);grayArray0 = (int) (p0 * 255 + 0.5);for (int i = 0; i 255; i+) pi + 1 += pi;grayArrayi + 1 = (int) (pi + 1 * 255 + 0.5);int gray, newgray;for (int i = 0; i height; i+) for (int j = 0; j width; j+) gray = currPixArrayi * wi
8、dth + j newgray = (int) grayArraygray;resPixArrayi * width + j = 255 24 | newgray 16| newgray 8 | newgray; / Java中256 色的图像表示方法如下测试效果:灰度图 直方图均衡化后灰度线性拉伸图像灰度线性拉伸就是将图像(灰度范围0,Mf) 的灰度值大部分分布在 a,b范围内的像素灰度值通过某一线性表达是拉伸到c,d灰度范围内,从而达到图像增强的效果。具体通过以下公式实现:c 0=f(x,y)a g(x,y) = (d-c)/(b-a) * f(x,y)-a + c a=f(x,y)bd
9、b=f(x,y)Mf核心代码如下:int resPixArray = new intwidth * height;int gray, newgray;for (int i = 0; i height; i+) for (int j = 0; j width; j+) gray = currPixArrayi * width + j if (gray a)newgray = c;else if (gray b)newgray = (int) (1.0 * (d - c) / (b - a) * (gray - a) + c);elsenewgray = d;resPixArrayi * widt
10、h + j = 255 24 | newgray 16| newgray 8 | newgray; / Java中256 色的图像表示方法如下测试效果:(通过某一线性变化)灰度图 灰度线性拉伸后实验总结本实验主要进行的是数字图像的读入,将直方图进行均衡化,以及灰度的线性拉伸。在本实验中为了实现 Java 版本的数字图像开发平台,查阅许多 Java 方面的数字图像编程资料,搭建了平台的基本框架,方便以后实验算法功能集成到本平台上来。实验报告中给出了算法实现的基本思路和部分代码,以及测试的效果图,均较好的符合实际效果。实验中加深了数字图像处理流程的基本方法,进一步巩固理解了直方图的均衡化和灰度拉伸
11、的理论知识,为日后完善该平台打下了基础。当然实验过程中避免不了许多失误和不解,望日后一一改正完善。/Function.javaimport java.awt.Image;import java.awt.image.BufferedImage;import java.awt.image.ColorModel;import java.awt.image.MemoryImageSource;import java.awt.image.PixelGrabber;import javax.swing.ImageIcon;public class Function public BufferedImage
12、 newImage; / 加载的图像public int currPixArray = null; / 当前图像的像素矩阵public int width; / 图像的宽public int height; / 图像的高public Function() public Function(int width, int height) this.width = width;this.height = height;/ 获得图像像素的矩阵 用一维数组处理public int getPixArray(Image im) PixelGrabber p;int array = new intwidth *
13、 height;try p = new PixelGrabber(im, 0, 0, width, height, array, 0, width);if (p.grabPixels() = false)try throw new Exception(); catch (Exception e) e.printStackTrace(); catch (Exception e) e.printStackTrace();return array;/ 灰度转换public int RGBtoGray(int currPixArray) int grayArray = new intheight *
14、width;ColorModel colorModel = ColorModel.getRGBdefault();int i, j, k, r, g, b;int gray;for (i = 0; i height; i+) for (j = 0; j width; j+) k = i * width + j;r = colorModel.getRed(currPixArrayk);g = colorModel.getGreen(currPixArrayk);b = colorModel.getBlue(currPixArrayk);gray = (int) (r * 0.3 + g * 0.
15、59 + b * 0.11);r = g = b = gray;grayArrayk = (255 24) | (r 16) | (g 8) | b;return grayArray;/ 图像均衡化public int toBalance(int currPixArray) int grayLevel; / 每个像素的灰度级int grayArray = new int256; / 记录每个灰度级出现的像素数量int resPixArray = new intwidth * height; / 均衡化之后的新像素矩阵for (int i = 0; i height; i+) for (int j = 0; j width; j+) grayL