Step6. 对灰度值进行映射(均衡化)
(利用图像的局部区域,如局部均值,方差。梯度获取不同区域的差异情况,从而对图像不同区域进行不同的增值。常用直方图变化。)
因为图像有相同的内容,直方图均衡导致的对比度增强足以补偿图像在视觉上难以区分灰度级的差别。在给出原始图像间的重要对比度差别后,说明了直方图均衡作为自适应对比度增强工具的强大作用。
从上图可以看到,上图中增强图像的放大图像是放大f(x,y)的值至范围之外形成g(x,y)而构成的一幅图像,相对于黑暗部分的是1,相对于明亮部分的是E,暗点表示在该坐标处增强过程没有放大像素值,亮点表示产生了一个增强的像素值。该图像是二值图像。
局部增强能够增强暗色区域,同时尽可能保留明亮区域不变。从图中可以看出,原始图像中央的钨丝及其支架很清晰但图像的右侧有另一根钨丝的结构,通过局部增强使其细节变得清楚。
clear all
clc
A = imread('C:\Users\Administrator\Desktop\123.bmp');
figure
subplot(221);
I=rgb2gray(A);
imshow(I);
title('原始图像');
[height,width] = size(I);
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)+1);
end
end
subplot(223);
imshow(I);
title('直方图均衡化后的灰度图像');
subplot(224);
imhist(I);
title('均衡化后的直方图');
% Igray:灰度图像
% k0,k1:可调参数
% Ibw:提取得到数字区域
Igray=imread('C:\Users\Administrator\Desktop\10.bmp');
%=rgb2gray(a);
k0=0.3;
k1=0.01;
E=4;
masksize = 3; % 邻域范围,奇数
exsize = floor(masksize/2); % 原图片需要填充的区域
Iex = padarray(Igray, [exsize exsize], 'replicate', 'both'); % 图片填充
Is = zeros(size(Igray)); % 局部标准差
for i = 1:size(Igray, 1)
for j = 1:size(Igray, 2)
subdomain = Iex(i:i+2*exsize, j:j+2*exsize);
localmean = sum(subdomain(:))/masksize^2;
Is(i, j) = sqrt(sum((subdomain(:)-localmean).^2))/masksize;
end
end
% 确定不同区域的放大系数
meanIm = mean(Igray(:));
minIm = min(Igray(:));
meanIs = mean(Is(:));
maxIs = max(Is(:));
Im1 = Igray<(minIm+k0*(meanIm-minIm)); % 均值阈值提取
Is1 = Is>(meanIs + k1*(maxIs-meanIs)); % 标准差阈值提取
s = strel('disk',8); % 8需要根据实际图片大小来调
Is1 = imclose(Is1, s); % 标准差阈值提取闭运算
Ibw = Im1 & Is1; % 局部增强
figure(1)
imshow(Ibw);title('增强图像的放大图像');
Ibw2=Ibw.*(E-1)+1;
for i = 1:size(Igray, 1)
for j = 1:size(Igray, 2)
P(i,j)=Ibw2(i,j).*Igray(i,j);
end
end
figure(2)
imshow(P);title('增强的SEM图像');
figure(3)
imshow(Igray);title('局部增强原始图像');