前言
最大类间方差法是由日本学者大津(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
原图及处理结果如下(示例):