欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数字图像处理|Matlab-空域增强实验-彩色图像的直方图均衡化

程序员文章站 2022-05-21 13:48:35
...

Matlab-空域增强实验-彩色图像的直方图均衡化

代码链接:https://download.csdn.net/download/qq_43571150/12033257

以左图为输入,实现直方图均衡化的算法,获得类似右图的效果。实验用图像自行选择。
数字图像处理|Matlab-空域增强实验-彩色图像的直方图均衡化
问题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-256a(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;

结果如下????
数字图像处理|Matlab-空域增强实验-彩色图像的直方图均衡化

问题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

结果如下????
数字图像处理|Matlab-空域增强实验-彩色图像的直方图均衡化

相关标签: 数字图像处理