1. 程式人生 > >直方圖均衡化—matlab實現

直方圖均衡化—matlab實現

步驟:

統計原影象素每個畫素的個數

統計原影象<每個灰度級的畫素的累積個數

家裡灰度級得對映規則

將原圖每個畫素點的灰度對映到新圖

程式碼:

clear all
I=imread('1.jpg');                 %讀入JPG彩色影象檔案
imshow(I)                                  %顯示出來 
title('輸入的彩色JPG影象')
I_gray = rgb2gray(I); %灰度化後的資料存入陣列
imwrite(I_gray,'1_gray.bmp'); %儲存灰度影象
figure,imshow(I_gray);
title('灰度圖')

[height,width]=size(I_gray);  %測量影象尺寸引數
p=zeros(1,256);                            %預建立存放灰度出現概率的向量
for i=1:height
    for j=1:width
     p(I_gray(i,j) + 1) = p(I_gray(i,j) + 1)  + 1;
    end
end
s=zeros(1,256);
s(1)=p(1);
for i=2:256
     s(i)=p(i) + s(i-1); %統計影象中<每個灰度級畫素的累積個數,s(i):0,1,```,i-1
end

for i=1:256
    s(i) = s(i)*256/(width*height); %求灰度對映函式
    if s(i) > 256
        s(i) = 256;
    end
end

%影象均衡化
I_equal = I;
for i=1:height
    for j=1:width
     I_equal(i,j) = s( I(i,j) + 1);
    end
end
figure,imshow(I_equal)                           %顯示均衡化後的影象 
title('均衡化後圖像')
imwrite(I_equal,'1_equal.bmp');



實現結果如下:

原圖                                                                       灰度圖                                                                    均衡化後


親們,是這樣麼?!是這樣麼?!!腫麼會是這樣的呢~~~~~~~驚訝

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~是不是錯了?彩色影象的均值化到底腫麼弄涅~~

對於灰度圖的均衡化,

%直方圖均衡化  
clear;
I = imread('mm_gaussian_gray.bmp');  
[height,width] = size(I);  
figure  
subplot(221)  
imshow(I)%顯示原始影象  
subplot(222)  
imhist(I)%顯示原始影象直方圖  
  
%進行畫素灰度統計;  
s = zeros(1,256);%統計各灰度數目,共256個灰度級  
for i = 1:height  
    for j = 1: width  
        s(I(i,j) + 1) = s(I(i,j) + 1) + 1;%對應灰度值畫素點數量增加一  
    end  
end  
%計算灰度分佈密度  
p = zeros(1,256);  
for i = 1:256  
    p(i) = s(i) / (height * width * 1.0);  
end  
%計算累計直方圖分佈  
c = zeros(1,256);  
c(1) = p(1);
for i = 2:256   
        c(i) = c(i - 1) + p(i);  
end  
%累計分佈取整,將其數值歸一化為1~256 
c = uint8(255 .* c + 0.5);  
%對影象進行均衡化
for i = 1:height  
    for j = 1: width  
        I(i,j) = c(I(i,j)+1);  
    end  
end  

subplot(223)  
imshow(I)%顯示均衡化後的影象
subplot(224)  
imhist(I)%顯顯示均衡化後的影象的直方圖