使用MATLAB對圖像處理的幾種方法(下)


 試驗報告

一、試驗原理:

圖像點處理是圖像處理系列的基礎,主要用於讓我們熟悉Matlab圖像處理的編程環境。灰度線性變換和灰度拉伸是對像素灰度值的變換操作,直方圖是對像素灰度值的統計,直方圖均衡是對灰度值分布的變換。

1.灰度線性變換

(1)線性變換函數

原圖向灰度值為g ,通過線性函數f(x)=kx+b 轉換為f(g) 得到灰度的線性變換。

(2)代碼實現

Matlab中支持矩陣作為函數參數傳入,定義一個線性轉換函數,利用Matlab矩陣操作,用一行代碼即可對整個二維圖像矩陣中所有點的灰度進行線。

函數文件:LinearTransformFunc.m

%原圖向灰度值為g,通過線性函數f(x)=kx+b轉換為f(g)得到灰度的線性變換.

%把圖像中每個像素點的灰度值,按照希望達到的效果,以線性變化的形式,進行變換

%LinearTransformFunc函數名(灰度線性變換)

function [ new ] = LinearTransformFunc(original,k,d)

%利用線性公式:y=k*x+b;

%其中k和d是線性函數的斜率和截 

  new=original*k+d;

 

end

2.灰度拉伸變換

(1)灰度拉伸變換和線性分段函數

灰度拉伸變換和線性變換相似,只是是將灰度值做分段線性變換。分段函數控制點(x1,y1)(x2,y2)

(2)代碼實現

函數文件: StretchFunc.m
%灰度拉伸變換和線性變換相似,只是是將灰度值做分段線性變換.
%StretchFunc函數名(灰度拉伸變換)
function [ new ] = StretchFunc(original, x1, y1, x2, y2 )
    new = original;
%分段函數控制點(x1,y1)和(x2,y2)   
%size將圖像轉換為幾維的數組
    w = size(new, 1);
    h = size(new, 2);
%k1,dk1,dk2為斜率
    k1 = y1 / x1;
    dk1 = (y2 - y1) / (x2 - x1);
    dk2 = (255 - y2) / (255 - x2);
    
%for循環 for end成對出現
%new(IDE_Obj,'name','type') creates a project, library, or buildconfiguration in the IDE.
%如果兩個參數,表示project
    for i = 1 : w
        for j = 1 : h
            x = new(i, j);
            if x < x1
                new(i, j) = k1 * x;
            elseif x < x2
                new(i, j) = dk1 * (x - x1) + y1;
            else
                new(i, j) = dk2 * (x - x2) + y2;
            end
        end
    end
end
 

3.灰度直方圖

(1)灰度直方圖

灰度直方圖就是對圖像中每個像素點的灰度值出現的頻數或頻率(歸一化)的統計,那么我們直接遍歷整個圖像統計出每個灰度值出現次數再做相應處理即可。

(2)代碼實現

首先需要遍歷統計灰度,我在GrayScaleStatistic函數里完成統計,區間[low, high]是目標灰度統計區間,默認是[0,255]:

函數文件: GrayScaleStatistic.m
%灰度直方圖就是對圖像中每個像素點的灰度值出現的頻數或頻率(歸一化)的統計.
%查看每一個像素點是屬於哪一個灰度級的,即,統計出這一副圖像各個灰度級出現的次數,灰度級出現頻率=灰度級出現次數/總像素點的個數,
%這樣0~255個灰度級都應該有各自的一個出現頻率,把出現頻率,以柱狀圖的形式表現出來,就是直方圖
%GrayScaleStatistic函數名(灰度直方圖)
function [ result ] = GrayScaleStatistic( original, low, high )
%original為一個矩陣
    w = size(original, 1);
    h = size(original, 2);
%zeros(M,N)表示an M-by-N matrix of zeros
%區間[low, high]是目標灰度統計區間,默認是[0,255]
    result = zeros(1, high - low + 1);
%for循環
    for i = 1 : w
        for j = 1 : h
            g = original(i, j);
            if g >= low && g <= high
                g = g - low + 1;
                result(g) = result(g) + 1; 
            end
        end
    end
end
 

4.直方圖均衡化

(1)直方圖均衡算法

直方圖均衡主要用於增強動態范圍偏小的圖像的反差,其基本思想是把原始圖像的直方圖變換為均勻分布,從而增強灰度值的動態范圍,以達到增強對比度的效果。

直方圖均衡化算法如下

1. 歸一化灰度頻數直方圖,得到頻率直方圖sk

2. sk計算頻率累計直方圖tk

3. tk做取整擴展:tk = int[(L - 1) * sk + 0.5],將直方圖灰度映射盡量滿整個灰度取值空間L

4. 確定變換映射關系k->tk

5. 根據映射關系變換圖像灰度值

(2)代碼實現

在腳本中調用Normalize函數直接得到均衡化后的圖像,再統計直方圖並顯示。

函數文件:Normalize.m

%直方圖均衡化:直方圖均衡主要用於增強動態范圍偏小的圖像的反差,其基本思想是把原始圖像的直方圖變換為均勻分布,

%從而增強灰度值的動態范圍,以達到增強對比度的效果。

%問題轉換為:尋找一個變化函數,使變換后的圖像灰度的概率密度函數等於1,即期望輸出圖像中每一灰度級有相同的概率。

%Pr(Rk)=Nk/N (Pr表示出現頻率,Nk表示k(0,1,2,3……)級別出現次數,N為總個數)

%累積直方圖:Sk=T(Rk)=\Sigma(Pr(Rj))\Sigma(nj/n) k=0,1,2,……L-1

%直方圖均衡的過程:

%(1)統計原始圖像的歸一化直方圖;

%(2)用累計分布函數做變換函數進行圖像灰度變換;

%(3)建立輸入圖像與輸出圖像灰度級之間的對應關系,將變換后灰度級恢復成原先的灰度級范圍。

%Normalize函數名(直方圖均衡化)

function [ new ] = Normalize( original )

%size獲取原始圖像高和寬

%width=size(original,1);  height=size(original,2);

[height,width]=size(original);

 

%nk表示灰度級為k出現的次數

%灰度級范圍0~255

nk=zeros(1,256);

for i=1:height

    for j=1:width

        nk(original(i,j)+1)=nk(original(i,j)+1)+1;

    end

end

%pk表示灰度級為k出現的概率pk=nk/n(n為像素點總個數)

pk=nk./(height*width);     %直立方圖函數

%頻率直方圖sk

sk=zeros(1,256);

sk(1)=pk(1);

for i=2:255

    sk(i)=sk(i-1)+pk(i);

end

%kt是根據頻率計算出累積直方圖

%kt = int[(L - 1) * sk + 0.5],將直方圖灰度映射盡量滿整個灰度取值空間L

%kt=zeros(1,256);

%kt=uint8(floor(255.*sk+0.5));

kt=uint8(255.*sk);

%new為均衡化后圖像

new=zeros(size(original));

for i=1:height

    for j=1:width

        new(i,j)=kt(original(i,j)+1);

    end

end   

 

二、試驗心得:

通過試驗,對圖像處理有了進一步深入了解和認知,基於第一次的濾波的處理和這次灰度線性變換和直方圖處理圖像,知道了圖像的成像原理,都是一個個的像素點,就是矩陣的值。以后可以利用MATLAB進行圖像處理,運用數學知識,結合計算機知識運用在實際工作中。通過這兩次作業的學習,收獲很大的,之前一直覺得對於程序開發中只要會寫代碼就行,沒有想到很多地方都是要用到數學知識,只是自己沒有考慮到罷了。


免責聲明!

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



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