影象的閾值分割(迭代法選擇閾值)
阿新 • • 發佈:2019-01-11
迭代法閾值選擇演算法是對雙峰法的改進,他首先選擇一個近似的閾值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)