文章目录

  • OSTU二值化
  • 自适应阈值
  • 函数实现
    • OSTU二值化
    • 自适应阈值

图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域不具有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。

OSTU二值化

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

它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

应用: 是求图像全局阈值的最佳方法,应用不言而喻,适用于大部分需要求图像全局阈值的场合。

优点: 计算简单快速,不受图像亮度和对比度的影响。

缺点: 对图像噪声敏感;只能针对单一目标分割;当目标和背景大小比例悬殊、类间方差函数可能呈现双峰或者多峰,这个时候效果不好。

原理非常简单,涉及的知识点就是均值、方差等概念和一些公式推导。为了便于理解,我们从目的入手,反推一下这著名的OTSU算法。

求类间方差:

OTSU算法的假设是存在阈值TH将图像所有像素分为两类C1(小于TH)和C2(大于TH),则这两类像素各自的均值就为m1、m2,图像全局均值为mG。同时像素被分为C1和C2类的概率分别为p1、p2。因此就有:

根据原文,式(4)还可以进一步变形:

分割:

这个分割就是二值化,OpenCV给了以下几种方式,很简单,可以参考:

自适应阈值

前面介绍了OTSU算法,但这算法属于全局阈值法,所以对于某些光照不均的图像,这种全局阈值分割的方法会显得苍白无力,如下图:

显然,这样的阈值处理结果不是我们想要的,那么就需要一种方法来应对这样的情况。

这种办法就是自适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。(其实就是局部阈值法)

如何确定局部阈值呢?可以计算某个邻域(局部)的均值、中值、高斯加权平均(高斯滤波)来确定阈值。值得说明的是:如果用局部的均值作为局部的阈值,就是常说的移动平均法。

函数实现

OSTU二值化

double cv::threshold (   InputArray  src,OutputArray     dst,double  thresh,double   maxval,int      type
)
  • src — input array (single-channel, 8-bit or 32-bit floating point).
  • dst — output array of the same size and type as src.
  • thresh — threshold value.
  • maxval — maximum value to use with the THRESH_BINARY and THRESH_BINARY_INV
  • thresholding types.
  • type — thresholding type
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char* argv[])
{Mat img = imread(argv[1], -1);if (img.empty()){cout <<"Error: Could not load image" <<endl;return 0;}Mat gray;cvtColor(img, gray, CV_BGR2GRAY);Mat dst;threshold(gray, dst, 0, 255, CV_THRESH_OTSU);imshow("src", img);imshow("gray", gray);imshow("dst", dst);waitKey(0);return 0;
}

自适应阈值

void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue,int adaptiveMethod,int thresholdType, int blockSize, double C)
  • src — Source 8-bit single-channel image.
  • dst — Destination image of the same size and the same type as src.
  • maxValue — Non-zero value assigned to the pixels for which the condition is satisfied
  • adaptiveMethod — Adaptive thresholding algorithm to use,参考:cv::AdaptiveThresholdTypes
  • thresholdType — Thresholding type that must be either THRESH_BINARY or THRESH_BINARY_INV, 可参考:thresholdType blockSize Size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on.
  • C — Constant subtracted from the mean or weighted mean (see the details below). Normally, it is positive but may be zero or negative as well.
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char* argv[])
{Mat img = imread(argv[1], -1);if (img.empty()){cout <<"Error: Could not load image" <<endl;return 0;}Mat gray;cvtColor(img, gray, CV_BGR2GRAY);Mat dst;cv::adaptiveThreshold(gray,, dst, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 21, 10);;imshow("src", img);imshow("gray", gray);imshow("dst", dst);waitKey(0);return 0;
}

