基于Otsu算法的图像自适应阈值切割
在图像处理实践中,将灰度图转化为二值图是非经常见的一种预处理手段。
在Matlab中,能够使用函数BW = im2bw(I, level)来将一幅灰度图 I。转化为二值图。
当中。參数level是一个介于0~1之间的值,也就是用于切割图像的阈值。默认情况下,它可取值是0.5。
如今问题来了,有没有一种依据图像自身特点来自适应地选择阈值的方法呢?答案是肯定的!我们今天就来介绍当中最为经典的Otsu算法(或称大津算法)。该算法由日本科学家大津展之(Nobuyuki Otsu)于1979年提出。这个算法看似简单,却与统计分析中的“方差分析”方法有非常深的渊源。有兴趣的读者也能够參考算法原文《A threshold selection method from gray-level histograms》(在线浏览地址:http://wenku.baidu.com/view/996e972d7375a417866f8f5d)我们今天在介绍该算法原理的基础之上,通过简单的Matlab代码来演示它的实现。
Matlab的帮助信息中指出:To compute the level argument,you can use the function graythresh. The graythresh function uses Otsu's method。可见,函数graythresh()就是Matlab中的大津法实现。假设对Otsu算法的原理并不感兴趣,全然能够直接调用graythresh()函数,而无需过多关系当中的技术细节。
在大津法中,我们定义组内方差为
通过选择使得上述组内方差最小化时的阈值 t,就能够使得图像中的前景和背景尽可能的被差别开(假设我们将终于图像里被分开的两部分称为前景和背景)。w0和w1各自是一个像素可能属于前景或背景的概率。而 σ 表示两个类别的方差。假设一个图像的直方图有L个等级(一般L=256)。那么在给定阈值 t的情况下,w0和w1分别定义为
大津展之证明最小化组内方差(intra-class variance)与最大化组间方差(inter-class variance)是等价的,于是有
又由于(当中 μ 表示均值或期望)
能够推出
这个证明只涉及一些算术上的推导,我简单演演示样例如以下
最后我们给出在Matlab中实现的代码,这个代码的最初版本号来自维基百科。为了与前面的公式中的标记相一致,我略有改动。
function level = otsu(histogramCounts, total)
sum0 = 0;
w0 = 0;
maximum = 0.0;
total_value = sum((0:255).*histogramCounts');
for ii=1:256
w0 = w0 + histogramCounts(ii);
if (w0 == 0)
continue;
end
w1 = total - w0;
if (w1 == 0)
break;
end
sum0 = sum0 + (ii-1) * histogramCounts(ii);
m0 = sum0 / w0;
m1 = (total_value - sum0) / w1;
icv = w0 * w1 * (m0 - m1) * (m0 - m1);
if ( icv >= maximum )
level = ii;
maximum = icv;
end
end end
上述函数中的參数histogramCounts是图像的直方图, total图像的总像素数。
来看以下这段调用上述函数的測试代码。
>> img = imread('otsus_test.jpg');
>> [counts x] = imhist(img);
>> [m n] = size(img);
>> level = otsu(counts, m*n);
>> output = img;
>> output(output<level) = 0;
>> output(output>=level) = 255;
>> imshow(output)
首先给出原始图像
然后是基于Otsu算法获取的二值图
很多其它有趣实用的图像处理算法还能够參考我的《数字图像处理原理与实践(Matlab版)》。
基于Otsu算法的图像自适应阈值切割的更多相关文章
- python+opencv实现图像自适应阈值的均衡化
内容涉及:列表遍历,图像均衡化,图像通道分离与合并 import cv2 import numpy as np import os for path in open("org_junheng ...
- 大津法---OTSU算法
简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...
- 自适应阈值化操作:adaptiveThreshold()函数
在图像阈值化操作中,更关注的是从二值化图像中,分离目标区域和背景区域,但是仅仅通过设定固定阈值很难达到理想的分割效果.而自适应阈值,则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.这样 ...
- 用OpenCV实现Otsu算法
算法的介绍 otsu法(最大类间方差法,有时也称之为大津算法)使用的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每个部分之间的灰度差异最小,通过方差的计算来寻找 ...
- 《opencv学习》 之 OTSU算法实现二值化
主要讲解OTSU算法实现图像二值化: 1.统计灰度级图像中每个像素值的个数. 2.计算第一步个数占整个图像的比例. 3.计算每个阈值[0-255]条件下,背景和前景所包含像素值总个数和总概率(就 ...
- OpenCV_基于局部自适应阈值的图像二值化
在图像处理应用中二值化操作是一个很常用的处理方式,例如零器件图片的处理.文本图片和验证码图片中字符的提取.车牌识别中的字符分割,以及视频图像中的运动目标检测中的前景分割,等等. 较为常用的图像二值化方 ...
- 自适应阈值分割—大津法(OTSU算法)C++实现
大津法是一种图像灰度自适应的阈值分割算法,是1979年由日本学者大津提出,并由他的名字命名的.大津法按照图像上灰度值的分布,将图像分成背景和前景两部分看待,前景就是我们要按照阈值分割出来的部分.背景和 ...
- Wellner 自适应阈值二值化算法
参考文档: Adaptive Thresholding for the DigitalDesk.pdf Adaptive Thresholding Using the Integral I ...
- opencv —— threshold、adaptiveThreshold 固定阈值 & 自适应阈值 进行图像二值化处理
阈值化 在对图像进行处理操作的过程中,我们常常需要对图像中的像素做出取舍与决策,直接剔除一些低于或高于一定值的像素. 阈值分割可以视为最简单的图像分割方法.比如基于图像中物体与背景之间的灰度差异,可以 ...
随机推荐
- python 函数式编程学习笔记
函数基础 一个函数就是将一些语句集合在一起的部件,它们能够不止一次地在程序中运行.函数的主要作用: 最大化的代码重用和最小化代码冗余 流程的分解 一般地,函数讲的流程是:告诉你怎样去做某事,而不是让你 ...
- 学习字典才联想到要和 JSP 说再见了
最开始只是想让页面能够映射出我的字典值,然而却发现了更大的问题. 假如你自己做一个 demo ,需要前台页面映射出字典数据你会怎么做呢?大致的思路应该是有的,准备字典,准备数据,然后将两部分进行映射. ...
- 模拟POST、Get 请求的工具----APIpost(中文版POSTMAN)
模拟POST.Get 请求的工具----APIpost(中文版POSTMAN) 快速生成.一键导出api文档 在线模拟调试,结果实时返回 模拟登录后请求API 支持团队协作 官网:https://ww ...
- javascript相关基础
1.javascript:void(0) javascript:void(0)表示不做任何动作 Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. <a hr ...
- codevs 2291 糖果堆
题目描述 Description [Shadow 1]第一题 WJMZBMR买了很多糖果,分成了N堆,排成一列.WJMZBMR说,如果Shadow能迅速求出第L堆到第R堆一共有多少糖果,就把这些糖果都 ...
- 【BZOJ-2329&2209】括号修复&括号序列 Splay
2329: [HNOI2011]括号修复 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1007 Solved: 476[Submit][Statu ...
- 【原】Maven解决jar冲突调试步骤:第三方组件引用不符合要求的javassit导致的相关异常
[环境参数]开发框架:Spring + MyBatis + SpringMVC + KettleJDK版本:1.8.0_91javassist依赖版本:javassit-3.12.1.GA [障碍再现 ...
- doc文件中的cer附件保存到本地
在word文档中有一个cer附件,可以双击直接安装证书. 我想把它保存到本地文件系统中,直接选中复制下来的cer文件,使用时,系统提示是无效证书.怎么才能正确 保存到本地文件系统?方法如下: 1.双击 ...
- spring cloud 学习(3) - feign入门
feign 是一个让rest服务调用更简洁的开源项目,很多介绍文章或书也称它为声明式REST调用.传统的web service中,通过引用wsdl来自动生成一些client的代理类(或stub代码), ...
- OpAmp Voltage Follower/Regulator
LDO Regulator High accuracy voltage regulator Vout = 2.5V * (1 + ( 5.6 / 6.8 ) ) = 4.55V Recently th ...