转自:http://blog.csdn.net/abcjennifer/article/details/6667504
首先转为灰度图,然后均衡化,详见代码
- sourcePic=imread('D:\Images\pic_loc\1870358810205041517.jpg');
- [m,n,o]=size(sourcePic);
- grayPic=rgb2gray(sourcePic);
- figure,imshow(sourcePic);
- figure,imshow(grayPic);
- gp=zeros(1,256); %计算各灰度出现的概率
- for i=1:256
- gp(i)=length(find(grayPic==(i-1)))/(m*n);
- end
- figure,bar(0:255,gp);
- title('原图像直方图');
- xlabel('灰度值');
- ylabel('出现概率');
- newGp=zeros(1,256); %计算新的各灰度出现的概率
- S1=zeros(1,256);
- S2=zeros(1,256);
- tmp=0;
- for i=1:256
- tmp=tmp+gp(i);
- S1(i)=tmp;
- S2(i)=round(S1(i)*256);
- end
- for i=1:256
- newGp(i)=sum(gp(find(S2==i)));
- end
- figure,bar(0:255,newGp);
- title('均衡化后的直方图');
- xlabel('灰度值');
- ylabel('出现概率');
- newGrayPic=grayPic; %填充各像素点新的灰度值
- for i=1:256
- newGrayPic(find(grayPic==(i-1)))=S2(i);
- end
- figure,imshow(newGrayPic);
当然,有时候我们不禁想得到一幅图的灰度直方图均衡化结果,而是希望得到彩色图均衡化结果,那么就需要先将彩色图分为RGB分量,代码如下:
- sourcePic=imread('D:\Images\pic_loc\1870358810205041517.jpg');
- [m,n,o]=size(sourcePic);
- figure,imshow(sourcePic,[]);
- %grayPic=rgb2gray(sourcePic);
- grayPic=sourcePic(:,:,1);
- gp=zeros(1,256); %计算各灰度出现的概率
- for i=1:256
- gp(i)=length(find(grayPic==(i-1)))/(m*n);
- end
- newGp=zeros(1,256); %计算新的各灰度出现的概率
- S1=zeros(1,256);
- S2=zeros(1,256);
- tmp=0;
- for i=1:256
- tmp=tmp+gp(i);
- S1(i)=tmp;
- S2(i)=round(S1(i)*256);
- end
- for i=1:256
- newGp(i)=sum(gp(find(S2==i)));
- end
- newGrayPic=grayPic; %填充各像素点新的灰度值
- for i=1:256
- newGrayPic(find(grayPic==(i-1)))=S2(i);
- end
- nr=newGrayPic;
- grayPic=sourcePic(:,:,2);
- gp=zeros(1,256); %计算各灰度出现的概率
- for i=1:256
- gp(i)=length(find(grayPic==(i-1)))/(m*n);
- end
- newGp=zeros(1,256); %计算新的各灰度出现的概率
- S1=zeros(1,256);
- S2=zeros(1,256);
- tmp=0;
- for i=1:256
- tmp=tmp+gp(i);
- S1(i)=tmp;
- S2(i)=round(S1(i)*256);
- end
- for i=1:256
- newGp(i)=sum(gp(find(S2==i)));
- end
- newGrayPic=grayPic; %填充各像素点新的灰度值
- for i=1:256
- newGrayPic(find(grayPic==(i-1)))=S2(i);
- end
- ng=newGrayPic;
- grayPic=sourcePic(:,:,3);
- gp=zeros(1,256); %计算各灰度出现的概率
- for i=1:256
- gp(i)=length(find(grayPic==(i-1)))/(m*n);
- end
- newGp=zeros(1,256); %计算新的各灰度出现的概率
- S1=zeros(1,256);
- S2=zeros(1,256);
- tmp=0;
- for i=1:256
- tmp=tmp+gp(i);
- S1(i)=tmp;
- S2(i)=round(S1(i)*256);
- end
- for i=1:256
- newGp(i)=sum(gp(find(S2==i)));
- end
- newGrayPic=grayPic; %填充各像素点新的灰度值
- for i=1:256
- newGrayPic(find(grayPic==(i-1)))=S2(i);
- end
- nb=newGrayPic;
- res=cat(3,nr,ng,nb);
- figure,imshow(res,[]);