1、图像阈值与二值化

阈值是一种简单的图像分割方法,一幅图像包括目标物体(前景)、背景还有噪声,要想从数字图像中直接提取出目标物体,可以设定一个像素值即阈值,然后用图像的每一个像素点和阈值做比较,给出判定结果。

二值化是特殊的阈值分割方法,把图像分为两部分,以阈值T为分割线,大于T的像素群和小于T的像素群,这样图像就变为黑白二色图像。通过设定一个标准如果大于这个标准就设为白,如果小于这个标准就设为黑,而这个标准就是阈值。

2、OpenCV阈值threshold

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);

(1)第一个参数,InputArray 类型的 src,源图像。单通道,8 或 32位浮点数类型的深度。

(2)第二个参数,OutputArray 类型的 dst,输出图像。

(3)第三个参数,double 类型的 thresh,选取的阈值。

(4)第四个参数,double 类型的 maxval。

(5)第五个参数,int 类型的 type。阈值类型。如下所示:

type类型如下:

enum  cv::ThresholdTypes { cv::THRESH_BINARY = 0, cv::THRESH_BINARY_INV = 1, cv::THRESH_TRUNC = 2, cv::THRESH_TOZERO = 3, cv::THRESH_TOZERO_INV = 4, cv::THRESH_MASK = 7, cv::THRESH_OTSU = 8, cv::THRESH_TRIANGLE = 16
}

不同的阈值方法生成关系如下图。

Mat img = Mat::zeros(6, 6, CV_8UC1);
randu(img, 0, 255);int th = 100;
Mat threshold1, threshold2, threshold3, threshold4, threshold5, threshold6, threshold7, threshold8;
threshold(img, threshold1, th, 200, THRESH_BINARY);
threshold(img, threshold2, th, 200, THRESH_BINARY_INV);
threshold(img, threshold3, th, 200, THRESH_TRUNC);cout << "raw=\r\n"<<img << "\r\n" << endl;
cout << "THRESH_BINARY=\r\n" << threshold1 << "\r\n" << endl;
cout << "THRESH_BINARY_INV=\r\n" << threshold2 << "\r\n" << endl;
cout << "THRESH_TRUNC=\r\n" << threshold3 << "\r\n" << endl;

上面代码中randu(img, 0, 255)作用是产出随机数填充img矩阵。输出结果如下。

raw=
[ 91,   2,  79, 179,  52, 205;236,   8, 181, 239,  26, 248;207, 218,  45, 183, 158, 101;102,  18, 118,  68, 210, 139;198, 207, 211, 181, 162, 197;191, 196,  40,   7, 243, 230]THRESH_BINARY=
[  0,   0,   0, 200,   0, 200;200,   0, 200, 200,   0, 200;200, 200,   0, 200, 200, 200;200,   0, 200,   0, 200, 200;200, 200, 200, 200, 200, 200;200, 200,   0,   0, 200, 200]THRESH_BINARY_INV=
[200, 200, 200,   0, 200,   0;0, 200,   0,   0, 200,   0;0,   0, 200,   0,   0,   0;0, 200,   0, 200,   0,   0;0,   0,   0,   0,   0,   0;0,   0, 200, 200,   0,   0]THRESH_TRUNC=
[ 91,   2,  79, 100,  52, 100;100,   8, 100, 100,  26, 100;100, 100,  45, 100, 100, 100;100,  18, 100,  68, 100, 100;100, 100, 100, 100, 100, 100;100, 100,  40,   7, 100, 100]

THRESH_BINARY,thresh=100,maxval=200,大于阈值限定为200,小于阈值清零。

THRESH_BINARY_INV的作用和THRESH_BINARY 相反,小于阈值置200,大于阈值清。

THRESH_TRUNC的作用是对大于阈值的数据进行截断,其余值保留原值不变。

图像阈值例子如下。

