實驗內容
實現灰度圖像的直方圖均衡化算法
實驗過程
- 讀入一幅灰度圖像,存放在圖像矩陣F中。(imread函數)。
- 獲得輸入圖像尺寸M、N、C(size函數)。並將圖像矩陣F中的數據由uint8類型轉換爲double類型以便後續處理。如果顏色通道數C>1,則將彩色圖像轉化爲灰度圖rgb2gray
- 計算圖像F的灰度直方圖h(imhist函數;或者通過兩重循環遍歷每個像素點從而得到每個灰度值的累計像素點個數)。
- 計算計算原圖的灰度分佈概率hs。hs=h/(M*N) (i=0,1,…,255)。
- 計算原圖灰度的累計分佈hp0(使用cumsum函數)。
- hp1=hp0*255。
- 將hp1四捨五入,令hp1(1)=0。
- 根據步驟(6)得到的新舊圖像灰度值的映射結果,設置兩重循環遍歷圖像F中所有像素點,求出每一個像素點的灰度值F(i,j),計算F(i,j)對應數組hp1中的位置x,得到hp1(x)並賦給新圖像的對應像素值G(i,j)
- 將計算得到的新圖像矩陣中所有點的灰度值由double轉換爲uint8。輸出最終得到的結果圖像。
測試代碼
F = imread('.\im\pict1.png');
[G]=imhisteq(F);
figure,imshow(G);
實驗所需圖片
鏈接:https://pan.baidu.com/s/1LaxnZdLeY3LnKKv276E0pA
提取碼:vk8y
實驗源碼
function [J] = imhisteq(I)
[height,width,d]=size(I); %獲得輸入圖像尺寸M、N、C(size函數)
if(d>1)
I=rgb2gray(I); %如果顏色通道數C>1,則將彩色圖像轉化爲灰度圖rgb2gray
end
nbins = 256;
%計算圖像F的灰度直方圖h(imhist函數;
%或者通過兩重循環遍歷每個像素點從而得到每個灰度值的累計像素點個數)。
hist_0 = imhist(I,nbins)';
%計算原圖的灰度分佈概率hs。hs=h/(M*N) (i=0,1,…,255)。
hist_1 = hist_0/(height*width);
%計算原圖灰度的累計分佈hp0(使用cumsum函數)
hp_0 = cumsum(hist_1);
%hp1=hp0*255 將hp1四捨五入,令hp1(1)=0
hp_1 = round(hp_0*255);
hp_1(1)=0;
I0 = double(I);
%置兩重循環遍歷圖像F中所有像素點,求出每一個像素點的灰度值F(i,j)
for i=1:height
for j=1:width
GrayScale=I0(i,j);
NewGrayScale = hp_1(GrayScale+1);
J(i,j)=NewGrayScale;
end
end
%計算得到的新圖像矩陣中所有點的灰度值由double轉換爲uint8
J = uint8(J); %轉換uint8編碼
測試結果
學如逆水行舟,不進則退