在處理圖像時,偶爾會碰到圖像的灰度級別集中在某個小范圍內的問題,這時候圖像很難看清楚。比如下圖:
它的灰度級別,我們利用一個直方圖可以看出來(橫坐標從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)
有做得不完善的地方歡迎留言探討!