直方圖均衡化及matlab實現


在處理圖像時,偶爾會碰到圖像的灰度級別集中在某個小范圍內的問題,這時候圖像很難看清楚。比如下圖:

 

它的灰度級別,我們利用一個直方圖可以看出來(橫坐標從0到255,表示灰度級別,縱坐標表示每個灰度級別的像素出現個數)

可以看出,上圖是由於灰度級過於集中,導致圖片難以看清。

這時候我們可以把灰度級別“拉開”,使得灰度級多且分布均勻,讓圖片具有高對比度和多變的灰度色調。

 

那么如何拉開才能使得灰度級別占據從0到255的整一個范圍呢?

我們可以先利用概率,計算出原圖中每一個灰度級別的像素個數占所有像素個數的比例,然后比例逐個灰度級別地累加,接着把累加比例乘以256,得出該灰度級別“拉開”之后應該在哪一個級別。

舉一個例子,假設一張圖片像素點對應的矩陣為

f=[100,100,100,100,100;
110,110,110,110,110;
120,120,120,120,120;
130,130,130,130,130;
140,140,140,140,140];

那么我們可以看到灰度級別為100的像素個數的比例為1/5,那么現在灰度級別應該改為round(1/5*256-1)。之所以-1是因為灰度級從0到255,取整是因為灰度級均為整數。

接下來110所占比例也是1/5,累加比例變成2/5,所以灰度級別應該是round(2/5*256-1)。

120對應的累加比例為3/5,就應該是round(3/5*256-1)

……

如此,就可以把灰度級拉開。拉開后直方圖如下:

最后效果如下

最后附上matlab代碼:

clear all;
clc;
close all;

f=imread('zftjhh1.jpg');
[m,n,d]=size(f);%灰度圖1維,彩色圖3維
if d==1
    f1=f;%復制后新的圖片f1,作為改變后的圖片
elseif d==3
    f=rgb2gray(f);
    f1=f;
end
figure 
imhist(f)
[count,x]=imhist(f);%count表示每個灰度級別有多少個像素,x表示有多少個灰度級別

PDF=count/(m*n);%PDF表示每個灰度級別出現的概率,一共有256行
CDF=cumsum(PDF);%CDF表示逐行相加的概率,也就是累加概率

for i=1:256
    xiangsuxushu=find(f==i);%原本灰度級別為i的像素在第幾位
    changdu=length(xiangsuxushu);
    for j=1:changdu
        f1(xiangsuxushu(j))=round(CDF(i)*256-1);%每一個原本灰度級別為i的像素,
                                              %灰度級別改為累加出現概率*256
                                              %再取整
    end
end

figure
imhist(f1)
figure
imshow(f1)

  

 有做得不完善的地方歡迎留言探討!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM