1 / 12
文档名称:

数字图像处理灰度化直方图均衡化灰度拉伸.doc

格式:doc   大小:718KB   页数:12页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

数字图像处理灰度化直方图均衡化灰度拉伸.doc

上传人:mh900965 2017/8/27 文件大小:718 KB

下载得到文件列表

数字图像处理灰度化直方图均衡化灰度拉伸.doc

相关文档

文档介绍

文档介绍:数字图像处理与模式识别
实验目的
打开一幅图像,进行直方图均衡化。并将其灰度线性变化,将灰度线性拉伸。
实验准备
实验之前,收集数字图像处理编程的相关资料,查阅C或Java关于本实验图像处理的相关类库和编程核心。经过C和Java相关资料编程的比较,Java将图像处理的类封装的较完整,运用起来比C灵活方便。以下是相关类库和实现操作的方法:
import .*;
import .*; //相关的图像处理类库和方法封装在两个包中
//Java读取图像的方法
BufferedImage newImage = (new File(filePath));
int width = (); //获得图像的像素宽度
int height = (); //获得图像像素的长度
//获得图像的色彩模型RGB分量
ColorModel colorModel = ();
int r = (currPixArray[k]);
int g = (currPixArray[k]);
int b = (currPixArray[k]); //分别获得图像的rgb分量
PixelGrabber p = new PixelGrabber(image, 0, 0, width, height, array, 0, width); //将image图像像素值读入一位矩阵
实验步骤
算法实现
RGB图像转灰度图
由于数字图像的直方图均衡化和灰度的线性拉伸都是基于灰度图的算法实现,本框架中增加了由彩***转灰度图的功能。简单讲述下算法思想:将存储图像的一维矩阵像素点彩色分量用ColorModel类中的getRed(),getGreen()和getBlue()方法读取,按照(
r * + g * + b * )公式计算灰度值。
部分关键代码如下:
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
k = i * width + j;
r = (currPixArray[k]);
g = (currPixArray[k]);
b = (currPixArray[k]);
gray = (int) (r * + g * + b * );
r = g = b = gray;
grayArray[k] = (255 << 24) | (r << 16) | (g << 8) | b;
}
}
测试效果:

原图灰度图
直方图均衡化
一幅数字图像存在一个灰度范围,每个像素都有不同的灰度值,因此每个灰度级别出现的概率都会有所不同。直方图的均衡化就是将每个灰度级出现的概率尽量均匀的分布在灰度范围之内(实际操作不可能完全均匀分布),达到图像增强,图像信息最多的效果。
首先进行每个灰度级别(0-255)出现的在数字图像的概率,然后通过概率累计的方式将离散的概率值进行累加,得到新的灰度级别的概率进行均匀分布在灰度范围内,修改更新数字图像一维像素矩阵的的灰度值,便可达到直方图均衡化的效果。(Java具体实现还应注意些小细节,代码中的注释将给出) 核心代码如下:
int grayLevel; // 每个像素的灰度级
int[] grayArray = new int[256]; // 记录每个灰度级出现的像素数量
int[] resPixArray = new int[width * height]; // 均衡化之后的新像素矩阵
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
grayLevel = currPixArray[i * width + j] & 0xff; // 后8位为该像素的灰度级
grayArray[grayLevel]++;
}
}
double[] p = new double[256]; // 记录每个灰度级的出现的概率
for (int i = 0; i < 256; i++)
p[i] = (double) grayA