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


前言

最大类间方差法是由日本学者大津(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.最大类间差法

将图像分为前景和背景两部分:
在这里插入图片描述

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

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

原图
在这里插入图片描述

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


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

原图
在这里插入图片描述


总结

以上就是今天要分享的内容,本文仅仅简单介绍了最大类间差法的原理及代码示例,希望可以对你有所帮助!进一步地改进可用于自适应多阈值分割,具体算法及优化方法可以参考博客 [【图像分割】利用粒子群算法与遗传算法实现图像的自适应多阈值的快速分割](https://blog.csdn.net/weixin_44842748/article/details/116980597)
  • 7
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
灰度图像的最大熵阈值分割是一种常用的图像分割方法,它可以将图像分成两类,以使得分割后的图像信息熵最大。以下是 MATLAB 实现最大熵阈值分割的基本步骤: 1. 读取灰度图像并将其转换为二维数组。 ```matlab img = imread('image.jpg'); gray_img = rgb2gray(img); [m, n] = size(gray_img); ``` 2. 计算图像直方图并归一化。 ```matlab histogram = imhist(gray_img); normalized_hist = histogram / (m * n); ``` 3. 初始化最大熵最大熵阈值。 ```matlab max_entropy = 0; max_threshold = 0; ``` 4. 遍历所有可能的阈值,并计算分割后的两个子图像的信息熵。 ```matlab for threshold = 1:255 % 计算两个子图像的像素个数和像素值出现次数 pixel_count = zeros(2, 256); for i = 1:m for j = 1:n pixel_value = gray_img(i, j); if pixel_value <= threshold pixel_count(1, pixel_value + 1) = pixel_count(1, pixel_value + 1) + 1; else pixel_count(2, pixel_value + 1) = pixel_count(2, pixel_value + 1) + 1; end end end % 归一化两个子图像的像素值出现次数 normalized_pixel_count = pixel_count / (m * n); % 计算两个子图像的信息熵 entropy = -sum(sum(normalized_pixel_count .* log2(normalized_pixel_count + eps))); % 更新最大熵最大熵阈值 if entropy > max_entropy max_entropy = entropy; max_threshold = threshold; end end ``` 5. 根据最大熵阈值对图像进行分割。 ```matlab binary_img = gray_img > max_threshold; ``` 完整的代码如下: ```matlab img = imread('image.jpg'); gray_img = rgb2gray(img); [m, n] = size(gray_img); histogram = imhist(gray_img); normalized_hist = histogram / (m * n); max_entropy = 0; max_threshold = 0; for threshold = 1:255 pixel_count = zeros(2, 256); for i = 1:m for j = 1:n pixel_value = gray_img(i, j); if pixel_value <= threshold pixel_count(1, pixel_value + 1) = pixel_count(1, pixel_value + 1) + 1; else pixel_count(2, pixel_value + 1) = pixel_count(2, pixel_value + 1) + 1; end end end normalized_pixel_count = pixel_count / (m * n); entropy = -sum(sum(normalized_pixel_count .* log2(normalized_pixel_count + eps))); if entropy > max_entropy max_entropy = entropy; max_threshold = threshold; end end binary_img = gray_img > max_threshold; figure; subplot(1, 2, 1); imshow(gray_img); title('原图'); subplot(1, 2, 2); imshow(binary_img); title('分割后的二值图'); ``` 运行结果如下图所示: ![最大熵阈值分割结果](https://img-blog.csdn.net/20180925102938416?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Rlc3Rfd2Vic2l0ZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/70)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值