数字图像处理|Matlab-空域增强实验-彩色图像的直方图均衡化
程序员文章站
2022-05-21 13:48:35
...
Matlab-空域增强实验-彩色图像的直方图均衡化
代码链接:https://download.csdn.net/download/qq_43571150/12033257
以左图为输入,实现直方图均衡化的算法,获得类似右图的效果。实验用图像自行选择。
问题1:
提取RGB三个通道图像,计算其平均直方图结果,然后再进行均衡化;
%主函数
function coloraverage()
I=imread('01.jpg');
imshow(I);
I1=I(:,:,1);%提取红色分量
I2=I(:,:,2);%提取绿色分量
I3=I(:,:,3);%提取蓝色分量
I1=histogram(I1); %构造的函数
I2=histogram(I2);
I3=histogram(I3);
c=cat(3,I1,I2,I3); %cat用于构造多维数组
subplot(2,2,1);imshow(I);title('输入图像');
subplot(2,2,2);imhist(I);title('输入图像的直方图'); %显示图片灰度值的统计结果直方图
subplot(2,2,3);imshow(c);title('处理后图像');
subplot(2,2,4);imhist(c);title('处理后图像的直方图'); %显示图片灰度值的统计结果直方图
imwrite(c,'01Save.jpg');
%调用的(直方图均衡化)构造函数
function d=histogram(I)%构造histogram函数
J=I;
[m,n]=size(I); %确定矩阵大小
area=m*n;
a=zeros(1,256); %产生1*256的零矩阵a,用来存放原始图像各个灰度值的个数
b=zeros(1,256);
for i=1:m %记录各个灰度值的个数
for j=1:n
d=I(i,j)+1; %获取(i,j)位置的灰度值(注意:灰度值为0-255,对应矩阵的1-256)
a(1,d)=a(1,d)+1; %矩阵a上对应灰度值的计数+1
end
end
for i=1:256 %均衡化
sum=0;
for j=1:i
sum=sum+a(1,j);
end
b(1,i)=sum*255/area;
end
for i=1:m %用均衡化后的数据代替原位置的数据
for j=1:n
d=J(i,j)+1;
J(i,j)=b(1,d);
end
end
d=J;
结果如下????
问题2:
RGB空间转为HSI空间图像,对I(亮度,Intensity)通道进行直方图均衡化,再转为RGB图像。
I=imread('05.jpg');
R=rgb2hsi(I);
H1=R(:,:,1);
S1=R(:,:,2);
X1=R(:,:,3);
g1=histeq(H1);
g2=histeq(S1);
g3=histeq(X1);
I1=cat(3,H1,S1,g3);
f1=hsi2rgb(I1);
subplot(2,2,1);imshow(I);title('输入图像');
subplot(2,2,2);imhist(I);title('输入图像的直方图');
subplot(2,2,3);imshow(f1);title('HSI均衡化图像');
subplot(2,2,4);imhist(f1);title('HSI均衡化图像的直方图');
imwrite(f1,'05HSI均衡化图像.jpg');
function hsi = rgb2hsi(rgb)
% 抽取图像分量
rgb = im2double(rgb);
r = rgb(:, :, 1);
g = rgb(:, :, 2);
b = rgb(:, :, 3);
% 执行转换方程
num = 0.5*((r - g) + (r - b));
den = sqrt((r - g).^2 + (r - b).*(g - b));
theta = acos(num./(den + eps)); %防止除数为0
H = theta;
H(b > g) = 2*pi - H(b > g);
H = H/(2*pi);
num = min(min(r, g), b);
den = r + g + b;
den(den == 0) = eps; %防止除数为0
S = 1 - 3.* num./den;
H(S == 0) = 0;
I = (r + g + b)/3;
% 将3个分量联合成为一个HSI图像
hsi = cat(3, H, S, I);
end
function rgb=hsi2rgb(hsi)
H=hsi(:,:,1)*2*pi;
S=hsi(:,:,2);
I=hsi(:,:,3);
%实现转换方程式
R=zeros(size(hsi,1),size(hsi,2));
G=zeros(size(hsi,1),size(hsi,2));
B=zeros(size(hsi,1),size(hsi,2));
% R G (0<=H<2*pi/3).
idx=find((0<=H)&(H<2*pi/3));
B(idx)=I(idx).*(1-S(idx));
R(idx)=I(idx).*(1+S(idx).*cos(H(idx))./cos(pi/3-H(idx)));
G(idx)=3*I(idx)-(R(idx)+B(idx));
% B G (2*pi/3<=H<4*pi/3).
idx=find((2*pi/3<=H)&(H<4*pi/3));
R(idx)=I(idx).*(1-S(idx));
G(idx)=I(idx).*(1+S(idx).*cos(H(idx)-2*pi/3)./cos(pi-H(idx)));
B(idx)=3*I(idx)-(R(idx)+G(idx));
% B R
idx=find((4*pi/3<=H)&(H<=2*pi));
G(idx)=I(idx).*(1-S(idx));
B(idx)=I(idx).*(1+S(idx).*cos(H(idx)-4*pi/3)./cos(5*pi/3-H(idx)));
R(idx)=3*I(idx)-(G(idx)+B(idx));
%将所有三个结果合并为RGB图像。裁剪到[0,1]以补偿浮点算术舍入效果
rgb=cat(3,R,G,B);
rgb=max(min(rgb,1),0);
end
结果如下????
上一篇: websocket——简单聊天室