clear all;
close all;
clc;
I=[1 5 255 255 100 200 255 200;
17 254 255 100 10 10 9;
37 10 100 100 2 9 6;
36 10 10 9 2 8 2;
21 8 8 9 3 4 2;
10 7 8 8 3 2 1;
11 8 8 7 2 2 1;
23 9 8 7 2 2 0]
% I=imread('Fig36.bmp');
% %I=rgb2gray(I);
% figure(3)
% imshow(I);
[m,n]=size(I)
I1=max(I);%求每一列的最大值
Imax=max(I1)%求出最大的值
I3=min(I);%求每一列的最小值
Imin=min(I3)%求出最小的值
k(Imax-Imin)=4;
hs(Imax-Imin)=5;
p=0
for p=Imin:Imax-1
for j=1:n
for i=1:m
if I(i,j)==p
k(p+1)=k(p+1)+1;
end
end
end
p=p+1;
%画出原始图像的直方图
figure(1)
bar(p,k(p));hold on;
%计算出原始图像的每个像素值的概率
hs(p)=k(p)/(m*n);
sum(hs);
end
%计算图像各像素的灰度累计分布hp
hp(Imax-Imin)=0;
hp(1)=hs(1);
for x=2:(Imax-Imin)
hp(x)=hs(x)+sum(hp(x-1));
if hs(x)==0
hp(x)=0;
end
end
hp(255)=1
%求新图像的灰度值
for y=1:(Imax-Imin)
g(y)=255*hp(y);
%画出均衡后的图像的直方图
figure(2)
bar(y,g(y));hold on;
end
步骤总结:
直方图均衡示例
以上错误:现将代码更正为:
clear all;
close all;
clc;
% I=[1 5 255 255 100 200 255 200;
% 1 7 254 255 100 10 10 9;
% 3 7 10 100 100 2 9 6;
% 3 6 10 10 9 2 8 2;
% 2 1 8 8 9 3 4 2;
% 1 0 7 8 8 3 2 1;
% 1 1 8 8 7 2 2 1;
% 2 3 9 8 7 2 2 0]
I=imread('Fig36.bmp');
%I=rgb2gray(I);
figure(4)
imshow(I);
[m,n]=size(I)
I1=max(I);%求每一列的最大值
Imax=max(I1)%求出最大的值
I3=min(I);%求每一列的最小值
Imin=min(I3)%求出最小的值
k=zeros(1,256);
hs=zeros(1,256);
for p=1:256
k(p)=length(find(I==(p-1)));
%计算出原始图像的每个像素值的概率
hs(p)=k(p)/(m*n);
sum(hs);
p=p+1;
end
%画出原始图像的直方图
figure(1)
bar(0:255,hs);hold on;
title('原图像直方图');
xlabel('灰度值');
ylabel('出现概率');
%计算图像各像素的灰度累计分布hp
hp=zeros(1,256);
hp(1)=hs(1);
for x=2:256
hp(x)=hs(x)+sum(hp(x-1));
end
%求新图像的灰度值
for y=1:256
g(y)=round(256*hp(y));
newGp(y)=sum(hs(find(g==y)));
end
g
newGp
%画出均衡后的图像的直方图
figure(2)
bar(0:255,newGp);
title('均衡化后的直方图');
xlabel('灰度值');
ylabel('出现概率');
newI=I; %填充各像素点新的灰度值
for i=1:256
newI(find(I==(i-1)))=g(i);
end
figure(3)
imshow(newI);