天天看點

數字圖像處理第三次作業——基于直方圖的圖像空域操作

目  錄

        • 一、基本概念及原理:
          • 1. 圖像的直方圖:
          • 2. 直方圖均衡:
          • 3. 直方圖比對:
          • 4.局部直方圖增強:
          • 5.直方圖分割:
        • 二、具體實作及結果(MATLAB)
          • 第 1 題
          • 第 2 題
          • 第 3 題
          • 第 4 題
          • 第 5 題
        • 參考資料

一、基本概念及原理:

1. 圖像的直方圖:

  我們常說的直方圖是指頻率分布直方圖,即橫坐标表示變量,縱坐标表示對每個變量取值的頻率大小。在數字圖像中,圖像的直方圖與之類似,橫坐标是離散的灰階值,縱坐标是每個灰階值對應的像素點數目。

  是以直方圖可以顯示圖像的明暗情況。越亮的圖檔直方圖分布越靠右側,越暗的圖檔直方圖分布就越靠左側;對比度越高的圖檔直方圖分布越廣,反之其分布較窄。

2. 直方圖均衡:

  如上所述,對于對比度較小的圖檔,我們通過對空域的數學操作使其灰階在一定範圍内的像素數目大緻相等,這個過程就是直方圖均衡化。直覺來講,就是将不均勻的直方圖調整的更加均勻。 這樣處理往往能使對比度小、不易辨識的圖檔更加清楚。

  我們通常用如下函數進行直方圖均衡化:

S k = T ( r k ) = ∑ i = 0 k − 1 n i n S_k=T(r_k)=\sum\limits_{i=0}^{k-1}\frac{n_i}{n} Sk​=T(rk​)=i=0∑k−1​nni​​

  其中, n n n 表示圖像中像素總數, n i n_i ni​表示圖像中灰階為 i i i 的像素點數量

3. 直方圖比對:

  所謂直方圖比對,就是将待處理圖像的直方圖調整成目标圖像直方圖的樣式,這樣做可以實作圖像色調的統一。

  實作步驟:

  1. 計算輸入圖像的均衡化直方圖T(r)
  2. 計算模闆圖像的均衡化直方圖G(z)
  3. 對于每個像素點的灰階r,找出使得T(r)=G(z)的z,若不存在則找最接近的,若有多個z值,則找最小的
  4. 将r依次替換為z
4.局部直方圖增強:

  所謂局部直方圖增強,就是将圖像中滿足條件的像素點灰階增強。這個條件判斷方式有多種,按照課本上的判斷條件即是:

{ g ( x , y ) = E ⋅ f ( x , y ) i f m S x y ≤ k 0 m G A N D k 1 σ G ≤ σ S x y ≤ k 2 σ G g ( x , y ) = f ( x , y ) e l s e \begin{cases} g(x,y)=E·f(x,y)&if&m_{S_xy}\le k_0m_G&AND&k_1\sigma_G\le \sigma_{S_xy}\le k_2\sigma_G \\g(x,y)=f(x,y)&else\end{cases} {g(x,y)=E⋅f(x,y)g(x,y)=f(x,y)​ifelse​mSx​y​≤k0​mG​ANDk1​σG​≤σSx​y​≤k2​σG​

  其中, m S x y m_{S_{xy}} mSxy​​是鄰域中的灰階均值, m G m_G mG​是全圖的灰階均值; σ S x y \sigma_{S_{xy}} σSxy​​是鄰域中的灰階标準差, σ G \sigma_G σG​是全圖的灰階标準差。E,k0,k1,k2 是可選參數。

  具體來說,就是用一個掩模對每個像素點進行處理,每個像素點在其掩模包括的鄰域内按照上面的條件進行判斷并處理。是以直方圖增強的效果也與掩模的大小有關。

5.直方圖分割:

  在直方圖中指定一個門檻值,小于此門檻值的灰階值均置0,大于此門檻值的灰階值均置1 。門檻值的選取采用如下疊代方法進行:

  1. 随機指定一個門檻值,計算門檻值左右兩側灰階的均值mean1,mean2
  2. 求出mean1與mean2的平均值作為新的門檻值
  3. 重複上述過程直到兩次門檻值相差小于一個指定精度,得到最終門檻值

二、具體實作及結果(MATLAB)

第 1 題
把附件圖像的直方圖畫出

  首先用

imread()

将圖像讀入,在這個過程中由于所給圖像是采用索引形式存儲的,是以需要同時讀入圖像的索引和調色闆,再使用

ind2gray()

函數将索引圖轉化為灰階圖像,為下面的處理做鋪墊。

  直方圖可以直接調用内置函數

imhist()

畫出,結果如下所示:

數字圖像處理第三次作業——基于直方圖的圖像空域操作
第 2 題
把所有圖像進行直方圖均衡;輸出均衡後的圖像和源圖像進行比對;分析改善内容

  使用

histeq()

函數實作直方圖的均衡,結果如下:

​ 原始圖像:

數字圖像處理第三次作業——基于直方圖的圖像空域操作

​ 直方圖均衡化後圖像:

數字圖像處理第三次作業——基于直方圖的圖像空域操作

​ 均衡化後的直方圖:

數字圖像處理第三次作業——基于直方圖的圖像空域操作

​ 分析: 進行直方圖均衡化後,對于對比度小的圖像,其對比度顯著增強,圖像更加清晰可辨識;對于整體色調過亮或過暗的圖像,讓其色調處在一個适宜的範圍,同樣更容易被人眼識别。

第 3 題
進一步把圖像按照對源圖像直方圖的觀察,各自自行指定不同源圖像的直方圖,進行直方圖比對,進行圖像增強

  這裡自己構造一個函數

histmatch()

,具體内容為:

  1. 求輸入圖像的均衡化直方圖T1
  2. 求模闆圖像的均衡化直方圖T2
  3. 構造轉換矩陣T3
  4. 得到輸出圖像

    函數代碼如下:(MATLAB)

function img_out=histmatch(img_in,hist)
[M,N]=size(img_in);
hist_img=imhist(img_in);
%求T1:
a=zeros(256,1);
T1=zeros(256,1,'uint8');
a(1)=hist_img(1);
for i=2:256
    a(i)=a(i-1)+hist_img(i);
    T1(i)=uint8(round(a(i)*255/(M*N)));
end
%求T2:
a=zeros(256,1);
T2=zeros(256,1,'uint8');
a(1)=hist(1);
for i=2:256
    a(i)=a(i-1)+hist(i);
    T2(i)=uint8(round(a(i)*255/sum(hist)));
end
%求T3:
T3=zeros(256,1);
a=zeros(256,1);
for i=1:256
    for j=1:256
        a(j)=abs(T1(i)-T2(j));
    end
    [~,p]=min(a);
    T3(i)=uint8(p-1);
end
%outimage:
for i=1:M
    for j=1:N
        img_out(i,j)=T3(uint32(img_in(i,j))+1);
    end
end
img_out=uint8(img_out);
end
           

​ 得到結果如下:

  1. 将citywall與elain比對:
數字圖像處理第三次作業——基于直方圖的圖像空域操作

2. 将lena和woman進行比對:

數字圖像處理第三次作業——基于直方圖的圖像空域操作
第 4 題
對elain和lena圖像進行7*7的局部直方圖增強

​ 自己構造一個函數

LocalHist()

,具體内容為:

  1. 參數設定及圖像預處理
    • 參數設定包括設定k0,k1,k2,E以及掩模大小masksize,這裡選擇k0=0.5,k1=0.01,k2=0.5,E=3,masksize=7
    • 圖像預處理包括圖像擴充及計算全圖的灰階均值和方差、标準差
    • 其中圖像擴充可以直接調用函數

      padarray(Img,size,padval,direction)

      ,其中padval 選擇’replicate’将邊緣像素點進行複制擴充,direction 選擇’both’ 每個方向兩邊均進行擴充
  2. 各像素點掩模覆寫區域參數計算(均值、标準差)
  3. 判斷條件及處理

    函數代碼如下:(MATLAB)

function [Imgout,Imgchange]=LocalHist(Img)
%參數設定及預處理:
k0=0.5;k1=0.01;E=3;k2=0.5;  %設定參數值
masksize = 7;   %鄰域大小
Imgex= padarray(Img,[3,3],'replicate','both');%圖像擴充
%全圖參數計算:
Mg=sum(Img(:))/(size(Img,1)*size(Img,2));%全圖均值
sig2g=sum((Img(:)-Mg(:)).^2)/(size(Img,1)*size(Img,2));%全圖方差
sigg=sqrt(sig2g);%全圖示準差
%各像素點鄰域參數計算:
sig2xy=zeros(size(Img));    %用于存儲鄰域方差
for i=1:size(Img,1)
    for j=1:size(Img,2)
        neibour=Imgex(i:i+6,j:j+6); %鄰域截取
        Msxy(i,j)=sum(neibour(:))/masksize^2; %鄰域均值
        sig2xy(i,j)=sum((neibour(:)-Msxy(i,j)).^2)/masksize^2;%鄰域方差
        sigxy(i,j)=sqrt(sig2xy(i,j));  %鄰域标準差
    end
end 
%判斷條件:
t1=(Msxy<=k0*Mg);
t2=(sigxy>=k1*sigg)&(sigxy<=k2*sigg);
t=uint8(t1&t2);%需要變化的像素點
t_=uint8((int8(t)-1)*(-1));%無需變化的像素點
Imgchange=Img.*(t*E);   %圖像改變部分
Imgnotchange=Img.*t_;   %圖像未改變部分
Imgout=Imgchange+Imgnotchange;  %處理後圖像
end
           

​ 得到結果如下:

  1. lena增強:
數字圖像處理第三次作業——基于直方圖的圖像空域操作
  1. elain增強:
數字圖像處理第三次作業——基于直方圖的圖像空域操作
第 5 題
利用直方圖對圖像elain和woman進行分割

  自己構造函數

Seg()

,具體内容為:

  1. 設定初始門檻值,因為是8位圖像,故取T=128
  2. 疊代優化,得到最終門檻值
  3. 按照門檻值進行圖像分割

函數代碼如下:(MATLAB)

function Img_seg=Seg(Img)
hist=imhist(Img);
T=128;T1=0;T0=1;    %設定初始門檻值T,設定接受門檻值T0,T1用于存儲上一次疊代的T
while abs(T-T1)>=T0     %重複以下步驟直到兩次門檻值相差小于1
    mean1=0;mean2=0;    %mean1,mean2分别為被T分成的兩部分的灰階均值
    for i=1:T
        mean1=mean1+hist(i)/sum(hist(1:T))*(i-1);
    end
    for i=T+1:length(hist)
        mean2=mean2+hist(i)/sum(hist(T+1:length(hist)))*(i-1);
    end
    T1=T;
    T=round((mean1+mean2)/2);   %新T值為兩側灰階均值的平均
end
Img_seg=(Img>T);    %灰階大于T的均置為1,其他均置0
end
           

​ 得到結果如下:

數字圖像處理第三次作業——基于直方圖的圖像空域操作

參考資料

  1. 岡薩雷斯.數字圖像處理(第三版)[M].北京:電子工業出版社.2017.1

數字圖像處理作業連結:

數字圖像處理第一次作業——Bmp格式與基本變換

數字圖像處理第二次作業——圖像仿射變換

數字圖像處理第三次作業——基于直方圖的圖像空域操作

數字圖像處理第四次作業——空域濾波與邊緣檢測

數字圖像處理第五次作業——頻域濾波器

數字圖像處理第六次作業——圖像噪聲和恢複

數字圖像處理第七次作業——圖像直線檢測

繼續閱讀