clear
g=imread('C:\Users\hp\Desktop\1.jpg'); %读取原始图像
[row,col]=size(g); %获取图像高度row,宽度col
g=imnoise(g,'gaussian',0,0.005); %添加高斯噪声
g=g+1; %修改像素范围
I=g(:,:,1); %初始化原始图像矩阵
J=g(:,:,1); %初始化直方图均衡结果矩阵
JJ=g(:,:,1); %初始化双向直方图均衡结果矩阵
L=256; %灰度级
Ps=zeros(L,1); %出现频率%统计直方图结果数据
nK=zeros(L,1); %初始化原始图像灰度统计数组
nK2=zeros(L,1); %初始化直方图均衡图像灰度统计数组
nK3=zeros(L,1); %初始化双向直方图均衡图像灰度统计数组
[row,col]=size(I);
%直方图均衡化
n=row*col; %总像素个数
for i =1:row
for j =1:col
num=double(I(i,j)+1); %获取像素点灰度级
nK(num)=nK(num)+1; %统计nK
end
end
for i =1;L
Ps(i)=nK(i)/n; %统计直方图概率估计
end
S(1)=1;
for i=2:L
S(i)=S(i-1)+Ps(i)*L; %建立直方图均衡化查表S
end
for i=1:row
for j= 1:col
J(i,j)=S(g(i,j)); %得到均衡化像素值
end
end
num=0;
for i=1:row
for j=1:col
num=(double),(J(i,j)); %获取像素点灰度级
nK2(num)=nK2(num)+1; %统计nK
end
end
%双向均衡化
count=0;
intv=zeros(L,1);
for i=1:L
if(nK2(i)>0)
count=count+1;
intv(i)=count; %获取像素有效值在其中的位置
end
end
lut=zeros(L,1);
for i=1:L
lut(i)=256/count*intv(i); %建立查找表
end
for i=1:row
for j=1:col
JJ(i,j)=lut(J(i,j)); %得到双向直方图均衡化像素值
end
end
num=0;
for i=1:row
for j=1:col
num=double(JJ(i,j))+1; %获取像素点灰度级
nK3(num)=nK3(num)+1; %统计nK
end
end
%绘制输出结果
subplot(3,2,1);imshow(I),title('(a)原图');
subplot(3,2,2);bar(nK),title('(b)原图直方图');
subplot(3,2,3);imshow(J),title('(c)均衡化');
subplot(3,2,4);bar(nK2),title('(d)均衡化直方图');
subplot(3,2,5);imshow(JJ),title('(e)双向均衡化');
subplot(3,2,6);bar(nK3),title('(f)双向均衡化直方图');
%计算MEAN、MES、PSNR值
A=I;
B=abs(J);
PSNR(double(A./max(max(A))),double(B./max(max(B))));
??? Error using ==> double
Not enough input arguments.