1. 程式人生 > >影象的閾值分割(迭代法選擇閾值)

影象的閾值分割(迭代法選擇閾值)

迭代法閾值選擇演算法是對雙峰法的改進,他首先選擇一個近似的閾值T,將影象分割成兩個部分,R1和R2,計算出區域R1和R2的均值u1和u2,再選擇新的

閾值T=(u1+u2)/2;

重複上面的過程,知道u1和u2不在變化為止,


詳細過程的程式碼:

<span style="font-size:18px;"><strong>clc;
clear all;
close all;
I=imread('lena.jpg');
%設定初始閾值   去最大值和最小值的中間值
zmax=max(max(I));
zmin=min(min(I));
tk=(zmax+zmin)/2;
%根據閾值將影象進行分割為前景和背景,分別求出兩者的平均灰度  zo和zb
b=1;
[m n]=size(I);
while (b)
        ifg=0;
        ibg=0;
        fnum=0;
        bnum=0;
        for i=1:m
            for j=1:n
                tmp=I(i,j);
                if(tmp>=tk)
                    ifg=ifg+1;
                    fnum=fnum+double(tmp);  %前景畫素的個數以及畫素值的總和
                else
                    ibg=ibg+1;
                    bnum=bnum+double(tmp);%背景畫素的個數以及畫素值的總和
                end
            end
        end
        %計算前景和背景的平均值
        zo=fnum/ifg;
        zb=bnum/ibg;
        if(tk==(uint8((zo+zb)/2)))
            b=0;
        else
            tk=uint8((zo+zb)/2);
        end
        %當閾值不變換時,退出迭代
end
disp(strcat('迭代的閾值',num2str(tk)));
I1=im2bw(I,double(tk)/255);
imshow(I1)
                
                </strong></span>

簡單的程式碼:

%讀入影象,並進行灰度轉換
A=imread('baihe.jpg');
B=rgb2gray(A);
%初始化閾值
T=0.5*(double(min(B(:)))+double(max(B(:))));
d=false;
%通過迭代求最佳閾值
while~d
     g=B>=T;
     Tn=0.5*(mean(B(g))+mean(B(~g)));
     d=abs(T-Tn)<0.5;
     T=Tn;
end
% 根據最佳閾值進行影象分割
level=Tn/255;
BW=im2bw(B,level);
% 顯示分割結果
subplot(121),imshow(A)
subplot(122),imshow(BW)