Otsu全局阈值法图像二值化分割的简易实现

1.实现思路:

Otsu全局阈值法图像二值化分割的简易实现_第1张图片

2.题目:

        试编写程序统计图像灰度直方图,利用Otsu法对一幅图像进行分割,并给出阈值和可分性度量。

3.Matlab代码实现:

  3.1Matlab 图像工具箱提供了graythresh 函数(Ostu 法)计算阈值。

level = graythresh(I);      %level 是一个在[0,1]之间的数,给出了分割阈值;
[level,EM] = graythresh(I); %EM 给出了可分性度量

  3.2自己编写Otsu法(最大类间方差法)图像分割程序。

clear;clc;close all;
I = imread('polymersomes.tif');
figure('name','原图');imshow(I);
[M,N] = size(I);	           %长*宽
sum_pixel = M*N;               %像素点总数
L=max(max(I));                 %L+1代表灰度级别
BW = zeros(size(I));           %Otsu 全局阈值法分割后图

gray_space = zeros(1,L+1);     %统计每灰度级有多少像素
Pi = zeros(1,L+1);             %直方图的各个分量
P1 = zeros(1,L+1);             %直方图的累计分量
P2 = zeros(1,L+1); 
m = zeros(1,L+1);              %累计均值
variance = zeros(1,L);         %类间方差
variance_global = 0;           %全局方差
%% 第0步:获取图片每一像素灰度值
for i =1:M
    for j=1:N
        gray_value = I(i,j);
        number = gray_value+1;%灰度级->下标+1
        gray_space(number)=gray_space(number)+1;
    end
end
%% 第1步:求归一化直方图,Pi(k)代表直方图各个分量
Pi = gray_space/sum_pixel;
%% 第2步:直方图累计和,P1(k)代表累计直方图各个分量
P1 = cumsum(Pi);
%% 第3步:求累积均值m(k)=k*Pi(k)[k为灰度值,0k_best)=255;
I(I<=k_best)=0;
BW=I;
figure('name','自己实现Otsu全局阈值法分割的结果');
imshow(BW);

4.结果:

Otsu全局阈值法图像二值化分割的简易实现_第2张图片

        经验证阈值和可分性度量与书上结果一致。

你可能感兴趣的:(matlab,边缘检测,图像处理)