好了,不说这么多了,直奔主题,本次分别做了两次实现,分别是:彩色图片转灰度图直方图均衡化处理以及彩色图片的直方图均衡化处理,大家可以按需观看。
一、程序源码
(1)彩色图片转灰度图直方图均衡化处理:
%读取图片
I=imread('test.jpg');
%将图片转化成灰度图片
I=rgb2gray(I);
%显示原图像
figure(4),imshow(I);
%获得灰度图的长和宽
[M,N]=size(I);
%做直方图均衡化处理,设置初始参数
average=0;
%做直方图均衡化处理,创建映射区域
A=zeros(1,256);
%获得每一个点的灰度值,并判断其值等于多少
for k=1:256
count=0;
for i=1:M
for j=1:N
value=I(i,j);
%统计灰度值
if value==k
count=count+1;
end
end
end
%画出图像灰度直方图
figure(1),line([k,k],[0,count]);
%直方图均衡化处理
count=count/(M*N*1.0);
average=average+count;
%获得灰度映射
A(k)=average;
%画出均衡化后的直方图
figure(2),line([k,k],[0,average]);
end
%累计分布取整,+0.5等于四舍五入,也就是取整
A=uint8(255.*A+0.5);
%进行直方图反映射,得到处理后的原图像
for i=1:M
for j=1:N
I(i,j)=A(I(i,j));
end
end
%展示处理后图像
figure(3),imshow(I);
(2)彩色图片的直方图均衡化处理
彩色图片的直方图均衡化处理与灰度图的处理方法一样,不同的地方在于要分别把R、G、B层做一次处理,也就是处理三次,而灰度图像就只需要处理灰度值就行,这就是两者唯一的不同。因此,原理懂了,就不难实现了
%读取图片
I=imread('test.jpg');
figure(7),imshow(I);
%获取图片的长、宽和层数(其实等于三,R、G、B三层)
[M,N,G]=size(I);
result=zeros(M,N,3);
%获得每一层每一个点的RGB值,并判断其值等于多少
for g=1:3
A=zeros(1,256);
%每处理完一层,参数要重新初始化为0
average=0;
for k=1:256
count=0;
for i=1:M
for j=1:N
value=I(i,j,g);
if value==k
count=count+1;
end
end
end
figure(g),line([k,k],[0,count]);
count=count/(M*N*1.0);
average=average+count;
A(k)=average;
figure(g+3),line([k,k],[0,average]);
end
A=uint8(255.*A+0.5);
for i=1:M
for j=1:N
I(i,j,g)=A(I(i,j,g)+0.5);
end
end
end
%展示处理效果
figure(8),imshow(I);
以上,就是如何运用line()函数来画直方图以及如何通过对直方图进行处理来处理图片的运用啦。个人觉得不足的地方在于for循环用的有些多,程序看起来有点臃肿,希望有大神能够指点一二。