matlab图像处理--预迭代阈值分割


预迭代阈值分割:图像分割关键在于找到最佳阈值,通过迭代方式逼近最佳阈值,是图像分割的有效办法。

算法思路:

    例如: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);
              





猜你喜欢

转载自blog.csdn.net/weixin_41721222/article/details/80212441
今日推荐