在图像处理中,我们通常会把图像先进行简化处理。其中图像的灰度化和图像的阈值化是最常用的两种简化处理方法。
图像的灰度化处理就是把图像从三维彩色空间降到一维的灰度空间,在OpenCV中实现起来很简单,用函数cvtColor就能实现。
图像的阈值化处理是在灰度图像的基础上,把灰度图像进一步简化为二值图像,即整幅图像的各点像素值只用两个数值来表示,其中一个数值为零,另一个数值为非零值。
图像的阈值化的关键是找到一个最佳阈值,使得在进行图像简化操作是尽量多的过滤掉我们不需要的信息并保留我们需要的信息。

本文介绍三种基于OpenCV的阈值化处理方法。

第一种 OTSU阈值化(最大类间方差算法)
这种方法详见我的博文:https://blog.csdn.net/wenhao_ir/article/details/51179117

第二种 固定阈值法
固定阈值法的阈值是固定的,即不用使用相关算法去计算这个阈值,而是由程序或用户设定。
我们在图像窗口中创建一个滑动条,通过滑动条去查看不同的阈值对应的阈值化后的图像。
源码如下:

源码中使用的图像下载链接:http://pan.baidu.com/s/1kUJMx1t 密码:r3d3
//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>#include <iostream>using namespace cv;
using namespace std;void onChangeTrackBar(int pos, void* data)
{// 强制类型转换cv::Mat srcImage = *(cv::Mat*)(data);cv::Mat dstImage;// 根据滑动条的值进行二值化cv::threshold(srcImage, dstImage, pos, 255, 0);cv::imshow("dyn_threshold", dstImage);
}int main()
{Mat img = imread("02.jpg");if (img.empty()){cout << "Error: Could not load image" << endl;return 0;}Mat gray;cvtColor(img, gray, CV_BGR2GRAY);namedWindow("dyn_threshold");imshow("dyn_threshold", gray);int value = 0;/* 创建滑动条createTrackbar,调用回调函数*/createTrackbar("pos", "dyn_threshold", &value, 255, onChangeTrackBar, &gray);waitKey(0);return 0;
}

代码说明:
代码使用createTrackbar函数来创建一个滑动条,其原型和参数意义如下:
int createTrackbar(const string& trackbarname, const string& winname,int* value, int count,  TrackbarCallback onChange = 0,  void* userdata = 0); 
trackbarname:滑动条上的变量名称;
winname:滑动条用于依附的图像窗口的名称;
value:滑动条上的变量指针;
count:滑动条上的变量的最大值,滑动条上变量的可取值范围为0~count;
onChange:回调函数名;
userdata:用户数据指针;
结合上面对各参数的叙述及源码,大家不难理解createTrackbar函数的使用。
程序运行的结果截图如下:


这里我再提供一个程序运行结果的演示视频给大家:
优酷网在线观看地址:http://v.youku.com/v_show/id_XMz ... m=a2hzp.8244740.0.0
大家在优酷网看视频的时候记得是可以选择高清模式的哦!
视频文件百度网盘下载及在线观看地址:http://pan.baidu.com/s/1miGCQ6W 密码:mrg6

第三种 基于局部的阈值化
OpenCV提供了adaptiveThreshold函数用来做图像基于局部的阈值化处理。
该方法的思路是把图像划分为许多小图像(小窗口),然后每个小图像做一个阈值化处理,阈值可以由两种算法算得,分别为ADAPTIVE_THRESH_MEAN_C和ADAPTIVE_THRESH_GAUSSIAN_C,即平均阈值算法和高斯阈值算法!
接下来,介绍下adaptiveThreshold函数,它的原型如下:
C++: void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
参数意义介绍如下:
src:源图像,要求是8位的单通道图像;
dst:输出图像;
maxValue:阈值化后的非零值;
adaptiveMethod:阈值计算方法,可选值为ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C;
thresholdType:阈值化类型,可选值为THRESH_BINARY or THRESH_BINARY_INV,具体的意义见下面这张图;

blockSize:计算局部阈值时的每个小窗口(每个局部)的大小,只能为奇数,最小值为3;
C:阈值偏移值,函数最终使用的阈值为使用adaptiveMethod计算出的阈值减去C。

基于局部的阈值化示例代码如下:
源码中使用的图像下载链接:http://pan.baidu.com/s/1kUJMx1t 密码:r3d3

//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>#include <iostream>using namespace cv;
using namespace std;int main()
{Mat img = imread("02.jpg");if (img.empty()){cout << "Error: Could not load image" << endl;return 0;}Mat gray;cvtColor(img, gray, CV_BGR2GRAY);Mat dst;// 初始化自适应阈值参数int blockSize = 59;int constValue = 5;const int maxVal = 255;/* 自适应阈值算法0:ADAPTIVE_THRESH_MEAN_C1: ADAPTIVE_THRESH_GAUSSIAN_C */int adaptiveMethod = 0;/*阈值类型0: THRESH_BINARY1: THRESH_BINARY_INV */int thresholdType = 0;// 图像自适应阈值操作adaptiveThreshold(gray, dst, maxVal, adaptiveMethod, thresholdType, blockSize, constValue);imshow("src", img);imshow("gray", gray);imshow("dst", dst);waitKey(0);return 0;
}

