图像二值化的操作,就是寻找一个合适的阈值T,把图像中所有像素值小于等于该阈值的像素点设置为一个像素值,同时把图像中所有像素值大于该阈值的像素点设置为另一个像素值。也就是说,二值化之后整幅图像中只有两种灰度值。对于一帧8位的图像,二值化操作通常是把其像素值设置为0或255,从直观上看就是把具有灰度变化的图像设置为只有黑与白的黑白图像,0值对应黑色,255值对应白色。由此可知,二值化效果的好坏取决于阈值T的选取是否合适,阈值T就相当于黑白色的分界线。

图像二值化的操作在数字图像处理中具有重要作用,该操作把图像变成黑白之后,可以凸显图像的重要轮廓与结构,大大减少运算量。比如在细胞的荧光成像中,常常需要把细胞区域(也即较亮区域)识别出来,很重要的一步就是把荧光成像的图像转换为二值图像,细胞区域为白色,背景区域为黑色,这样才便于检测细胞轮廓,从而识别细胞。

最常用的求阈值算法有大津法和迭代法。本文针对荧光图像的二值化操作,详细讲解这两种算法的原理,同时对迭代法进行改进,使其可以求出更加合适的阈值。

1. 大津法,简称为OTSU算法,属于自适应的阈值确定方法,其核心思路是寻找一个阈值T,把图像的所有像素点分成两类,一类的像素值均小于等于T(背景区域),另一类的像素值均大于T(前景区域),当这两类的类间方差取得最大值时,则认为该T值为最合适的阈值。假设背景区域所有像素点数为n0,其占图像总像素数的比例为p0,平均像素值为m0;前景区域所有像素点数为n1,其占图像总像素数的比例为p1,平均像素值为m1;图像的所有像素点数为n、平均像素值为m。那么有以下关系式:

定义类间方差g为:

那么由以上3式可以得到下式,这就是类间方差的计算公式。

循环遍历图像可能取到的所有像素值作为阈值T,使g取得最大的T值则认为是最合适的阈值。比如8位图像所有可能的取值为0~255,那么分别计算出T取值0~255时的g值,当g值取得最大值,则认为找到了最佳阈值。

使用大津法确定阈值,对一张荧光细胞图像进行二值化,得到的结果如下图所示。可以看到细胞区域基本被标识为白色区域,与背景区域区别开来。

原图

大津法求阈值的二值化结果图

2. 迭代法

迭代法也属于自适应的阈值确定方法,其核心思路是通过多轮迭代运算来一步一步逼近最佳阈值。设置一个初始阈值T0,同样把图像的所有像素点分成两类,一类的像素值均小于等于T0(背景区域),另一类的像素值均大于T0(前景区域),然后分别计算背景区域与前景区域的像素平均值m0、m1,并取m0与m1之和的一半作为下一轮迭代的阈值。如果当前轮迭代得到的阈值与上一轮迭代的阈值相差很小,则结束迭代。迭代流程如下图所示:

使用迭代法求阈值,并对同一张荧光细胞图像进行二值化,得到的结果如下图所示。可以看到细胞区域也基本被识别出来。

迭代法求阈值的二值化结果图

3. 迭代法的改进。当荧光图像的背景亮度与细胞区域亮度的区别不是那么明显,也即背景区域比较亮的时候,使用大津法和迭代法确定阈值,会得到比较差的二值化结果,细胞区域不能很好地与背景区域区别开来。如下图所示,可以看到很大片的背景区域二值化之后也变成了白色。

原图

大津法求阈值的二值化结果图

迭代法求阈值的二值化结果图

由上图可知,由大津法与迭代法取得的阈值,与较亮的背景区域的像素值比较接近,导致较亮的背景区域也被误划分为细胞区域(白色区域)。下面我们对迭代法进行改进,使其求得的阈值更接近细胞区域的像素值,从而与较亮背景区域的像素值区分开来。观察迭代法的阈值更新公式,可以知道该算法每次取m0与m1之和的一半来更新阈值:

为了使阈值更接近m1,我们修改上述公式,增大m1的比重,同时减小m0的比重:

matlab的graythresh函数已经实现了大津法求阈值,所以在此我们不再重复实现,下面仅贴出改进之后的迭代法matlab代码:

% 最佳阈值法获取图像二值化的阈值
% T - 得到的最佳阈值
% I - 输入图像
% allow - 迭代过程中,当前迭代得到的阈值与下一轮迭代得到的阈值之差的绝对值小于allow,则认为找到了最佳阈值function [T] = get_threld(I, allow)[x,y] = size(I);                % 求出图象行列数
b = double(I);       %把图像由整型转换为浮点型           T_current = mean(b(:));  %取图像的均值作为初始阈值T0T_next = 0;                               %TT赋初值
S0 = 0.0;               %为计算灰度大于阈值的元素的灰度总值、个数赋值
n0 = 0.0;
S1 = 0.0;                  %为计算灰度小于阈值的元素的灰度总值、个数赋值
n1 = 0.0;
d = abs(T_current-T_next);
count = 0;
% 记录几次循环
while(d >= allow)                 % 迭代最佳阈值分割算法count = count+1;       %迭代次数加1for i = 1:x      %遍历每一行for j = 1:y  %遍历每一列if b(i,j) >= T_current   %计算图像中所有像素值大于阈值的点的像素值之和S0 = S0 + b(i,j);     n0 = n0 + 1;else             %计算图像中所有像素值小于阈值的点的像素值之和S1 = S1 + b(i,j);n1 = n1 + 1;endendend T0 = S0/n0;   %计算图像中所有像素值大于阈值的点的像素值平均值T1 = S1/n1;   %计算图像中所有像素值小于阈值的点的像素值平均值%T_next = (T0+T1)/2;     %原迭代算法T_next = T1 + (T0-T1)*0.9;  %改进的迭代算法d = abs(T_current-T_next);    %当前迭代得到的阈值与下一轮迭代得到的阈值之差的绝对值T_current = T_next;         %把下一轮迭代的阈值赋值给当前轮迭代的阈值
endmmax = max(max(I));
T = T_current/double(mmax);       %把求得的阈值处以图像的最大像素值进行归一化end

