• 【老生谈算法】matlab实现图像阈值分割算法——图像阈值分割


    基于Matlab数字图像处理-图像阈值分割算法研究

    1 迭代法实践代码:

    clc;
    clear all;
    f=imread('cat.bmp');
    f=rgb2gray(f);
    f=im2double(f);
    T=0.5*(min(f(:))+max(f(:)));
    done=false;
    while ~done
    g=f>=T;
    Tn=0.5*(mean(f(g))+mean(f(~g)));
    done=abs(T-Tn)<0.1;
    T=Tn;
    end
    T
    r=im2bw(f,T);
    subplot(121),imshow(f),title('原图');
    subplot(122),imshow(r),title('阈值分割算法研究--迭代法');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2 迭代法实践截图:
    在这里插入图片描述

    3 均匀性度量法实践代码:

    clc;
    clear all;
    I=imread('cat.bmp');
    I=rgb2gray(I);
    I=double(I);
    [m,n]=size(I);
    Smin=-1;
    for T=0:255
    sum1=0; num1=0;
    sum2=0; num2=0;
    for i=1:m
    for j=1:n
    if I(i,j)>=T
    sum2=sum2+I(i,j);
    num2=num2+1;
    else
    sum1=sum1+I(i,j);
    num1=num1+1;
    end
    end
    end
    ave1=sum1/num1;
    ave2=sum2/num2;
    d1=-1;
    d2=-1;
    for i=1:m
    for j=1:n
    if I(i,j)>=T
    d=(I(i,j)-ave2)^2;
    if d2==-1
    d2=d;
    else
    d2=d2+d;
    end
    else
    d=(I(i,j)-ave1)^2;
    if d1==-1
    d1=d;
    else
    d1=d1+d;
    end
    end
    end
    end
    p1=num1/(m*n);
    p2=num2/(m*n);
    S=p1*d1+p2*d2;
    if(Smin==-1)
    Smin=S;
    else
    if(S<Smin)
    Smin=S;
    Th=T;
    end
    end
    end
    Th
    subplot(121),imshow(uint8(I)),title('原图');
    for i=1:m
    for j=1:n
    if I(i,j)>=Th
    I(i,j)=255;
    else
    I(i,j)=0;
    end
    end
    end
    subplot(122),imshow(I),title('阈值分割算法研究--均匀性度量法');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    4 均匀性度量法实践截图:
    在这里插入图片描述

    5 类间最大距离法实践代码:

    clc;
    clear all;
    I=imread('cat.bmp');
    I=rgb2gray(I);
    I=double(I);
    [m,n]=size(I);
    Smax=0;
    for T=0:255
    sum1=0; num1=0;
    sum2=0; num2=0;
    for i=1:m
    for j=1:n
    if I(i,j)>=T
    sum2=sum2+I(i,j);
    num2=num2+1;
    else
    sum1=sum1+I(i,j);
    num1=num1+1;
    end
    end
    end
    ave1=sum1/num1;
    ave2=sum2/num2;
    S=((ave2-T)*(T-ave1))/(ave2-ave1)^2;
    if(S>Smax)
    Smax=S;
    Th=T;
    end
    end
    Th
    subplot(121),imshow(uint8(I)),title('原图');
    for i=1:m
    for j=1:n
    if I(i,j)>=Th
    I(i,j)=255;
    else
    I(i,j)=0;
    end
    end
    end
    subplot(122),imshow(I),title('阈值分割算法研究--类间最大距离法');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    6 类间最大距离法实践截图:
    在这里插入图片描述

    7 最大类内类间方差比法实践代码:

    clc;
    clear all;
    I=imread('cat.bmp');
    I=rgb2gray(I);
    I=double(I);
    [m,n]=size(I);
    Smax=-1;
    for T=0:255
    sum1=0; num1=0;
    sum2=0; num2=0;
    for i=1:m
    for j=1:n
    if I(i,j)>=T
    sum2=sum2+I(i,j);
    num2=num2+1;
    else
    sum1=sum1+I(i,j);
    num1=num1+1;
    end
    end
    end
    ave1=sum1/num1;
    ave2=sum2/num2;
    ave=(sum1+sum2)/(m*n);
    d1=-1;
    d2=-1;
    for i=1:m
    for j=1:n
    if I(i,j)>=T
    d=(I(i,j)-ave2)^2;
    if d2==-1
    d2=d;
    else
    d2=d2+d;
    end
    else
    d=(I(i,j)-ave1)^2;
    if d1==-1
    d1=d;
    else
    d1=d1+d;
    end
    end
    end
    end
    p1=num1/(m*n);
    p2=num2/(m*n);
    S1=p1*(ave1-ave)^2+p2*(ave2-ave)^2;
    S2=p1*d1+p2*d2;
    S=S1/S2;
    if S>Smax
    Smax=S;
    Th=T;
    end
    end
    Th
    subplot(121),imshow(uint8(I)),title('原图');
    for i=1:m
    for j=1:n
    if I(i,j)>=Th
    I(i,j)=255;
    else
    I(i,j)=0;
    end
    end
    end
    subplot(122),imshow(I),title('阈值分割算法研究--最大类内类间方差比法');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    8 最大类内类间方差比法实践截图:
    在这里插入图片描述

    9 最大熵法实践代码:

    clc;
    clear all;
    I=imread('cat.bmp');
    I=rgb2gray(I);
    subplot(121),imshow(I);title('原始图像');
    h=imhist(I);
    h1=h;
    len=length(h);
    [m,n]=size(I);
    h1=h1/(m*n);
    for i=1:(len-1)
    if h(i)~=0
    P1=sum(h1(1:i));
    P2=sum(h1((i+1):len));
    else
    continue;
    end
    H1(i)=-(sum(P1.*log(P1)));
    H2(i)=-(sum(P2.*log(P2)));
    H(i)=H1(i)+H2(i);
    end
    m1=max(H);
    Th=find(H==m1);
    Th
    for i=1:m
    for j=1:n
    if I(i,j)>=Th
    I(i,j)=255;
    else
    I(i,j)=0;
    end
    end
    end
    subplot(122),imshow(I);title('阈值分割算法研究--最大熵法');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    10 最大熵法实践截图:
    在这里插入图片描述

    11 局部阈值实践代码:

    clc;
    clear all;
    I=imread('cat.bmp');
    I=rgb2gray(I);
    I=im2double(I);
    subplot(121),imshow(I),title('原图');
    se=strel('disk',10);
    ft=imtophat(I,se);
    Th=graythresh(ft);
    Th
    G=im2bw(ft,Th);
    subplot(122),imshow(G),title('局部阈值');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    12 局部阈值实践截图:

    在这里插入图片描述

  • 相关阅读:
    ASEMI新能源快恢复桥EGBJ5006/HGBJ5006
    人工智能基础_机器学习007_高斯分布_概率计算_最小二乘法推导_得出损失函数---人工智能工作笔记0047
    KDD2022 | 基于图表示的推荐算法教程
    Deepfake!黑客冒充非洲联盟主席与多位欧洲领导人通话
    数据中心机房供电配电及能效管理系统设计
    C++ 语言学习 day10 复习(1)
    大数据开发——Hive实战案例
    myCat实现分库分表
    Python爬虫基础(二):使用xpath与jsonpath解析爬取的数据
    数字图像滤波的本质
  • 原文地址:https://blog.csdn.net/m0_53407570/article/details/125453437