图像的阈值分割(迭代法选择阈值)


迭代法阈值选择算法是对双峰法的改进,他首先选择一个近似的阈值T,将图像分割成两个部分,R1和R2,计算出区域R1和R2的均值u1和u2,再选择新的

阈值T=(u1+u2)/2;

重复上面的过程,知道u1和u2不在变化为止,

图像的阈值分割(迭代法选择阈值)_第1张图片


详细过程的代码:

<span style="font-size:18px;"><strong>clc;
clear all;
close all;
I=imread('lena.jpg');
%设置初始阈值   去最大值和最小值的中间值
zmax=max(max(I));
zmin=min(min(I));
tk=(zmax+zmin)/2;
%根据阈值将图像进行分割为前景和背景,分别求出两者的平均灰度  zo和zb
b=1;
[m n]=size(I);
while (b)
        ifg=0;
        ibg=0;
        fnum=0;
        bnum=0;
        for i=1:m
            for j=1:n
                tmp=I(i,j);
                if(tmp>=tk)
                    ifg=ifg+1;
                    fnum=fnum+double(tmp);  %前景像素的个数以及像素值的总和
                else
                    ibg=ibg+1;
                    bnum=bnum+double(tmp);%背景像素的个数以及像素值的总和
                end
            end
        end
        %计算前景和背景的平均值
        zo=fnum/ifg;
        zb=bnum/ibg;
        if(tk==(uint8((zo+zb)/2)))
            b=0;
        else
            tk=uint8((zo+zb)/2);
        end
        %当阈值不变换时,退出迭代
end
disp(strcat('迭代的阈值',num2str(tk)));
I1=im2bw(I,double(tk)/255);
imshow(I1)
                
                </strong></span>

简单的代码:

%读入图像,并进行灰度转换
A=imread('baihe.jpg');
B=rgb2gray(A);
%初始化阈值
T=0.5*(double(min(B(:)))+double(max(B(:))));
d=false;
%通过迭代求最佳阈值
while~d
     g=B>=T;
     Tn=0.5*(mean(B(g))+mean(B(~g)));
     d=abs(T-Tn)<0.5;
     T=Tn;
end
% 根据最佳阈值进行图像分割
level=Tn/255;
BW=im2bw(B,level);
% 显示分割结果
subplot(121),imshow(A)
subplot(122),imshow(BW)


你可能感兴趣的:(图像的阈值分割(迭代法选择阈值))