计算机视觉基础-图像处理 Task05 图像分割/二值化相关推荐

  1. 计算机视觉基础-图像处理(图像分割/二值化)cpp+python

    5.1 简介 该部分的学习内容是对经典的阈值分割算法进行回顾,图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单.计算量小.性能较稳定而成为图像分割中最基本和应用最广泛的分割技术.它特别适用 ...

  2. 计算机视觉基础-图像处理之图像分割/二值化

    阈值分割基本概念 二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)或者255(白色),也就是让整个图像呈现只有黑和白的效果,在灰度化的图像中灰度值的范围为0~255,在二值化后的图像中的 ...

  3. 图像处理中的二值化和灰度化

    图像的灰度化: 灰度是指只含亮度信息,不含色彩信息的图像.黑白照片就是灰度图,特点是亮度由暗到明,变化是连续的.要表示灰度图,就需要把亮度值进行量化 使用灰度图的好处: ① RGB的值都一样. ② 图 ...

  4. OpenCV(基础补充)图像二值化

    目录 一.基础理论 1.二值图像概念 2.API介绍 二.图像二值化(黑白化)步骤: 1.彩图化灰度图 2.灰度图化黑白图(二值化) 3.翻转黑白部分 总代码 参考资料 一.基础理论 1.二值图像概念 ...

  5. MATLAB算法实战应用案例精讲-【图像处理】数字图像二值化(附Java、python、matlab、C++和R语言代码实现)

    目录 前言 知识储备 图像平滑 像素点 图像的灰度化 灰度处理的方法

  6. 基于ImagePy工具的岩块图像二值化分割研究

    看到自己一年前在知乎提的问题了,忍不住回答下. 下面这个是论文录用后修改稿,文末有编辑的评语. 基于ImagePy工具的岩块图像二值化分割研究 摘 要:在岩块图像分析识别前的预处理工作中,为了平滑岩块 ...

  7. java生成点阵图_android使用JNI图片转黑白图片实现点阵图(二值化)

    [实例简介] 为android提供的二值化jni库,和完整demo,比Java代码的效率高10s! 一个基于jni的图像处理工具 包括二值化 灰度化 膨胀 腐蚀 等等 是android上图像处理的好例 ...

  8. 图像处理理论(一)——直方图、二值化、滤波基础

    http://antkillerfarm.github.io/ 对比度和亮度 g(i,j)=a×f(i,j)+b g(i,j)=a\times f(i,j)+b 上式中f(i,j)f(i,j)和g(i ...

  9. 【计算机视觉】-图像二值化 - 图像分割 -图像卷积

    图像卷积:利用2D卷积核去扫图像,主要是为了实现Blur,高斯滤波本质也是通过卷积来实现的,只不过他的卷积核内参数是符合高斯分布的. 图像二值化:图像二值化之后为黑白图像,相当于mask掩模,用于挖出 ...

最新文章

  1. 【图论专题】最小生成树及其简单应用
  2. python,day13-堡垒机
  3. 强网杯2019 Copperstudy
  4. how to handdraw a web UI for applications? Figma
  5. idea ssh连接mysql数据库_mysql命令行客户端如何通过ssh服务器连接数据库啊?
  6. jvm(11)-晚期(运行期)优化
  7. MVC为Html对象建立一个扩展方法,使用自己的控件就像使用TextBox一样方便
  8. 基于IDEA的JavaWeb开发环境搭建
  9. python库测试记录(sys、time、datetime、random、hashlib)
  10. C++-导出类-导出宏-纯虚函数-DllMain函数-调用约定与参数命名
  11. mysql 主从1236_mysql主从复制1236错误
  12. [spark] spark推测式执行
  13. csv文件用excel打开乱码
  14. 关于idea新建子目录时往父目录名字后叠加而不是树形结构的解决方法
  15. 微机原理与接口技术:微型计算机输入输出接口 详细笔记与例题
  16. Shaders for Game
  17. 视频号的播放量和互动率、完播率密不可分
  18. 网站更新频率多少才合适?
  19. 红外热成像检测的缺陷
  20. 版本控__Adobe CC 2015的福利

热门文章

  1. [转载]Shell编程中的数组定义、遍历
  2. jQuery实现的简单文字提示效果模拟title
  3. UVA 557 Burger
  4. 计算机国家实验教学示范中心,教育部 财政部关于批准2007年国家级实验教学示范中心建设...
  5. php解析torrent文件,PHP基于闭包思想实现的BT(torrent)文件解析工具实例详解
  6. vue 对象继承_JS面向对象—对象的继承
  7. 芒果文件服务器,芒果云服务器
  8. rocketmq原理_消息中间件漫谈:RocketMQ延时消息应用及原理剖析
  9. 数据库 memorial
  10. 计算机软件著作权登记怎么填写,计算机软件著作权登记申请表填写说明