数字图像处理实验(1)——直方图均衡化
数字图像处理实验(1)——直方图均衡化实验题目:编程实现灰度和彩色图像的直方图均衡化处理。要求给出原始图像的直方图、均衡化图像及其直方图和直方图均衡化时所用的灰度级变换曲线图。注意彩色图像需要编程实现图像由RGB色彩空间到HSI的变换,然后在亮度通道上进行直方图均衡化。源码:对灰度图像的处理,给出原始图像的直方图、均衡化图像及其直方图和直方图均衡化时所用的灰度级变换曲线图// 灰度图像...
·
实验题目:
编程实现灰度和彩色图像的直方图均衡化处理。要求给出原始图像的直方图、均衡化图像及其直方图和直方图均衡化时所用的灰度级变换曲线图。注意彩色图像需要编程实现图像由RGB色彩空间到HSI的变换,然后在亮度通道上进行直方图均衡化。
源码:
对灰度图像的处理,给出原始图像的直方图、均衡化图像及其直方图和直方图均衡化时所用的灰度级变换曲线图
// 灰度图像
clear
%读入彩色图像将其灰度化
pic=imread('grey.png');
imshow(pic) %显示出来
title('输入的灰色png图像')
%绘制直方图
[m,n]=size(pic); %测量图像尺寸参数
GP=zeros(1,256); %预创建存放灰度出现概率的向量
N=zeros(1,256);
for k=0:255
N(k+1) = length(find(pic==k));
GP(k+1)=length(find(pic==k))/(m*n); % 计算每级灰度出现的概率,将其存入 GP 中相应位置
end
figure,bar(0:255,GP,'b') %绘制直方图title('原图像直方图')
xlabel('灰度值')
ylabel('出现概率')
%直方图均衡化
CF=zeros(1,256);
for i=1:256
for j=1:i
CF(i)=GP(j)+CF(i); %计算 Sk
end
end
S2=round((CF*256)+0.5); %将 Sk 归到相近级的灰度
for i=1:256
GPeq(i)=sum(GP(find(S2==i))); %计算现有每个灰度级出现的概率
end
figure,bar(0:255,GPeq,'b') %显示均衡化后的直方图title('均衡化后的直方图')
xlabel('灰度值')
ylabel('出现概率')
%图像均衡化
PA=pic;
for i=0:255
PA(find(pic==i))=S2(i+1); %将各个像素归一化后的灰度值赋给这个像素
end
figure,imshow(PA)
%绘制灰度级变换曲线
figure
plot(0:255,S2,'r')
xlabel('均值化前')
ylabel('均值化后')
grid on
legend('灰度级变换曲线');
对彩色图像的处理,给出原始图像的直方图、均衡化图像及其直方图和直方图均衡化时所用的灰度级变换曲线图。注意彩色图像需要编程实现图像由RGB色彩空间到HSI的变换,然后在亮度通道上进行直方图均衡化。
// 彩色图像
function pic2()
clear;
pic=imread('color.jpg'); %读入 JPG 彩色图像文件
imshow(pic) %显示出来
title('原图像');
[M,N,D] = size(pic);
%提取单通道分量
pic=double(pic);
r=pic(:,:,1);
g=pic(:,:,2);
b=pic(:,:,3);
%实现转换
angle=acos(0.5*((r-g)+(r-b))./(sqrt((r-g).^2+(r-b).*(g-b))));
if (b>=g)
H = 2*pi-angle;
else
H = angle;
end
H=H/(2*pi);
S=1-3.*(min(min(r,g),b))./(r+g+b);
H(S==0)=0;
I=(r+g+b)/3;
I=uint8(I);%范围不超[0,255]
%统计像素亮度
INumPixel = zeros(1,256);%用长度为256的一维数组统计各灰度值的数目
for i = 1:M
for j = 1: N
INumPixel(I(i,j) + 1) = INumPixel(I(i,j) + 1) + 1;
end
end
%亮度直方图
GP = zeros(1,256);
for i = 1:256
GP(i) = INumPixel(i) / (M * N * 1.0);
end
figure,bar(0:255,GP,'b') %绘制直方图title('原图像直方图')
xlabel('亮度值')
ylabel('出现概率')
%直方图均衡化
S2 = zeros(1,256);
for i = 1:256
if i == 1
S2(i) = GP(i);
else
S2(i) = S2(i - 1) + GP(i);
end
end
%将S2乘上最大灰度255并且向上取整
S2 = uint8(255 .* S2 + 0.5);
%将原图像各个位置灰度值映射到新值
for i = 1:M
for j = 1: N
Inew(i,j) = S2(I(i,j)+1);
end
end
for i=1:256
GPeq(i)=sum(GP(find(S2==i))); %计算现有每个灰度级出现的概率
end
figure
plot(0:255,GPeq,'b') %显示均衡化后的直方图title('均衡化后的直方图')
xlabel('亮度值')
ylabel('出现概率')
%绘制亮度级变换曲线
figure
plot(0:1:255,S2,'r')
xlabel('均值化前')
ylabel('均值化后')
grid on
legend('亮度级变换曲线');
I=Inew;
H=H*2*pi;
I=double(I);
S=double(S);
H=double(H);
[m,n]=size(H);
%转换
for i = 1:m
for j = 1:n
if (0<=H(i,j))&(H(i,j)<2*pi/3)
B(i,j)=I(i,j).*(1-S(i,j));
R(i,j)=I(i,j).*(1+S(i,j).*cos(H(i,j))./cos(pi/3-H(i,j)));
G(i,j)=3*I(i,j)-(R(i,j)+B(i,j));
end
if (2*pi/3<=H(i,j))&(H(i,j)<4*pi/3)
H(i,j)=H(i,j)-2*pi/3;
R(i,j)=I(i,j).*(1-S(i,j));
G(i,j)=I(i,j).*(1+S(i,j).*cos(H(i,j)-2*pi/3)./cos(pi-H(i,j)));
B(i,j)=3*I(i,j)-(R(i,j)+G(i,j));
end
if (4*pi/3<=H(i,j))& (H(i,j)<2*pi)
H(i,j)=H(i,j)-4*pi/3;
G(i,j)=I(i,j).*(1-S(i,j));
B(i,j)=I(i,j).*(1+S(i,j).*cos(H(i,j)-4*pi/3)./cos(5*pi/3-H(i,j)));
R(i,j)=3*I(i,j)-(G(i,j)+B(i,j));
end
end
end
output3=cat(3,R,G,B);
output3=uint8(output3);
figure
imshow(output3)
实验结果
灰度图像
彩色图像
通过原始图像和均衡化后的图像对比,原始图像直方图与均衡化后直方图对比,均衡化后的直方图灰度值更加平均,在整幅图像中不再集中。
更多推荐
所有评论(0)