Matlab 彩色图像的直方图均衡化及直方图绘制(基础知识+原理代码实现)

涉及到的知识点:

  • 提取R、G、B分量

imshow(I);
I1=I(:,:,1);  %提取红色分量
I2=I(:,:,2);  %提取绿色分量
I3=I(:,:,3);  %提取蓝色分量

  • 构造函数

function[输出形参]=函数名([输入形参])

 函数体

  •  cat函数

cat(Concatenate的缩写)用于构造多维函数。

C = cat(dim,A,B)

C = cat(dim,A1,A2,A3,A4,...)

dim为1时,将矩阵上下拼接:[A;B],dim为2时,将矩阵左右拼接:[A,B],dim=3时则可以构造三维数组。

  • subplot()函数

subplot函数是将 多个图画到一个平面上的工具。

subplot(m,n,p)或subplot(m n p)

表示 一个m行n列的大画框,可显示 m*n个图 ,p表示图所在位置。

  • size()函数

[m,n] = size(X)

返回矩阵X的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数。

m=size(X,dim)

返回矩阵X的第dim维尺寸。

  • zeros()函数

zeros(m,n) 产生m*n的double类零矩阵,zeros(n)产生n*n的全零方阵。

实现彩色图像的直方图均衡化代码:(实现原理)

%主函数
function coloraverage()
I=imread('lena.png');
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(1,2,1);imshow(I);
subplot(1,2,2);imshow(c);

%调用的(直方图均衡化)构造函数
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;

 运行后的结果:

利用工具箱中函数histeq实现:(含直方图前后对比)

function Histogramequalization()
[f,p]=uigetfile('*.*','选择图像文件');
if f
I=imread(strcat(p,f));
end

h=figure();
set(h,'position',[300 100 1000 600]);

Ir=I(:,:,1);%提取红色分量
Ig=I(:,:,2);%提取绿色分量
Ib=I(:,:,3);%提取蓝色分量
I1=histeq(Ir);   %直方图均衡化函数histeq
I2=histeq(Ig);
I3=histeq(Ib);
c=cat(3,I1,I2,I3);  %cat用于构造多维数组
subplot(2,4,1);imshow(I);
title('A). 原始图像');  
subplot(2,4,5);imshow(c);
title('B). 直方图均衡化');

subplot(2,4,2);
imhist(Ir);
title('I). 红色分量直方图');
subplot(2,4,6);
imhist(I1);
title('II). R均衡化后直方图');
subplot(2,4,3);
imhist(Ig);
title('I). 绿色分量直方图');
subplot(2,4,7);
imhist(I2);
title('II). G均衡化后直方图');
subplot(2,4,4);
imhist(Ib);
title('I). 蓝色分量直方图');
subplot(2,4,8);
imhist(I3);
title('II). B均衡化后直方图');

运行结果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章