kittler算法matlab函数-图像二值化分割

二值化的目的

为什么要对图像进行二值化?比如有一张灰度图,其中包含背景和感兴趣物体,例如图1中包含背景、人、摄像机,我们想要把感兴趣的物体提取出来,就可以通过二值化来实现这个目的。
在这里插入图片描述

图1 灰度图和二值化操作

灰度图的像素值是0-255之间的数,二值化之后像素值的大小不是1就是0。二值化基本原理是将图像中的灰度级别进行分类,将其分为两个区域,其中一个区域的灰度值被赋为黑色,另一个区域则被赋为白色。二值化的应用非常广泛,常用于图像处理、计算机视觉、模式识别等领域。常见的二值化的实现一般有: 全局阈值法、自适应阈值法、OTSU二值化等。

kittler算法原理

最小误差法是KITTLER1984年在MINIMUM ERROR THRESHOLDING文章中提出的一种基于直方图的阈值分割方法,简称KITTLER算法。其思想:假设灰度图像由目标和背景组成,且目标和背景满足一混合高斯分布,计算目标和背景的均值、方差,根据最小分类误差思想得到的最小误差目标函数,取目标函数最小时的阈值即为最佳阈值。按此阈值将图像分割为二值图像。
Kittler算法,特别是Kittler二值化方法,是一种基于直方图的经典图像分割算法。其原理可以从以下几个方面进行阐述:

基本假设与背景

Kittler算法假设灰度图像由目标和背景组成,且这两部分满足一定的统计分布,通常是混合高斯分布。在此基础上,算法的目标是通过计算找到一个最优的阈值,使得图像根据这个阈值被分割成二值图像时,分类误差达到最小。

核心思想

Kittler算法的核心思想是基于最小分类误差准则。它试图找到一个阈值,使得图像中的目标和背景被正确分类的概率最大化,或者等价地说,使得分类误差最小化。这个最优阈值是通过求解一个目标函数来得到的,该目标函数反映了分类误差的大小。

实现步骤

计算直方图:首先,需要计算图像的灰度直方图,以获取每个灰度级上的像素数量。
估计统计参数:根据直方图,估计目标和背景的均值、方差等统计参数。这些参数将用于后续的分类决策。
构建目标函数:基于最小分类误差的思想,构建一个目标函数。该函数通常涉及到概率分布、均值、方差等统计参数,并反映了在不同阈值下分类误差的大小。
求解最优阈值:通过求解目标函数的最小值,找到最优的阈值。这个阈值将使得分类误差达到最小。
应用阈值进行分割:最后,使用找到的最优阈值对图像进行二值化分割,得到二值图像。
计算步骤如下所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

应用场景与优势

Kittler算法特别适用于双峰且差异明显的图像分割,例如工业视觉中的零部件分割。在这些场景中,目标和背景的灰度分布通常具有明显的双峰特性,使得Kittler算法能够取得很好的分割效果。此外,相比于其他阈值分割方法,如大津法(OTSU)等,Kittler算法在某些情况下可能具有更高的分割精度和稳定性。

注意事项

尽管Kittler算法在许多场景下表现出色,但它也具有一定的局限性。例如,当图像的灰度分布不满足混合高斯分布假设时,或者当目标和背景的灰度差异不明显时,算法的分割效果可能会受到影响。因此,在实际应用中需要根据具体情况选择合适的算法和参数。

kittler二值化matlab代码

数据读取

这个代码包含两部分,一是读取图像,而是采用kittler算法进行二值化处理。
首先是读取文件,可以采用交互式读取:

[filename,pathname]=uigetfile('*.jpg;*.png;*.bmp','select the file'); 
im=[pathname,filename]; 
A = imread(im);

也可以通过命令在指定文件下读取:

pathname = 'E:\其他资料\matlab测试图\img';%假设文件夹下有相应文件
filename = 'lena_gray_512.tif'; %文件名
A = imread(strcat(pathname,'\',filename));
imshow(A);                % 显示图像

如果没有lena测试图,请在这里下载: lena
在这里插入图片描述

图2 灰度图
进行二值化
imagBW = kittlerMet(A); %采用kitter算法进行二值化
figure(2),imshow(imagBW),title('KITTLERMET阈值二值化分割图');

在这里插入图片描述

图3 二值化
kittler函数
function imagBW = kittlerMet(imag) 
% 采用kittler最小误差阈值分割算法将一个灰度图二值化为
%  输入:
%  imag:灰度图,黑色对应0像素值,255对应256像素值
%  输出:
%   imagBW: 二值化图像
%  参考文心: 
%   J. Kittler and J. Illingworth. Minimum Error Thresholding. Pattern 
%   Recognition. 1986. 19(1):41-47 
MAXD = 100000; 
imag = imag(:,:,1); 
[counts, x] = imhist(imag);  % counts 是直方图. x 直方图容器数量,即柱形的条数. 
GradeI = length(x);   % 密度函数分辨率. i.e. 256 for uint8. 
J_t = zeros(GradeI, 1);  % criterion function 
prob = counts ./ sum(counts);  % 概率分布
meanT = x' * prob;  % Total mean level of the picture 
% Initialization 
w0 = prob(1);   % Probability of the first class 
miuK = 0;   % First-order cumulative moments of the histogram up to the kth level. 
J_t(1) = MAXD;  
n = GradeI-1; 
for i = 1 : n 
    w0 = w0 + prob(i+1); 
    miuK = miuK + i * prob(i+1);  % first-order cumulative moment 
    if (w0 == 0) || (w0 == 1) 
        J_t(i+1) = MAXD;    % T = i 
    else 
        miu1 = miuK / w0; 
        miu2 = (meanT-miuK) / (1-w0); 
        var1 = (((0 : i)'-miu1).^2)' * prob(1 : i+1); 
        var1 = var1 / w0;  % variance 
        var2 = (((i+1 : n)'-miu2).^2)' * prob(i+2 : n+1); 
        var2 = var2 / (1-w0); 
        if var1 > 0 && var2 > 0   % in case of var1=0 or var2 =0 
            J_t(i+1) = 1+w0 * log(var1)+(1-w0) * log(var2)-2*w0*log(w0)-2*(1-w0)*log(1-w0); 
        else 
            J_t(i+1) = MAXD; 
        end 
    end 
end 
minJ = min(J_t); 
index = find(J_t == minJ); 
th = mean(index); 
th = (th-1)/n 
imagBW = im2bw(imag, th); 
 
% figure, imshow(imagBW), title('kittler binary'); 
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nwsuaf_huasir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值