您的位置:首页 > 其它

图像预处理与特征提取(1)——白化处理和直方图均衡化

2015-12-05 16:18 162 查看
我们从逐像素处理来开始讲诉图像预处理。我们将代表原始图像的二维矩阵标记为P ,其中的p ij 代表第i 行和第j 列的像素值,代表该像素点的灰度强度。逐像素处理返回的就是和P 尺寸大小一样包含x ij 的二维矩阵X 。

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('均衡化后直方图')


直方图均衡化效果图:



从均衡化后图像可以看出对比度比原始图像增强了,而且直方图显示更均衡。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息