直方图均衡化代码:
第一种:
%对一幅图像进行直方图均衡化
A=imread('d:\Gem.bmp');
[m,n]=size(A);
B=zeros(size(A));
l=m*n;
r=zeros(1,256);
y=zeros(1,256);
A=double(A);
for i=1:m
for j=1:n
r(A(i,j)+1)=r(A(i,j)+1)+1;
end
end
r=r./l;%得到原图像各灰度级所占的比例
for k=1:256
for j=1:k
y(k)=y(k)+r(j);
end
end %直方图累加
for k=1:256
y(k)=floor(255*y(k)+0.5); %确定映射关系
end
for i=1:m
for j=1:n
B(i,j)=y(A(i,j)+1);
end
end
A=uint8(A);
B=uint8(B);
subplot(2,2,1)
imshow(A);
title('原图像')
subplot(2,2,2)
imhist(A);
title('原图像的直方图')
subplot(2,2,3)
imshow(B);
title('经过均衡处理的图像')
subplot(2,2,4)
imhist(B);
title('经过均衡处理后该图像的直方图')
第二种:
>> A=imread('d:\gem.bmp'); %读入JPG彩色图像文件
>> I=rgb2gray(A); %灰度化后的数据存入数组
>> subplot(2,2,1),imshow(I);title('原始图像 Gem');
>> %二,绘制直方图
>> [m,n]=size(I); %测量图像尺寸参数
>> GP=zeros(1,256); %预创建存放灰度出现概率的向量
>> for k=0:255
GP(k+1)=length(find(I==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置
end
>> subplot(2,2,2),bar(0:255,GP,'g');title('原始图像的直方图')
>> xlabel('灰度值')
>> ylabel('出现概率') %绘制直方图
>> %三,直方图均衡化
>> S1=zeros(1,256);
>> for i=1:256
for j=1:i
S1(i)=GP(j)+S1(i); %计算Sk 累计直方图概率
end
end
>> S2=round(S1*256); %将Sk归到相近级的灰度
>> for i=1:256
GPeq(i)=sum(GP(find(S2==i))); %计算现有每个灰度级出现的概率
end
>> subplot(2,2,3),bar(0:255,GPeq,'b');title('均衡化后的直方图')
>> xlabel('灰度值')
>> ylabel('出现概率') %显示均衡化后的直方图
>> %四,图像均衡化
>> PA=I;
>> for i=0:255
PA(find(I==i))=S2(i+1); %将各个像素归一化后的灰度值赋给这个像素
end
>> subplot(2,2,4),imshow(PA);title('均衡化后图像') %显示均衡化后的图像
>> figure(2),plot(0:255,S2,'r');legend('灰度变化曲线') %显示灰度变化曲线
>> xlabel('原图像灰度级')
>> ylabel('均衡化后灰度级')
>>
第三种:
%%%%%%%%%%%%灰度图象的直方图数据
clc
clear
fn='rice.tif';
I=imread (fn);
J=I;
%计算灰度图象的直方图数据
L=256; %灰度级
Ps = zeros(L,1); %统计直方图结果数据
nk=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
figure;
subplot(3,1,1);imshow(J),title('原图');
subplot(3,1,2),plot(nk),title('直方图(nk)');
subplot(3,1,3),plot(Ps),title('直方图(Ps)');
%figure(4),imhist(hist);
%p=imhist(hist); %生成直方图函数,返回灰度图象直方图数据
%figure(5),plot(p);
直方图规定化代码:
第一种:matlab实现的
请看work 文件夹
后面的两种都是VC++实现的,
由于字数有限,我会把代码和报告文件上传到下面的地址(由于服务器暂时不能上传,请等待)
报告和代码完整版下载:
报告下载: http://ctfysj.gbaopan.com/files/d4773fe340724aed93995c28400e018b.gbp
代码下载: http://ctfysj.gbaopan.com/files/908f9f52959e4a538f84c75ca4c6948f.gbp
或者下载页面: http://tel4.800disk.com/ContentPane.aspx?down=ok&filename
第二种:
double scrMin[256][256];
for(y=0 ;y<256 ;y++)
for(x=0;x<256;x++)
scrMin[x][y]=fabs(GP[y]-GPeq[x]);
/*SML映射
for(y=0 ;y<256 ;y++)
{
int minX=0;
double minValue=scrMin[0][y];
for(x=1;x<256;x++)
{
if(minValue>scrMin[x][y])
{
minValue=scrMin[x][y];
minX=x;
}
}
HistogramSpeciMapping[y]=minX;//建立映射关系
}
/*GML映射
short lastStartY=0,lastEndY=0,startY=0,endY=0;
for(x=0;x<256;x++)
{
double minValue=scrMin[x][0];
for (y=0 ;y<256 ; y++ )
{
if (minValue>scrMin[x][y])
{
endY=y;
minValue=scrMin[x][y];
}
}
if(startY!=lastStartY || endY! =lastEndY)
{
for(i=startY;i<=endY;i++)
HistogramSpeciMapping[i]=x;//建立映射关系
lastStartY=startY;
lastEndY=endY;
startY=lastEndY+1;
}
}
第三种:
void main()
{
BMPFILE bmpfile;
bmpfile.LoadBMPFILE ("实验图象1.bmp");
if(!bmpfile.bIsOk)
{
printf("Error loading image.\n");
return;
}
// do other processing with the imagedata
int H[256]; //原始图象直方图
memset(H,0,sizeof(H));
int S[256]; //变换映射-均衡直方图S
double psnr; //峰值信噪比
int i;
int f;
for(i=0;i<bmpfile.imageh*bmpfile.imagew;i++)
H[*(bmpfile.imagedata+i)]++;
S[0]=H[0];
for(i=1;i<256;i++)
S[i]=S[i-1]+H[i];
for(i=0;i<256;i++)
S[i]=S[i]*255/(bmpfile.imageh*bmpfile.imagew);
for(i=0;i<bmpfile.imageh*bmpfile.imagew;i++)
*(bmpfile.imagedata+i)=S[*(bmpfile.imagedata+i)];
// r(A(i,j)+1)=r(A(i,j)+1)+1; B(i,j)=y(A(i,j)+1);
//原图象的直方图H
printf("H: ");
for(i=1;i<256;i++)
printf("%d ",H[i]);
printf("\n");
//原图象(直方图H)的均衡直方图
printf("S: ");
for(i=1;i<256;i++)
printf("%d ",S[i]);
printf("\n");
//均衡图象
bmpfile.SaveBMPFILE ("实验图象1-均衡图象.bmp");
//PSNR值
psnr=0;
for(i=0;i<255;i++)
psnr+=(S[i]-i)*(S[i]-i)*H[i];
psnr=10*log10(double(bmpfile.imageh)*bmpfile.imagew*255*255/psnr);
printf("PSNR: %f\n",psnr);
//均衡图象 =psnr
//目标直方图G的均衡直方图
int G[256]; //规定直方图
int GS[256]; //规定直方图的均衡直方图
for(i=0;i<=127;i++)
G[i]=i;
for(i=128;i<=255;i++)
G[i]=(255-i);
GS[0]=G[0];
for(i=1;i<256;i++)
GS[i]=GS[i-1]+G[i];
f=GS[255]/255+1;
for(i=0;i<256;i++)
GS[i]/=f;
printf("GS: ");
for(i=1;i<256;i++)
printf("%d ",GS[i]);
printf("\n");
//最终增强图象
int i2;
int minNumber;
int SG[256]; //从原图象的均衡图象到最终增强图象的映射
memset(SG,0,sizeof(SG));
for(i=0;i<256;i++)
{
minNumber=255;
for(i2=0;i2<256;i2++)
if(abs(S[i]-GS[i2])<minNumber)
{
minNumber=abs(S[i]-GS[i2]);
SG[S[i]]=i2;
}
}
for(i=0;i<bmpfile.imageh*bmpfile.imagew;i++)
*(bmpfile.imagedata+i)=SG[*(bmpfile.imagedata+i)];
bmpfile.SaveBMPFILE ("实验图象1-最终增强图象.bmp");
//最终增强图象的直方图GR R=real
int GR[256];
memset(GR,0,sizeof(GR)); // SG清零 将指定内存地址设为某值'
for(i=1;i<256;i++)
GR[SG[S[i]]]+=H[i];
printf("GR: ");
for(i=1;i<256;i++)
printf("%d ",GR[i]);
printf("\n");
//最终增强图象的PSNR值
psnr=0;
for(i=0;i<255;i++)
psnr+=(SG[S[i]]-i)*(SG[S[i]]-i)*GR[i];
psnr=10*log10(double(bmpfile.imageh)*bmpfile.imagew*255*255/psnr);
printf("PSNR of the destination image: %f\n",psnr);
}