Experiment topics:
Programming grayscale and color image histogram equalization. Required to give the original image histogram equalization and image gradation transformation curve histogram equalization and histogram when used. Note that the color images require programming by the RGB color space image to HSI conversion and histogram equalization on the luminance channel.
Source:
Gray-scale image processing, gradation transformation curve is given in FIG histogram of the original image, and the image histogram equalization and histogram equalization when used
// 灰度图像
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('灰度级变换曲线');
Processing color image, given the original image histogram equalization and image gradation transformation curve and FIGS when used histogram equalization histogram. Note that the color images require programming by the RGB color space image to HSI conversion, then in the luminance channel histogram equalization.
// 彩色图像
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)
Experimental results
Grayscale image
Color image
By contrast image and the original image after the equalization, the original image after the histogram equalization contrast histogram, histogram of gradation values more evenly after equalization, not concentrated in the whole image.