關於大津閾值法的定義這裏不再贅述,直接給出實現代碼:
%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文件得結果如下: