大津阈值法MATLAB实现(自编)
关于大津阈值法的定义这里不再赘述,直接给出实现代码:
%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文件得结果如下: