大津阈值法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文件得结果如下:



猜你喜欢

转载自blog.csdn.net/reason_lee/article/details/80468641