涉及到的知識點:
- 提取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均衡化後直方圖');
運行結果: