圖像增強的幾個方法以及Matlab代碼

1. 灰度線性變換

灰度線性變換, 是一種空域的方法, 直接對每一個像素的灰度值進行操作

假設圖像爲II

則其中每一個像素點的灰度值爲I(x,y)I(x,y)

我們利用簡單的線性變換可以得到:

I(x,y)=kI(x,y)+bI(x,y)^*=k*I(x,y)+b

k=1,b=16k=1,b=16可以得到

Alt text

Alt text

Alt text

這裏給出關鍵代碼

original = imread(strcat(strcat('resource\',name),'.bmp'));
transformed = LinearFunction(original, 1, 16);
subplot(1,3,3);
imshow(transformed)
title('線性變換後的圖像')
imwrite(transformed,strcat(strcat('result\',name),'(linear).jpg'))

2. 直方圖均衡變換

這種方法通常用來增加許多圖像的全局對比度,尤其是當圖像的有用數據的對比度相當接近的時候。通過這種方法,亮度可以更好地在直方圖上分佈。這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現這種功能。

這種方法對於背景和前景都太亮或者太暗的圖像非常有用,這種方法尤其是可以帶來X光圖像中更好的骨骼結構顯示以及曝光過度或者曝光不足照片中更好的細節。這種方法的一個主要優勢是它是一個相當直觀的技術並且是可逆操作,如果已知均衡化函數,那麼就可以恢復原始的直方圖,並且計算量也不大。這種方法的一個缺點是它對處理的數據不加選擇,它可能會增加背景噪聲的對比度並且降低有用信號的對比度。

考慮一個離散的灰度圖像{x}\{x\}

nin_i表示灰度ii出現的次數, 這樣圖像中灰度爲ii的像素出現的概率爲:

px(i)=p(x=i)=nin0i<Lp_x(i)=p(x=i)=\frac{n_i}{n}, 0\leq i<L

LL是圖像中所有的灰度數(通常是255)

把對應於pxp_x的累積分佈函數,定義爲:

cdfx(i)=j=0ipx(j)cdf_x(i)=\sum_{j=0}^i{p_x(j)}

是圖像的累計歸一化直方圖

我們創建一個形式爲y=T(x)y=T(x)的變換, 對於原始圖像的每一個值它就產生一個yy, 這樣yy的累計概率函數就可以在所有值範圍內線性化, 轉換公式定義爲:

cdfy(i)=iKcdf_y(i)=iK

對於常數K, CDFCDF的性質允許我們做這樣的變換, 定義爲:

cdfy(y)=cdfy(T(k))=cdfx(k)cdf_y(y')=cdf_y(T(k))=cdf_x(k)

其中k[0,L)k\in [0,L), 注意TT將不同的灰度級映射到(0,1)(0,1), 爲了將這些值映射到最初的域, 需要在結果上應用下面的簡單變換:

y=y(max{x}min{x})+min{x}y' = y*(max\{x\}-min\{x\})+min\{x\}

給出部分結果:

Alt text

Alt text

Alt text

給出關鍵代碼:

m = 255;
subplot(1,3,3);
H = histeq(I,m);
imshow(H,[]);
title(‘直方圖均衡後的圖像’);

類似地, 我們可以對rgb圖像進行直方圖均衡, 這裏直接給出結果

Alt text

Alt text

Alt text

[M,N,G]=size(I1);
result=zeros(M,N,3);
%獲得每一層每一個點的RGB值,並判斷其值等於多少
for g=1:3
    A=zeros(1,256);
    %每處理完一層,參數要重新初始化爲0
    average=0;
    for k=1:256
        count=0;
        for i=1:M
            for j=1:N
                value=I1(i,j,g);
                if value==k
                    count=count+1;
                end
            end
        end
        count=count/(M*N*1.0);
        average=average+count;
        A(k)=average;
    end
    A=uint8(255.*A+0.5);
    for i=1:M
        for j=1:N
            I1(i,j,g)=A(I1(i,j,g)+0.5);
        end
    end  
end
%展示處理效果
subplot(1,3,3);
imshow(I1);

3. 同態濾波

同態濾波利用去除乘性噪聲(multiplicative noise),可以同時增加對比度以及標準化亮度,藉此達到圖像增強的目的。

一副圖像可以表示爲其照度(illumination)分量和反射(reflectance)分量的乘積,雖然在時域上這兩者是不可分離的,但是經由傅立葉轉換兩者在頻域中可以線性分離。由於照度可視爲環境中的照明,相對變化很小,可以看作是圖像的低頻成分;而反射率相對變化較大,則可視爲高頻成分。通過分別處理照度和反射率對像元灰度值的影響,通常是藉由高通濾波器(high-pass filter),讓圖像的照明更加均勻,達到增強陰影區細節特徵的目的。

做法是:

對於一幅圖像, 可以表示成照射分量和反射分量的乘積, 也就是:

m(x,y)=i(x,y)r(x,y)m(x,y)=i(x,y)\cdot r(x,y)

其中, mm是圖像, ii是爲照度分量, rr是反射分量

爲了在頻域中使用高通濾波器, 我們必須進行傅里葉變換, 但是由於上式是一個乘積式, 不能直接對照度分量和反射分量進行操作, 因此對上式取對數

ln(m(x,y))=ln(i(x,y))+ln(r(x,y))ln(m(x,y))=ln(i(x,y))+ln(r(x,y))

然後對上式進行傅里葉轉換

F{ln(m(x,y))}=F{ln(i(x,y))}+F{ln(r(x,y))}\mathcal{F}\{ln(m(x,y))\}=\mathcal{F} \{ ln(i(x,y))\}+ \mathcal{F}\{ln(r(x,y))\}

我們將F{ln(m(x,y))}\mathcal{F}\{ln(m(x,y))\}定義爲M(u,v)M(u,v)

接下來對圖像進行高通濾波, 如此可以使圖像的照明更均勻, 高頻分量增加且低頻分量減少

N(u,v)=H(u,v)M(u,v)N(u,v)=H(u,v)\cdot M(u,v)

其中HH是高通濾波器

爲了將圖像從頻域轉回時域,我們對NN做傅立葉逆轉換

n(x,y)=F1{N(x,y)}n(x,y)=\mathcal{F}^{-1}\{N(x,y)\}

最後使用指數函數來複原我們一開始取的對數

m(x,y)=exp{n(x,y)}m'(x,y)=exp\{n(x,y)\}

給出處理結果

Alt text

Alt text

Alt text

給出部分關鍵代碼

I=double(I);
[M,N]=size(I);
rL=0.5;
rH=4.7;%可根據需要效果調整參數
c=2;
d0=10;
I1=log(I+1);%取對數
FI=fft2(I1);%傅里葉變換
n1=floor(M/2);
n2=floor(N/2);
H = ones(M, N);
for i=1:M
    for j=1:N
        D(i,j)=((i-n1).^2+(j-n2).^2);
        H(i,j)=(rH-rL).*(exp(c*(-D(i,j)./(d0^2))))+rL;%高斯同態濾波
    end
end
I2=ifft2(H.*FI);%傅里葉逆變換
I3=real(exp(I2));
subplot(1,3,3),imshow(I3,[]);title('同態濾波增強後');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章