图像预处理与特征提取(1)——白化处理和直方图均衡化
2015-12-05 16:18
162 查看
我们从逐像素处理来开始讲诉图像预处理。我们将代表原始图像的二维矩阵标记为P ,其中的p ij 代表第i 行和第j 列的像素值,代表该像素点的灰度强度。逐像素处理返回的就是和P 尺寸大小一样包含x ij 的二维矩阵X 。
μ=∑ I i=1 ∑ J j=1 p ij IJ (1)
δ 2 =∑ I i=1 ∑ J j=1 (p ij −μ) 2 IJ (2)
接下来我们将使用μ 和δ 来对原始灰度图像的每个像素值进行转化:
x ( ij)=p ij −μδ (3)
对于彩色图像,我们需要在三个通道分别计算μ 和δ 2 ,然后根据公式(3)分别进行像素转化。
当然这种简单的转换可能会妨碍之后的图像处理,因为这些去除的信息有可能就是我们接下来需要的。
下面我们通过一段代码来展示一下白化处理的效果。
原始图像:
白化处理后的图像:
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。下面介绍直方图均衡化的做法:
首先计算原始强度h 的直方图。我们可以先对原始图像的灰度情况进行统计分析,该统计方法可以根据一下公式计算:
h k =∑ i=1 I ∑ j=1 J δ[p ij −k]
其中δ[⋅] 满足:
δ[x]={1,x=00,otherwise
其实也就是分别统计像素值从0到K 的个数。这就完成了直方图统计。
然后我们再利用累计分布函数(cumulative distribution function,CDF)去计算累计比例c 。
c k =∑ k l=1 h l IJ
最后我们计算累积直方图。
x ij =Kc p ij
从上式我们可以看出x ij 是连续的不是离散的,所以我们需要在实际的操作中将x ij 近似到最近的整数。通常K 取255.
下面我们通过一段代码来展示直方图均衡化的效果。
直方图均衡化效果图:
从均衡化后图像可以看出对比度比原始图像增强了,而且直方图显示更均衡。
1.Whitening(白化处理)
一幅图像最终成像会受环境照明强度、物体反射、拍摄相机等多因素的影响。为了能够图像的中包含的那些不受外界影响的恒定信息,我们需要对图像进行白化处理。一般为了去除这些因素的影响,我们将它的像素值转化成零均值和单位方差。所以我们首先计算原始灰度图像P 的像素平均值μ 和方差值δ 2 。μ=∑ I i=1 ∑ J j=1 p ij IJ (1)
δ 2 =∑ I i=1 ∑ J j=1 (p ij −μ) 2 IJ (2)
接下来我们将使用μ 和δ 来对原始灰度图像的每个像素值进行转化:
x ( ij)=p ij −μδ (3)
对于彩色图像,我们需要在三个通道分别计算μ 和δ 2 ,然后根据公式(3)分别进行像素转化。
当然这种简单的转换可能会妨碍之后的图像处理,因为这些去除的信息有可能就是我们接下来需要的。
下面我们通过一段代码来展示一下白化处理的效果。
白化处理matlab代码
clear,clc,close all; I = imread('rice.png'); [m,n] = size(I); P = reshape(I,m*n,1); P = single(P); mu = mean(P); va = var(P); for i=1:m for j=1:n X(i,j)=(double(I(i,j))-mu)/sqrt(va); end end figure,imshow(I) figure,imshow(X)
原始图像:
白化处理后的图像:
2.Histogram equalization(直方图均衡化)
如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像原取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。下面介绍直方图均衡化的做法:
首先计算原始强度h 的直方图。我们可以先对原始图像的灰度情况进行统计分析,该统计方法可以根据一下公式计算:
h k =∑ i=1 I ∑ j=1 J δ[p ij −k]
其中δ[⋅] 满足:
δ[x]={1,x=00,otherwise
其实也就是分别统计像素值从0到K 的个数。这就完成了直方图统计。
然后我们再利用累计分布函数(cumulative distribution function,CDF)去计算累计比例c 。
c k =∑ k l=1 h l IJ
最后我们计算累积直方图。
x ij =Kc p ij
从上式我们可以看出x ij 是连续的不是离散的,所以我们需要在实际的操作中将x ij 近似到最近的整数。通常K 取255.
下面我们通过一段代码来展示直方图均衡化的效果。
直方图均衡化matlab代码
clear,clc,close all; %直方图均衡化 I = imread('rice.png'); [height,width] = size(I); figure subplot(221) imshow(I)%显示原始图像 title('原始图像') subplot(222) imhist(I)%显示原始图像直方图 title('原始图像直方图') %进行像素灰度统计; NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级 for i = 1:height for j = 1: width NumPixel(I(i,j) + 1) = NumPixel(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一 end end %计算灰度分布密度 ProbPixel = zeros(1,256); for i = 1:256 ProbPixel(i) = NumPixel(i) / (height * width * 1.0); end %计算累计直方图分布 CumuPixel = zeros(1,256); for i = 1:256 if i == 1 CumuPixel(i) = ProbPixel(i); else CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i); end end %累计分布取整 CumuPixel = uint8(255 .* CumuPixel + 0.5); %对灰度值进行映射(均衡化) for i = 1:height for j = 1: width I(i,j) = CumuPixel(I(i,j)); end end subplot(223) imshow(I)%显示原始图像均衡化后图像 title('均衡化后图像') subplot(224) imhist(I)%显示原始图像直方图均衡化后直方图 title('均衡化后直方图')
直方图均衡化效果图:
从均衡化后图像可以看出对比度比原始图像增强了,而且直方图显示更均衡。
相关文章推荐
- Linux驱动程序中的platform总线详解
- POJ 1337
- 杭电ACM2501——Tiling_easy version
- 第二章 使用SQLite数据库
- 热带水果的收藏(三亚)
- iOS开发——监听耳机状态(是否插入)
- matlab之reshape函数
- P53 T2
- HDOJ--2674--N!Again
- Linux系统分区建议
- linux xargs命令的使用及其与exec、管道的区别
- python编码检测模块chardet
- PHP面向对象1.5 继承
- 【JSP】修改网页ico小图标
- C#声明数组并初始化,有三种方式
- c++ bitset
- 如何写软件概要设计?
- Centos 安装 redis
- emment语法搜集
- 正则表达式学习2