Mat img = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic6.bmp", IMREAD_GRAYSCALE);
int th = 100;
Mat threshold1, threshold2, threshold3, threshold4, threshold5, threshold6, threshold7, threshold8;
threshold(img, threshold1, th, 200, THRESH_BINARY);
threshold(img, threshold2, th, 200, THRESH_BINARY_INV);
threshold(img, threshold3, th, 200, THRESH_TRUNC);imshow("raw pic",img);
imshow("THRESH_BINARY", threshold1);
imshow("THRESH_BINARY_INV", threshold2);
imshow("THRESH_TRUNC", threshold3);

3、自动阈值—大津法OTSU

最大类间方差是由日本学者大津(Nobuyuki Otsu)于1979年提出,是一种自适应的阈值确定方法。算法假设图像像素能够根据阈值,被分成背景[background]和目标[objects]两部分。然后,计算该最佳阈值来区分这两类像素,使得两类像素区分度最大。

算法原理为:

设图像Img长宽尺寸为M*N, T为二值化的阈值;

N0为灰度小于T的像素的个数,N0的平均灰度为μ0。

N1 为灰度大于T的像素的个数,N1的平均灰度为μ1。

ω0=N0/ M×N                   (1)   //落在N0的概率

ω1=N1/ M×N                   (2)  //落在N1的概率

N0+N1=M×N                    (3)  

ω0+ω1=1                        (4)       

μ=ω0*μ0+ω1*μ1              (5)  //平均灰度乘以概率 再相加

g=ω0(μ0-μ)^2+ω1(μ1-μ)^2     (6)   //类间方差

将式(5)代入式(6),得到等价公式: g=ω0ω1(μ0-μ1)^2    (7)

OpenCV自带了OSTU算法。

Mat img = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic2.bmp", IMREAD_GRAYSCALE);
int th = 100;
Mat threshold1, threshold2, threshold3;
threshold(img, threshold1, th, 255, THRESH_BINARY);
threshold(img, threshold2, th, 255, THRESH_TRUNC);
threshold(img, threshold3, th, 255, THRESH_OTSU); // 阈值随意设置即可

imshow("raw pic",img);
imshow("THRESH_BINARY", threshold1);
imshow("THRESH_TRUNC",  threshold2);
imshow("THRESH_OTSU",   threshold3);

使用大津法时阈值可以不设置或随意设置,函数会自动计算最合适的阈值,输出图像如下。

大津法相比其他二值化方法,能很好的筛选出前景图和背景图,让图像分类后黑白区分度最大。

4、参考文献

1、《学习OpenCV》,清华大学出版社,Gary Bradski, Adrian kaehler著

2、Miscellaneous Image Transformations

https://docs.opencv.org/3.1.0/d7/d1b/group__imgproc__misc.html#gae8a4a146d1ca78c626a53577199e9c57

3、OpenCV threshold函数详解

https://blog.csdn.net/weixin_42296411/article/details/80901080

4、详细及易读懂的 大津法(OTSU)原理 和 算法实现

https://blog.csdn.net/u012198575/article/details/81128799

尊重原创技术文章,转载请注明。

https://www.cnblogs.com/pingwen/p/12300590.html

