matlab影象處理--預迭代閾值分割
阿新 • • 發佈:2019-01-13
預迭代閾值分割:影象分割關鍵在於找到最佳閾值,通過迭代方式逼近最佳閾值,是影象分割的有效辦法。
演算法思路:
例如: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);