MATLAB小技巧(5)kittler二值化分割算法
前言
MATLAB进行图像处理相关的学习是非常友好的,可以从零开始,对基础的图像处理都已经有了封装好的许多可直接调用的函数,这个系列文章的话主要就是介绍一些大家在MATLAB中常用一些概念函数进行例程演示!
最小误差法是KITTLER1984年在MINIMUM ERROR THRESHOLDING文章中提出的一种基于直方图的阈值分割方法,简称KITTLER算法。其思想:假设灰度图像由目标和背景组成,且目标和背景满足一混合高斯分布,计算目标和背景的均值、方差,根据最小分类误差思想得到的最小误差目标函数,取目标函数最小时的阈值即为最佳阈值。按此阈值将图像分割为二值图像。
一. MATLAB仿真
clc;clear;close;
[filename,pathname]=uigetfile('*.jpg;*.png;*.bmp','select the file');
im=[pathname,filename];
A = imread(im);
imagBW = kittlerMet(A);
figure(1),imshow(A),title('原图');
figure(2),imshow(imagBW),title('KITTLERMET阈值二值化分割图');
function imagBW = kittlerMet(imag)
% KITTLERMET binarizes a gray scale image 'imag' into a binary image
% Input:
% imag: the gray scale image, with black foreground(0), and white
% background(255).
% Output:
% imagBW: the binary image of the gray scale image 'imag', with kittler's
% minimum error thresholding algorithm.
% Reference:
% 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 are the histogram. x is the intensity level.
GradeI = length(x); % the resolusion of the intensity. i.e. 256 for uint8.
J_t = zeros(GradeI, 1); % criterion function
prob = counts ./ sum(counts); % Probability distribution
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
二. 仿真结果
三. 小结
二值化分割是图像处理中最基础的变换,主要核心就在于找到一个最优阈值对图像进行分割,从而实现背景与前景的分割。图像二值化的经典算法,全局阈值法如大津法、kittler法;局部阈值法如niblack法等均已介绍仿真完毕。每天学一个MATLAB小知识,大家一起来学习进步阿!