1. 程式人生 > >matlab影象處理--預迭代閾值分割

matlab影象處理--預迭代閾值分割


預迭代閾值分割:影象分割關鍵在於找到最佳閾值,通過迭代方式逼近最佳閾值,是影象分割的有效辦法。

演算法思路:

    例如:1,99 

    取2,50,98都能分割1和99,但是50與1和99差別最大,為最佳閾值。可以看出兩個數的中間值為最佳閾值。哪倆個部分呢?

    例如:1,2,98,99

    我們假設40作為閾值,得到1,2作為A部分,得到98,99作為B部分。A部分均值為1.5,B部分均值為98.5,中間值為50,50與假設值40誤差過大,繼續取50作於閾值重複上述步驟,得到50為最佳閾值。

    但是,在影象中可不止上述幾個數的存在。實際上,不停的劃分閾值,其A與B部分的均值必然會不斷改變,只能用逼近的方法,即設T1為分割閾值時,A與B部分均值的中間值為T2,若T1與T2的誤差很小時,也就是T1約等於T2時,此時的T2或者T1就是最佳閾值。

 程式如下:

close;clear;clc;
I=im2double(imread('coins.png'));     %讀入影象,轉換為雙精度型別
level=0.001;                           %預設兩閾值之間的誤差

max_I=max(I(:));                      %得到最大灰度值
min_I=min(I(:));                      %得到最小灰度值
T1=1/2*(max_I+min_I);                  %假設初始閾值
[M,N]=size(I);                        %得到影象行列數

A_number=0;                           %初始化A部分總畫素值
B_number=0;                           %初始化B部分總畫素值
A_all=0;                              %初始化A部分總灰度值
B_all=0;                              %初始化B部分總灰度值
for i=1:M
    for j=1:N
        if (I(i,j)>=T1)
            A_number=A_number+1;      %A部分總畫素值
            A_all=A_all+I(i,j);       %A部分總灰度值
        elseif (I(i,j)<T1)
            B_number=B_number+1;      %A部分總畫素值
            B_all=B_all+I(i,j);       %B部分總灰度值
        end
    end
end
A_ave=A_all/A_number;                 %A部分灰度均值
B_ave=B_all/B_number;                 %B部分灰度均值
T2=1/2*(A_ave+B_ave);                 %A與B灰度均值的中間值,即新閾值
while (abs(T2-T1)>level)              %判斷T1與T2之間的誤差絕對值是否大於設定值
    T1=T2;                            %把T2賦給T1,反覆重複上述程式,直到T2-T1的絕對值小於設定值為止 
    A_number=0;
    B_number=0;
    A_all=0;
    B_all=0;
    for i=1:M
        for j=1:N
            if (I(i,j)>=T1)
                A_number=A_number+1;
                A_all=A_all+I(i,j);
            elseif (I(i,j)<T1)
                B_number=B_number+1;
                B_all=B_all+I(i,j);
            end
        end
    end
    A_ave=A_all/A_number;
    B_ave=B_all/B_number;  
    T2=1/2*(A_ave+B_ave); 
end                                    %T1與T2之間的誤差絕對值小於設定值時,跳出迴圈

T2*255
J=im2bw(I,T2);                         %把影象轉換為二值圖,進行閾值為T2的影象分割
figure(1);
subplot(121);imshow(I);
subplot(122);imshow(J);