OpenCV adaptiveThreshold 自适应阈值
::返回OpenCV算子速查表
彻底搞清楚cv::adaptiveThreshold
- 1. 函数定义
- 2. 例程
- 代码
1. 函数定义
void adaptiveThreshold(InputArray src, OutputArray dst,double maxValue, //最大值int adaptiveMethod, //支持两种最适应阈值方法int thresholdType, //操作类型int blockSize, double C);
- 下面两种方法都是逐个像素的计算自适应阈值T(x,y),方法是通过计算每个像素位置周围的b×b区域的加权平均值,然后减去常数C,其中b由blockSize给定。
- cv::ADAPTIVE_THRESH_MEAN_C,均值时取得权值是想等的;
- cv::ADAPTIVE_THRESH_GAUSSIAN_C,(x,y)周围的像素的权值则根据其到中心点的距离通过高斯方程得到;
- 阈值在整个过程中自动产生变化 当图像中出现比较大的明暗差异时,自适应阈值非常有效。
- 这个函数仅处理单通道8位或浮点型图像,并且要求源图像和目标图像不同。
- 这里要尤其注意的是:参数blockSize是大于等于3的奇数,如果你设置成偶数或者小于3的数字,函数会报错的
可已参照OpenCV官方文档:
https://docs.opencv.org/4.x/d7/d1b/group__imgproc__misc.html#ga72b913f352e4a1b1b397736707afcde3
2. 例程
在这个例程里,我们对照了threshold() 和 adaptiveThreshold() 之间的区别,同时对参数blockSize和C进行了研究。
首先是普通阈值化处理和自适应阈值化处理的对照:
接下来是参数blockSize对图像处理结果的影响
结果是显而易见的,blockSize增大之后,区域数量变得更少了
还有参数C对图像处理结果的影响
我在均值3中将C设置为50,在高斯3中将C设置为 -50
根据观察,C为正数时,结果中亮区域面积更大,C为负数时,结果暗区域面积更大。当然这是在参数thresholdType 为THRESH_BINARY时的情况。如果是THRESH_BINARY_INV,那么结果会刚好相反。
最后说一下,参数adaptiveMethod是支持两种操作的:THRESH_BINARY 和 THRESH_BINARY_INV,就是一个互相翻转的关系而已。
代码
#include "stdafx.h"
#include <opencv.hpp>
using namespace cv;int main()
{Mat m_SrcImg1 = imread("./1.jpg",IMREAD_GRAYSCALE);imshow("源图像1", m_SrcImg1);//使用普通阈值化处理,THRESH_TRIANGLE是自动计算阈值的一种方法Mat m_DstImg1;threshold(m_SrcImg1, m_DstImg1, 100, 255, THRESH_BINARY | THRESH_TRIANGLE);imshow("threshold1", m_DstImg1);//使用自适应阈值均值方法处理//这里要尤其注意的是:参数blockSize是大于等于3的奇数,如果你设置成偶数或者小于3的数字,函数会报错的Mat m_DstImg2;adaptiveThreshold(m_SrcImg1, m_DstImg2, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 21, 0);imshow("均值1", m_DstImg2);//使用自适应阈值高斯方法处理Mat m_DstImg3;adaptiveThreshold(m_SrcImg1, m_DstImg3, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 21, 0);imshow("高斯1", m_DstImg3);//观察参数blockSize的影响 很明显,随着blockSize的增大,图像被分割的区域数量开始变得更少,区域面积变大了//当然,blockSize变大,会增加函数的运行成本adaptiveThreshold(m_SrcImg1, m_DstImg2, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 121, 0);imshow("均值2", m_DstImg2);adaptiveThreshold(m_SrcImg1, m_DstImg3, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 121, 0);imshow("高斯2", m_DstImg3);//观察参数C的影响//OpenCV官方文档上说是从平均值或加权平均值中减去常数。正常情况下,它是正的,但也可能是零或负的。//那也就是说这个参数会使阈值产生偏移adaptiveThreshold(m_SrcImg1, m_DstImg2, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 121, 50);imshow("均值3", m_DstImg2);adaptiveThreshold(m_SrcImg1, m_DstImg3, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 121, -50);imshow("高斯3", m_DstImg3);//翻转adaptiveThreshold(m_SrcImg1, m_DstImg2, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY_INV, 121, 0);imshow("均值4", m_DstImg2);adaptiveThreshold(m_SrcImg1, m_DstImg3, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY_INV, 121, 0);imshow("高斯4", m_DstImg3);waitKey(0);return 0;
}
OpenCV adaptiveThreshold 自适应阈值相关推荐
- Vulkan移植GpuImage(一)高斯模糊与自适应阈值
自适应阈值效果图 demo avatar 这几天抽空看了下GpuImage的filter,移植了高斯模糊与自适应阈值的vulkan compute shader实现,一个是基本的图像处理,一个是组合基 ...
- OpenCV自适应阈值化函数adaptiveThreshold详解,并附实例源码
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 2016-6-14日:又发现一种阈值分割法,最大 ...
- OpenCV自适应阈值分割函数:adaptiveThreshold()介绍
OpenCV自适应阈值分割函数:adaptiveThreshold()介绍 [注意] 1. adaptiveThreshold()函数的ThresholdTypes参数只能设置为"CV_TH ...
- OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)
OpenCV与图像处理学习七--传统图像分割之阈值法(固定阈值.自适应阈值.大津阈值) 一.固定阈值图像分割 1.1 直方图双峰法 1.2 OpenCV中的固定阈值分割 二.自动阈值图像分割 2.1 ...
- 【课题总结】OpenCV 抠图项目实战(5)自适应阈值抠图
Python 小白的课题报告-OpenCV 抠图项目实战(5)自适应阈值抠图 本系列是 Python 小白的课题作业<基于OpenCV 的图像分割和抠图>. 需要说明的是,本系列并不能算是 ...
- 自适应阈值(adaptiveThreshold)分割原理及实现
背景介绍及原理 前面介绍了OTSU算法和最大熵算法,但这两种算法都属于全局阈值法,所以对于某些光照不均的图像,这种全局阈值分割的方法会显得苍白无力,如下图: 显然,这样的阈值处理结果不是我们想要的,那 ...
- Python-OpenCV自适应阈值图像处理使用adaptiveThreshold函数获取图像轮廓
☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<OpenCV阈值处理函数threshold处理32位彩色图像的案例>介绍了threshold 函数,但threshold 的图像阈值 ...
- opencv阈值处理-threshold函数、自适应阈值处理和Ostu处理
阈值处理是指剔除图像内像素值高于一定值或者低于一定值的像素点.例如设置阈值为125,则大于125的像素点的值设为255,小于125的设为0. 一.threshold函数 open cv3.0使用cv2 ...
- OpenCV —— 阈值分割(直方图技术法,熵算法,Otsu,自适应阈值算法)
阈值分割 1. 全局阈值分割 直方图技术法 熵算法 Otsu算法 2. 局部阈值分割 自适应阈值 阈值的分割的核心就是如何选取阈值,选取正确的阈值时分割成功的关键.可以使用手动设置阈值,也可以采用直方 ...
最新文章
- [NOIP模拟测试9]题(Problem) 题解 (组合数全家桶+dp)
- Spring boot(五)模板引擎 Thymeleaf
- Java的Socket通信----通过 Socket 实现 TCP 编程之多线程demo(2)
- 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
- opencore0.6.3_大杨随笔2020.11.3
- 在SQL2005/SQL2008中CTE用法差异
- Unity3D——C#编译到运行的过程分析
- MyEclipse自定义servlet模板
- M1芯片版mac软件安装出现异常怎么办?解决方法来了
- Axure RP一个专业的高速原型设计工具
- CC2530串口通信
- AM调制解调matlab实验报告,MATLAB仿真AM调制解调 无线通信实验报告.doc
- B站顶流何同学对话苹果CEO库克,iPhone某些设计想法源自中国
- Fresco判断是否缓存
- 2022最新版40个前端练手项目【附视频+源码】
- SOFAEnclave:蚂蚁金服新一代可信编程环境,让机密计算为金融业务保驾护航102年
- Navicat Premium的下载及安装
- c #点击按钮下载excel文件
- SVN解决冲突的办法
- HTML5中input输入框默认提示文字向左向右移动
热门文章
- WPF/Sliverlight ScrollViewer与Panel(2)
- Ubuntu下OpenResty搭建高性能服务端
- scp命令下载整个目录
- 源码安装MySQL5.5.20
- Linux cannot remove 'XXX': Is a directory 解决办法
- 关于Oracle中的错误 「SQL*Loader-522: lfiopn failed for file (xxx.log)」
- ServiceStack.Redis 连接有密码的Redis问题解决
- Intellij IDEA 通过数据库表逆向生成带注释的实体类文件超级详细步骤,附详细解决方案
- Spring MVC中@ControllerAdvice注解实现全局异常拦截
- openstack上创建vm实例后,状态为ERROR问题解决