【OpenCV3】阈值化操作——cv::threshold()与cv::adaptiveThreshold()详解
阈值化操作在图像处理中是一种常用的算法,比如图像的二值化就是一种最常见的一种阈值化操作。opencv2和opencv3中提供了直接阈值化操作cv::threshold()和自适应阈值化操作cv::adaptiveThreshold()两种阈值化操作接口,这里将对这两个接口进行介绍和对比。
1、直接阈值化——cv::threshold()
阈值化操作的基本思想是,给定一个输入数组和一个阈值,数组中的每个元素将根据其与阈值之间的大小发生相应的改变。opencv3中支持这一操作的接口是cv::threshold(),具体调用方法如下:
double cv::threshold(cv::InputArray src, // 输入图像cv::OutputArray dst, // 输出图像double thresh, // 阈值double maxValue, // 向上最大值int thresholdType // 阈值化操作的类型
);
如下表所示,每一种阈值化操作类型,对应着一种源图像上每一个像素点与阈值thresh之间比较操作。根据源图像像素和阈值之间的大小关系,目标像素可能被置为0、原像素值、或者设定的最大值maxValue。
下图将会帮助大家理解不同的阈值化类型所表示的确切含义。
void test_threshold()
{cv::Mat src = cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE);cv::Mat dst;double thresh = 100;int maxVal = 255;cv::threshold(src, dst, thresh, maxVal, cv::THRESH_BINARY);cv::imshow("threshold", dst);cv::waitKey(0);return;
}
实用上面的代码进行阈值化处理,原图和五种不同方式阈值化的结果分别如下:
另外,在opencv3中cv::threshold()函数还支持一种特殊的阈值化操作方式,即Otsu算法。该算法的主要思想是,在进行阈值化时,考虑所有可能的阈值,分别计算低于阈值和高于阈值像素的方差,使下式最小化的值作为阈值:
其中,两类像素方差的权值由两类像素的个数决定。这种阈值化的结果相对来说比较理想,可以避免寻找合适阈值的操作,但是这种方式运算量较大,费时。处理的结果如下:
但是,直接阈值化操作是一种一刀切的方式,对于亮度分布差异较大的图像,常常无法找到一个合适的阈值。如下所示,对棋盘格进行二值化操作,由于图像右上角区域和图像下部的亮度差异较为大,无法找到一个合适的阈值,将棋盘上的所有棋盘格给区分开来。
针对于上述情况,我们需要一种改进的阈值化算法,即自适应阈值化。
2、自适应阈值化——cv::adaptiveThreshold()
自适应阈值化能够根据图像不同区域亮度分布的,改变阈值,具体调用方法如下:
void cv::adaptiveThreshold(cv::InputArray src, // 输入图像cv::OutputArray dst, // 输出图像double maxValue, // 向上最大值int adaptiveMethod, // 自适应方法,平均或高斯int thresholdType // 阈值化类型int blockSize, // 块大小double C // 常量
);
cv::adaptiveThreshold()支持两种自适应方法,即cv::ADAPTIVE_THRESH_MEAN_C(平均)和cv::ADAPTIVE_THRESH_GAUSSIAN_C(高斯)。在两种情况下,自适应阈值T(x, y)。通过计算每个像素周围bxb大小像素块的加权均值并减去常量C得到。其中,b由blockSize给出,大小必须为奇数;如果使用平均的方法,则所有像素周围的权值相同;如果使用高斯的方法,则(x,y)周围的像素的权值则根据其到中心点的距离通过高斯方程得到。
测试代码如下:
void test_adaptive_threshold()
{cv::Mat src = cv::imread("chessboard.png", cv::IMREAD_GRAYSCALE);cv::Mat dst;int maxVal = 255;int blockSize = 41;double C = 0;cv::adaptiveThreshold(src, dst, maxVal, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, blockSize, C);cv::imshow("threshold", dst);cv::waitKey(0);return;
}
我们分别使用了平均和高斯两种自适应方法,结果如下:
2017.03.29
【OpenCV3】阈值化操作——cv::threshold()与cv::adaptiveThreshold()详解相关推荐
- 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))
目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...
- OpenCV之阈值化操作总结
参考:https://blog.csdn.net/sinat_21258931/article/details/61418681 在做图像处理时,阈值化(二值化)是一个非常常见的操作,其中最关键的是阈 ...
- (pytorch-深度学习系列)pytorch卷积层与池化层输出的尺寸的计算公式详解
pytorch卷积层与池化层输出的尺寸的计算公式详解 要设计卷积神经网络的结构,必须匹配层与层之间的输入与输出的尺寸,这就需要较好的计算输出尺寸 先列出公式: 卷积后,池化后尺寸计算公式: (图像尺寸 ...
- python怎么安装myqr模块-python二维码操作:对QRCode和MyQR入门详解
python是所有编程语言中模块最丰富的 生活中常见的二维码功能在使用python第三方库来生成十分容易 三个大矩形是定位图案,用于标记二维码的大小.这三个定位图案有白边,通过这三个矩形就可以标识一个 ...
- python代码大全表解释-python操作列表的函数使用代码详解
python的列表很重要,学习到后面你会发现使用的地方真的太多了.最近在写一些小项目时经常用到列表,有时其中的方法还会忘哎! 所以为了复习写下了这篇博客,大家也可以来学习一下,应该比较全面和详细了 列 ...
- php jquery点击事件,jQuery操作html元素点击事件详解
这次给大家带来jQuery操作html元素点击事件详解,jQuery操作html元素点击事件的注意事项有哪些,下面就是实战案例,一起来看一下. 移除或禁用html元素的点击事件可以通过css实现也可以 ...
- python怎么安装myqr_python二维码操作:对QRCode和MyQR入门详解
python是所有编程语言中模块最丰富的 生活中常见的二维码功能在使用python第三方库来生成十分容易 三个大矩形是定位图案,用于标记二维码的大小.这三个定位图案有白边,通过这三个矩形就可以标识一个 ...
- Java操作数据库方式二DBCP使用详解
##概述 DBCP的全称是:DataBase connection pool,翻译是:数据库连接池. 在Java操作数据库方式一JDBC使用详解中说到直接使用JDBC非常消耗资源.为了避免频繁关闭链接 ...
- 自适应阈值化操作:adaptiveThreshold()函数
在图像阈值化操作中,更关注的是从二值化图像中,分离目标区域和背景区域,但是仅仅通过设定固定阈值很难达到理想的分割效果.而自适应阈值,则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.这样 ...
最新文章
- 测试规范包括哪些_光学会自动化测试还不够?还差最后这一步!
- 如何激励用户为你的app评分?
- hdu 3007【爬山算法】
- iview select选中值取值_完美解决iview 的select下拉框选项错位的问题
- 太空将成为数据中心冷却新前沿
- 简述Intel的MESI缓存一致性协议
- com.alibaba.druid.pool.DruidDataSource.error解决办法
- PPT怎么在线转视频?
- IQ测试(jzoj 5048)
- sqlserver大数据表操作慢_架构师必看!操作日志系统搭建秘技
- MyEclipse工具的优化使用
- POJ 1953 (DP)
- 如何在钉钉上开发自己的应用_对企业来说无代码开发平台是否安全
- XVII Open Cup named after E.V. Pankratiev. GP of Siberia, Division 1
- svn 同步 linux,linux SVN 中 配置钩子 实现 线上项目同步
- Servlet API 中文版
- fastadmin上传视频的操作
- 利用遗传算法解决TSP问题
- git提交中target等目录忽略与取消忽略
- 深度分析游戏中的随机概率
热门文章
- Java Review - 并发编程_ CountDownLatch原理源码剖析
- jvm性能调优实战 -54Jetty NIO机制导致堆外内存溢出Direct buffer memory OOM
- android studio ide内部错误,Android Studio内部IDE错误
- java integer 不变模式_Java代码的变与不变
- 复习笔记(二)——C++面向对象设计和使用
- linux内核引入模块机制好处,linux内核模块的版本检查机制
- np.append()
- Vue2.0 $set()的正确使用方式
- substring、substr以及slice、splice用法和区别
- java积分签到功能_大河客户端积分商城上线,看新闻就能换取各种超实用奖品,来约...