OpenCV3入门(五)图像的阈值相关推荐

  1. python+OpenCV图像处理(五)图像的阈值分割

    图像的阈值处理 一幅图像包括目标物体.背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群.这是研究灰度变换 ...

  2. python灰度图片格式_[Python图像处理] 十五.图像的灰度线性变换

    [Python图像处理] 十五.图像的灰度线性变换 发布时间:2019-03-28 00:08, 浏览次数:619 , 标签: Python 该系列文章是讲解Python OpenCV图像处理知识,前 ...

  3. 计算机视觉快速入门一 —— 图像基本操作(二)

    计算机视觉快速入门一 -- 图像基本操作(二) 1.灰度图 img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) import cv2 #opencv读取的格 ...

  4. OpenCV与图像处理学习五——图像滤波与增强:线性、非线性滤波、直方图均衡化与Gamma变换

    OpenCV与图像处理学习五--图像滤波与增强:线性.非线性滤波.直方图均衡化与Gamma变换 三.图像滤波与增强 3.1 线性滤波 3.1.1 方框滤波 3.1.2 均值滤波 3.1.3 高斯滤波 ...

  5. 红外目标图像中阈值切割方法的比較与研究

    红外目标图像中阈值切割方法的比較与研究   摘要:本文主要以红外图像目标检測技术为背景,在图像阈值切割中以最大熵准则及遗传算法为基础.研究了一维最大熵值法(KSW法)及基于遗传算法的KSW熵法单阈值. ...

  6. 红外目标图像中阈值分割方法的比较与研究

    红外目标图像中阈值分割方法的比较与研究   摘要:本文主要以红外图像目标检测技术为背景,在图像阈值分割中以最大熵准则及遗传算法为基础,研究了一维最大熵值法(KSW法)及基于遗传算法的KSW熵法单阈值. ...

  7. openresty 前端开发入门五之Mysql篇

    2019独角兽企业重金招聘Python工程师标准>>> openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysq ...

  8. PyTorch框架学习五——图像预处理transforms(一)

    PyTorch框架学习五--图像预处理transforms(一) 一.transforms运行机制 二.transforms的具体方法 1.裁剪 (1)随机裁剪:transforms.RandomCr ...

  9. MySQL入门 (五) : CRUD 与资料维护

    1 取得表格资讯 1.1 DESCRIBE指令 「DESCRIBE」是MySQL资料库提供的指令,它只能在MySQL资料库中使用,这个指令可以取得某个表格的结构资讯,它的语法是这样的: 你在MySQL ...

  10. openresty json mysql_openresty 前端开发入门五之Mysql篇

    openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysql获取数据,并返回给用户 操作mysql主要用到了lua-resty-my ...

最新文章

  1. Leetcode 103. 二叉树的锯齿形层次遍历 解题思路及C++实现
  2. 学分绩点计算编程java_方便我们计算学分绩点的JavaScript
  3. Unity Shader: 理解Stencil buffer并将它用于一些实战案例(描边,多边形填充,反射区域限定,阴影体shadow volume阴影渲染)
  4. AndroidStudio安卓原生开发_Intent传过来的值会自动变化_太奇怪了_你碰见过嘛_Http并发引起的问题?_可通过静态变量传值的方式解决---Android原生开发工作笔记130
  5. (转载)Jvm工作原理学习笔记
  6. Oracle 11G GoldenGate实现Windows与Windows之间的单向同步
  7. 转~解决VS2017 C++无法打开源文件 WinSock2.h Windows.h mswsock.h Ws2tcpip.h
  8. gg修改器ios版下载
  9. 启动gis管理器显示无法启动服务器,mapgis狗不能启动,提示是服务器启动失败,是怎么回事?...
  10. 监控摄像头镜头大小的区别
  11. 使用Python分析英文句子的词性和情感倾向
  12. PS裁剪图片上任意形状区域
  13. tahoma字体对中文字的影响
  14. 家用净水器哪个牌子好,家用净水器评测
  15. WPS关闭不了后台一直运行的解决办法(wpscloudsvr.exe)
  16. Three.js入门教程
  17. kernel exploit 有用的结构体
  18. 《SVN宇宙版教程》:第五章 TortoiseSVN中Repo-browser介绍
  19. 基于Andriod的连锁药店管理系统-计算机毕业设计源码+LW文档
  20. java做RPG小游戏

热门文章

  1. 同一个世界 两世之约(1-6)
  2. 计算机三级网络技术分值占比,全国计算机等级考试三级考试题型及分值比例
  3. 华中科技大学赛尔宽带登录六维空间
  4. 记录一次h5上传身份证照片、上传人面像
  5. 《单片机原理及应用》复习提纲
  6. 商店管理系统的设计与实现
  7. C#销毁资源,释放内存,GC垃圾回收
  8. 修改谷歌和火狐浏览器滚动条的样式
  9. Microsoft公司 .CAB文件格式
  10. Linux系统日志管理(redhat)