大津閾值法MATLAB實現

關於大津閾值法的定義這裏不再贅述,直接給出實現代碼:

%image_graythresh.m

function level =image_graythresh(I)

%該函數作用:使用大津閾值法找出圖像分割的閾值

[M,N] = size(I);

%預定義劃分的兩組,分別爲C1、C2。預定義level,用於存放不同劃分時的類間方差

C1 = zeros(1,M*N);

C2 = zeros(1,M*N);

level =zeros(1,M*N);

I = double(I);         %將原圖像uint8型轉換爲double型

%求出原圖像灰度最大、最小值

min_value =min(min(I));                                              

max_value =max(max(I));

%定義C1、C2、level的下標,同時起統計個數的作用

columns1 = 1;

columns2 = 1;

columns3 = 1;

%開始遍歷

for k =min_value:max_value - 1

    for i = 1:M

        for j = 1:N

            if I(i,j)<=k

                C1(columns1)  = I(i,j);        %得分組C1

                columns1 = columns1 + 1;

            else

                C2(columns2)  = I(i,j);        %得到分組C2

                columns2 = columns2 + 1;

            end

        end

    end

       %得到C1、C2的概率

    posibility1 = (columns1-1) / (M*N);

    posibility2 = 1 - posibility1;

       %得到C1、C2的均值

%由於預定義個數大於實際個數,因而求均值時不記錄多餘的零

    ave1 = sum(C1)/numel(find(C1~=0));        

    ave2 = sum(C2)/numel(find(C2~=0));        

       %得到類間方差,存放在leve中

    std = posibility1*posibility2*(ave1 -ave2)^2;

    level(columns3) = std;

    columns3 = columns3 + 1;

    columns1 = 1;

    columns2 = 1;

    C1 = zeros(1,M*N);

    C2 = zeros(1,M*N);

end

%得到最大類間方差下標從而得到閾值

[~, i] =max(level);

level = min_value +i - 1;

%對閾值做歸一化處理

level = level/255;

end

%DIP_exp4_1.m

%該m文件調用Matlab自帶函數graythresh以及自編函數image_graythresh對圖像進行閾值分割

clc;clear;closeall;

I =imread('cameraman.tif');

level =graythresh(I);            %得到大津閾值法閾值(Matlab自帶函數)

J = im2bw(I,level);              %實現圖像二值化,即非黑即白

level1 =image_graythresh(I);              %得到大津閾值法閾值(自編函數)

K =im2bw(I,level1);                   

subplot(221),imshow(I);title('原圖像');

subplot(222),imshow(J);title('大津法閾值分割後圖像');

subplot(223),imshow(I);title('原圖像');

subplot(224),imshow(K);title('自編大津法閾值分割後圖像');

運行DIP_exp4_1.m文件得結果如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章