【图像分割】自适应阈值图像分割方法(最大类间差法与最大熵法)

文章目录

  • 前言
  • 一、分割原理
    • 1.最大类间差法
    • 2.最大熵法
  • 二、代码与结果展示
    • 1.最大类间差法
    • 2.最大熵法
  • 总结


前言

最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适合于双峰情况的自动求取阈值的方法,又叫大津法,简称Otsu。它是按图像的灰度特性,将图像分成背景和目标2部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
利用图像熵为准则进行图像分割是由Kapuret提出来,是现在仍然使用较广的一种图像熵分割方法。原论文《A New Method forGray-Level Picture ThresholdingUsing the Entropy of the Histogram》,在百度学术上可以免费下载。


提示:以下是本篇文章正文内容,下面案例可供参考

一、分割原理

假设阈值t的灰度范围为0,1,···,L-1,设灰度级为i的像素出现的概率为:
在这里插入图片描述

1.最大类间差法

将图像分为前景和背景两部分:
【图像分割】自适应阈值图像分割方法(最大类间差法与最大熵法)_第1张图片

2.最大熵法

【图像分割】自适应阈值图像分割方法(最大类间差法与最大熵法)_第2张图片

二、代码与结果展示

1.最大类间差法

代码如下(示例):

clear;clc;close all;
Imag = imread('24063.jpg'); 
Imag=rgb2gray(Imag);
Image_OSTU=OSTU(Imag);

function Image_OSTU=OSTU(Imag)
Image_OSTU = Imag;
imhist(Imag); 
[height,length]=size(Imag);
totalNum=height*length;

pixelCount=zeros(1,256);%统计各个像素值的个数
for i=1:length
    for j=1:height
        number=Imag(j,i)+1;
        pixelCount(number)=pixelCount(number)+1;
    end
end

pi=pixelCount/totalNum;  %pi 灰度级为i的像素出现的概率
deltaMax=0;
a=1:256;

maxmax=max(max(Imag));
for i=1:maxmax
    w0=sum(pi(1:i));
    w1=1-w0;
    mean0=sum(pi(1:i).*a(1:i))/w0;
    mean1=sum(pi(i+1:maxmax).*a(i+1:maxmax))/w1;
    delta=w0*w1*(mean0-mean1)^2;
    if delta>deltaMax
        deltaMax=delta;
        threshold=i;
    end   
end

for i=1:length
    for j=1:height
        if Image_OSTU(j,i)>=threshold
            Image_OSTU(j,i)=255;
        else
            Image_OSTU(j,i)=0;
        end
    end
end

imshow(Image_OSTU);
xlabel(['最大类间差法阈值', num2str(threshold)]);
end

原图及处理结果如下(示例):

【图像分割】自适应阈值图像分割方法(最大类间差法与最大熵法)_第3张图片
【图像分割】自适应阈值图像分割方法(最大类间差法与最大熵法)_第4张图片

2.最大熵法

代码如下(示例):

clear;clc;close all;
Imag = imread('24063.jpg');
Imag=rgb2gray(Imag);
Image_MaxEntropy=MaxEntropy(Imag);

function Image_MaxEntropy=MaxEntropy(Imag)
Image_MaxEntropy = Imag;
imhist(Imag); 
[height,length]=size(Imag);
totalNum=height*length;

pixelCount=zeros(1,256);%统计各个像素值的个数
for i=1:length
    for j=1:height
        number=Imag(j,i)+1;
        pixelCount(number)=pixelCount(number)+1;
    end
end

pi=pixelCount/totalNum;  %pi 灰度级为i的像素出现的概率
deltaMax=0;

for i=1:256
    w0=sum(pi(1:i));
    w1=1-w0;
   H0=0;
   H1=0;
    for j=1:i
        if w0 > 0 && pi(1,j)/w0 ~=0
            H0 = H0 - (pi(1,j)/w0).*log(pi(1,j)/w0); %计算各个阈值下的前景熵
        else
            H0 = H0;
        end  
    end
    
    for j=i+1:256
        if w1 > 0 && pi(1,j)/w1 ~=0
            H1 = H1 - (pi(1,j)/w1).*log(pi(1,j)/w1); %计算各个阈值下的背景熵
        else
            H1 = H1;
        end  
    end
    delta=H0+H1;
    if delta>deltaMax
        deltaMax=delta;%if语句内,要满足一个条件才能改这一变量赋值,如果运行时输入的数据不满足,那么这个变量就没有被赋值,也就是未定义
        threshold=i;
    end   
end

for i=1:length
    for j=1:height
        if Image_MaxEntropy(j,i)>=threshold
            Image_MaxEntropy(j,i)=255;
        else
            Image_MaxEntropy(j,i)=0;
        end
    end
end

imshow(Image_MaxEntropy);
xlabel(['最大熵法阈值', num2str(threshold)]);
end


原图及处理结果如下(示例):

【图像分割】自适应阈值图像分割方法(最大类间差法与最大熵法)_第5张图片
【图像分割】自适应阈值图像分割方法(最大类间差法与最大熵法)_第6张图片


总结

以上就是今天要分享的内容,本文仅仅简单介绍了最大类间差法的原理及代码示例,希望可以对你有所帮助!进一步地改进可用于自适应多阈值分割,具体算法及优化方法可以参考博客 [【图像分割】利用粒子群算法与遗传算法实现图像的自适应多阈值的快速分割](https://blog.csdn.net/weixin_44842748/article/details/116980597)

你可能感兴趣的:(图像处理,计算机视觉)