目录
一、什么是Otsu算法?
简单点说是基于图像的全局灰度数组找到一个灰度阈值,利用该阈值对图像进行二值化处理的算法即Otsu算法,听着很厉害吧?其实很简单。
二、核心原理
这个算法的核心就是如何找到该阈值,依据什么来确定这个二值化的阈值呢?既然是基于全局的,那么必然要了解该图像全局统计特性,所以该阈值是实际上求解的是类间方差最大值,求出该值就能找到灰度阈值。
三、变量定义与编写思想
3.1首先出待处理图像归一化直方图分量:
3.2任选一个阈值T(方便遍历从1开始)![](https://img-blog.csdnimg.cn/c0c862708f1044d58dffcc63aef69748.png)
3.3求出C1、C2对应的累计概率:
3.4求阈值对应直方图累加均值
3.5求整个图像平均灰度(可在任意步骤求解)
3.6类间方差最大值
四、代码实现
clear; clc; close all; I = imread('polymersomes.tif'); [h,w]=size(I); xs=zeros(1,256); kt=10; for i=1:h for j=1:w k=I(i,j); xs(k+1)=xs(k+1)+1; end end %% pi=zeros(1,255); mG=0; %mG for i = 1:255 pi(i)=xs(i)/h/w; mG=mG+i*pi(i); end sigmb=zeros(1,255); for kt = 1:255 mk=0;p1=0; %P1(k) for i = 1:255 if(i<=kt) p1 = p1+pi(i); end end %求m(k) for i = 1:kt mk = mk+i*pi(i); end p2=1-p1; sigmb(kt)=((mG*p1-mk)^2)/p1/p2; end %% [m,sigm]=max(sigmb); I2=im2bw(I,sigm/255); figure,imshow(I2); histogram(I);xlim([0,255]);
五、实验结果展示
待处理图片学过数图都应该有,这里就不给了(是一个聚合细胞的光学显微镜图像),最后大部分图片来自数图课PPt,代码原创,复制慎用,如有错误请大佬指正。