运行以上matlab代码,得到的二值化结果如下图所示。可以看到改进之后的迭代算法求取的阈值,可以很好地区分细胞区域与背景区域。因此我们的小改进还是具有不错的效果的。

改进的迭代法求阈值的二值化结果图

图像二值化的阈值求法相关推荐

  1. OTSU_图像二值化分割阈值的算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

  2. 【医学图像处理】 2 灰度直方图、图像二值化(阈值分割)

    文章目录 1 灰度直方图 1.1 直方图理解 1.2 直方图计算 1.3 直方图均衡化 1.3.1 全局均衡化 1.3.2 自适应(局部)均值化 2 图像二值化(阈值分割) 2.1 二值化理解 2.2 ...

  3. otsu阈值分割算法原理_OTSU_图像二值化分割阈值的算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

  4. VTK修炼之道31:图像二值化_阈值法

    1.阈值法实现图像二值化操作 二值图像和label图像是图像分割中经常用到的两种图像. 二值图像的每个像素只有两种可能的取值,例如0或者255.通常0代表图像的背景,而255代码图像前景.图像二值化是 ...

  5. java 图像二值化阀值,阈值 二值化图像程序

    在Matlab中将一幅图像阈值分割二值化非常简单,若需要通过阈值th2二值化保留一些大面积的.且有灰度值含有大于th1的点的前景区域,而不需要小面积的区域(th1大于th2),这时会遇到这样的问题:当 ...

  6. 图像二值化中阈值算法浅析

    目录 什么是二值化 常见的求阈值算法 OSTU大津法 概念及原理 iteration迭代法 概念及原理 代码实现 Sobel算子图像边缘提取 概念及原理 代码实现 噪点过滤 什么是二值化 所谓图像二值 ...

  7. 图像二值化(选择阈值)

    目录 1. 双峰法 2. 大津法(Otsu法或最大类间方差法) 1. 双峰法 在一些简单的图像中,物体的灰度分布比较有规律,背景与各个目标在图像 的直方图各自形成一个波峰,即区域与波峰一一对应,每两个 ...

  8. ostu阈值分割python实现_opencv python 图像二值化/简单阈值化/大津阈值法

    1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表示如果像素值大于(有时小于)阈值则要给出的值. ...

  9. 图像二值化分割阈值的算法——OTSU

    该算法叫做大津算法,由日本学者大津于1979年提出. 该算法的核心在于 前景与背景图像的类间方差最大 MATLAB代码 clear all clcI = imread('1.jpg'); I = rg ...

最新文章

  1. 2022年重大颠覆性科技创新趋势报告(完整版)
  2. 引入mysql+命名空间_C#连接MySQL操作详细教程
  3. openjudge-NOI 2.6-1759 最长上升子序列
  4. RUNNOOB python练习题 28 递归 数列
  5. 菜单固定随滚动条滑动
  6. jQuery使用示例详解
  7. Java关闭窗口和刷新
  8. babel css3新特性_css3 transform属性多值的顺序问题
  9. 软件类配置(二)【Windows中安装python、pycharm、opencv、anaconda】
  10. 【JavaScript创建对象】
  11. java移位运算符详解_java移位运算符详解
  12. chorme流程图设计插件gliffy 的加载
  13. 又一个Python数据分析学习利器!
  14. /布丰投针实验/ /模拟三门 //模拟排队//求解有约束的非线性规划问题// 书店买书////用于模拟导弹追击问题// TSP(旅行商问题)
  15. iphone开发笔记一 mac os 10.7.2安装与配置
  16. 浅析搭建高速公路视频监控平台的建设方案及必要性
  17. 什么是cookie?cookie的优缺点。
  18. 计算机控制系统的框图,计算机控制系统软件框图
  19. CST微波工作室学习笔记—17.CST和HFSS联合导入、导出模型+仿真
  20. php落伍,一贴学会PHP 为落伍的MJJ们量身定做的教程

热门文章

  1. 一、Nginx是什么?
  2. 75亿“迎娶”ZeniMax,钟情游戏的微软在坚持什么?
  3. 09_ue4进阶末日生存游戏开发[动画重定向]
  4. libcef.dll文件丢失怎么办?丢失对电脑有什么影响?
  5. Vscode底部状态栏消失
  6. 健身环大冒险 腹肌防御Best | 健身环大冒险 2162-0002 | 健身环 重新适配
  7. 开源设计_开源设计500
  8. [Java 教程 01] Hello,Java!
  9. 西门子200smart与v90伺服驱动器Profinet通讯 sina-pos的运用
  10. LTE(4G) - NR(5G) Counter Check信令描述