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均衡化後直方圖');

運行結果:

 

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