运行结果截图如下:

0013-图像的阈值化-OTSU、固定阈值法、基于局部的阈值化相关推荐

  1. 图像二值化——OTSU大津法

    最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU.它是按图像的灰度特性,将图像分成背景和目标两部分,或者说,是寻找 ...

  2. [转载+原创]Emgu CV on C# (五) —— Emgu CV on 局部自适应阈值二值化

    局部自适应阈值二值化 相对全局阈值二值化,自然就有局部自适应阈值二值化,本文利用Emgu CV实现局部自适应阈值二值化算法,并通过调节block大小,实现图像的边缘检测. 一.理论概述(转载自< ...

  3. 基于 SOA 的组件化业务基础平台

    基于 SOA 的组件化业务基础平台 原文:基于 SOA 的组件化业务基础平台 前言 业务基础平台是业务逻辑应用和基础架构平台之间的一个中间层,解决 "应用软件的业务描述和操作系统平台.软件基 ...

  4. 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))

    目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...

  5. 二维otsu算法python_【OpenCV+Python】图像阈值与OTSU算法

    图像阈值 自本教程开始,我们已经进入了图像处理的一些基本操作的学习,所谓的图像阈值,就是图像二值化.什么是二值化?就是只有0和1,没有其他的.在OpenCV的图像里面,二值化表示图像的像素为0和255 ...

  6. OpenCV-Python学习笔记(八):图像阈值:简单阈值、自适应阈值、 Otsu's阈值

    目标 • 本节你将学到简单阈值,自适应阈值, Otsu's 二值化等 • 将要学习的函数有 cv2.threshold, cv2.adaptiveThreshold 等. 1.简单阈值 与名字一样,这 ...

  7. 基于OTSU(大津法)的图像分块的阈值分割

    一.开发环境: Qt版本:Qt5.12.3VS版本:VS2017opencv版本:opencv-4.5.1-vc14_vc15 二.要求:实现基于图像分块+OTSU的图像分割 1.OTSU大津法实现 ...

  8. 图像阈值分割:大津法(Otsu)

    大津法(OTSU法)是由大津于1979 年提出的,对图像I,记T为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0:背景点数占图像比例为w1,平均灰度为u1.从最小灰度值到最大灰度值遍历 ...

  9. 基于直方图的图像全局二值化算法原理、实现--基于谷底最小值的阈值

    1.描述: 此方法实用于具有明显双峰直方图的图像,其寻找双峰的谷底作为阈值,但是该方法不一定能获得阈值,对于那些具有平坦的直方图或单峰图像,该方法不合适. 2.实现过程: 该函数的实现是一个迭代的过程 ...

  10. 【youcans 的 OpenCV 例程200篇】158. 阈值处理之固定阈值法

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...

最新文章

  1. 什么是量子计算机?用一个简单例子来解释
  2. django入门项目图书管理
  3. (王道408考研操作系统)第四章文件管理-第一节7:文件共享
  4. delphi语言转为汇编语言_计算机语言
  5. 漫画 | 为什么 MySQL 数据库要用 B+ 树存储索引?
  6. 2014蓝桥杯C++A:猜年龄;扑克序列(全排列)
  7. CentOS安装postgresql9.1
  8. 拓端tecdat|主成分分析(PCA)原理及R语言实现及分析实例
  9. 怎么制作电脑动态壁纸 桌面高清动态图怎么做
  10. #定位系统性能瓶颈# sysdig
  11. 【转】O'Reilly Java系列书籍建议阅读顺序(转自蔡学庸)
  12. oracle 人民币符号,人民币的符号的正确表示法?一杠?两杠?
  13. 三星电子中国研究院招聘CV、NLP、语音/音频工程师和实习生
  14. 语义网技术综述(web3.0)
  15. 异地组网——ZeroTier
  16. android 蓝牙歌名,从Android上的蓝牙CarKit上显示标题(不是歌曲或艺术家,但是有效的SIP会话)...
  17. scrcpy CreateProcessW() error 5
  18. 快消品b2b电子商务网站建设方案
  19. 10 AOP Advisor的封装与搜集
  20. centos7安装jdk-8u191

热门文章

  1. 如何科学的建立自己的个人网站
  2. 虫虫 5个衡量软件质量的标准(可自动化)
  3. Map集合简单应用的例子(世界杯)
  4. Pandas:分组级的运算和转换--transform和apply
  5. 基于51单片机DTH11温湿度测量仪protues仿真设计_LCD显示
  6. 【Protues仿真】PNP三极管驱动蜂鸣器和实际电路相同却不响问题探讨
  7. 集成Fbreader显示空白页
  8. 外置MOS LED驱动IC7195
  9. 新浪微博客户端开发之发布微博,Android面试题
  10. 查询计算机ip地址的方法,计算机的ip地址查询的几种简单方法介绍