【OpenCV3】threshold()函数详解
threshold()函数源码
double cv::threshold( InputArray _src, OutputArray _dst, double thresh, double maxval, int type )
{
// enum
//{
// CV_THRESH_BINARY =0, /**< value = value > threshold ? max_value : 0 */
// CV_THRESH_BINARY_INV =1, /**< value = value > threshold ? 0 : max_value */
// CV_THRESH_TRUNC =2, /**< value = value > threshold ? threshold : value */
// CV_THRESH_TOZERO =3, /**< value = value > threshold ? value : 0 */
// CV_THRESH_TOZERO_INV =4, /**< value = value > threshold ? 0 : value */
// CV_THRESH_MASK =7,
// CV_THRESH_OTSU =8, /**< use Otsu algorithm to choose the optimal threshold value;
// combine the flag with one of the above CV_THRESH_* values */
// CV_THRESH_TRIANGLE =16 /**< use Triangle algorithm to choose the optimal threshold value;
// combine the flag with one of the above CV_THRESH_* values, but not
// with CV_THRESH_OTSU */
//};
CV_INSTRUMENT_REGION();
CV_OCL_RUN_(_src.dims() <= && _dst.isUMat(),
ocl_threshold(_src, _dst, thresh, maxval, type), thresh)
Mat src = _src.getMat();
int automatic_thresh = (type & ~CV_THRESH_MASK);// 排除前五种可能,判断是否是CV_THRESH_OTSU \ CV_THRESH_TRIANGLE(8,16)
type &= THRESH_MASK; // THRESH_MASK(7) 得到当前二值化的类型(前五种),0,1,2,3,4
CV_Assert( automatic_thresh != (CV_THRESH_OTSU | CV_THRESH_TRIANGLE) );
if( automatic_thresh == CV_THRESH_OTSU )// 判断是否是CV_THRESH_OTSU(8)
{
// 使用算法选择最佳阈值;将标志与上述cv_thresh_*值之一相结合 计算最佳阈值
CV_Assert( src.type() == CV_8UC1 );
thresh = getThreshVal_Otsu_8u( src );
}
else if( automatic_thresh == CV_THRESH_TRIANGLE )// 判断是否是CV_THRESH_TRIANGLE(16)
{
// 使用三角算法选择最优阈值;将标志与上述cv_thresh_*值之一组合,但不使用cv_thresh_otsu 计算最佳阈值
CV_Assert( src.type() == CV_8UC1 );
thresh = getThreshVal_Triangle_8u( src );
}
_dst.create( src.size(), src.type() );// 创建目标图像
Mat dst = _dst.getMat();
if( src.depth() == CV_8U )// 如果原始图像的深度为8位无符号
{
int ithresh = cvFloor(thresh);// 将thresh向下取整
thresh = ithresh;
int imaxval = cvRound(maxval); // 将maxval向最接近的整数取整
if( type == THRESH_TRUNC )
imaxval = ithresh;
imaxval = saturate_cast<uchar>(imaxval);
if( ithresh < || ithresh >= )
{
if( type == THRESH_BINARY || type == THRESH_BINARY_INV ||
((type == THRESH_TRUNC || type == THRESH_TOZERO_INV) && ithresh < ) ||
(type == THRESH_TOZERO && ithresh >= ) )
{
int v = type == THRESH_BINARY ? (ithresh >= ? : imaxval) :
type == THRESH_BINARY_INV ? (ithresh >= ? imaxval : ) :
/*type == THRESH_TRUNC ? imaxval :*/ ;
dst.setTo(v);
}
else
src.copyTo(dst);
return thresh;
}
CV_OVX_RUN(!ovx::skipSmallImages<VX_KERNEL_THRESHOLD>(src.cols, src.rows),
openvx_threshold(src, dst, ithresh, imaxval, type), (double)ithresh)
thresh = ithresh;
maxval = imaxval;
}
else if( src.depth() == CV_16S )// 如果原始图像的深度为16位short类型
{
int ithresh = cvFloor(thresh);
thresh = ithresh;
int imaxval = cvRound(maxval);
if( type == THRESH_TRUNC )
imaxval = ithresh;
imaxval = saturate_cast<short>(imaxval);
if( ithresh < SHRT_MIN || ithresh >= SHRT_MAX )
{
if( type == THRESH_BINARY || type == THRESH_BINARY_INV ||
((type == THRESH_TRUNC || type == THRESH_TOZERO_INV) && ithresh < SHRT_MIN) ||
(type == THRESH_TOZERO && ithresh >= SHRT_MAX) )
{
int v = type == THRESH_BINARY ? (ithresh >= SHRT_MAX ? : imaxval) :
type == THRESH_BINARY_INV ? (ithresh >= SHRT_MAX ? imaxval : ) :
/*type == THRESH_TRUNC ? imaxval :*/ ;
dst.setTo(v);
}
else
src.copyTo(dst);
return thresh;
}
thresh = ithresh;
maxval = imaxval;
}
else if (src.depth() == CV_16U )// 如果原始图像的深度为16位无符号
{
int ithresh = cvFloor(thresh);
thresh = ithresh;
int imaxval = cvRound(maxval);
if (type == THRESH_TRUNC)
imaxval = ithresh;
imaxval = saturate_cast<ushort>(imaxval);
int ushrt_min = ;
if (ithresh < ushrt_min || ithresh >= (int)USHRT_MAX)
{
if (type == THRESH_BINARY || type == THRESH_BINARY_INV ||
((type == THRESH_TRUNC || type == THRESH_TOZERO_INV) && ithresh < ushrt_min) ||
(type == THRESH_TOZERO && ithresh >= (int)USHRT_MAX))
{
int v = type == THRESH_BINARY ? (ithresh >= (int)USHRT_MAX ? : imaxval) :
type == THRESH_BINARY_INV ? (ithresh >= (int)USHRT_MAX ? imaxval : ) :
/*type == THRESH_TRUNC ? imaxval :*/ ;
dst.setTo(v);
}
else
src.copyTo(dst);
return thresh;
}
thresh = ithresh;
maxval = imaxval;
}
else if( src.depth() == CV_32F )// 如果原始图像的深度为32位浮点型
;
else if( src.depth() == CV_64F )// 如果原始图像的深度为64位浮点型
;
else
CV_Error( CV_StsUnsupportedFormat, "" ); // 不能识别的图像格式
parallel_for_(Range(, dst.rows),
ThresholdRunner(src, dst, thresh, maxval, type),
dst.total()/(double)(<<));
return thresh;
}
threshold()函数二值化的方法(types)/** Threshold types */
enum
{
CV_THRESH_BINARY =, /**< value = value > threshold ? max_value : 0 正向二值化*/
CV_THRESH_BINARY_INV =, /**< value = value > threshold ? 0 : max_value 反向二值化*/
CV_THRESH_TRUNC =, /**< value = value > threshold ? threshold : value */
CV_THRESH_TOZERO =, /**< value = value > threshold ? value : 0 */
CV_THRESH_TOZERO_INV =, /**< value = value > threshold ? 0 : value */
CV_THRESH_MASK =, // 掩码
CV_THRESH_OTSU =, /**< use Otsu algorithm to choose the optimal threshold value;
combine the flag with one of the above CV_THRESH_* values
使用算法选择最佳阈值;将标志与上述cv_thresh_*值之一相结合*/
CV_THRESH_TRIANGLE = /**< use Triangle algorithm to choose the optimal threshold value;
combine the flag with one of the above CV_THRESH_* values, but not
with CV_THRESH_OTSU
使用三角算法选择最优阈值;将标志与上述cv_thresh_*值之一组合,但不使用cv_thresh_otsu*/
};
【OpenCV3】threshold()函数详解的更多相关文章
- opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH_OTSU使用
cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...
- php缓存技术——memcache常用函数详解
php缓存技术——memcache常用函数详解 2016-04-07 aileen PHP编程 Memcache函数库是在PECL(PHP Extension Community Library)中, ...
- malloc 与 free函数详解<转载>
malloc和free函数详解 本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...
- NSSearchPathForDirectoriesInDomains函数详解
NSSearchPathForDirectoriesInDomains函数详解 #import "NSString+FilePath.h" @implementation ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- Linux C popen()函数详解
表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * type); 函数说明 popen( ...
- kzalloc 函数详解(转载)
用kzalloc申请内存的时候, 效果等同于先是用 kmalloc() 申请空间 , 然后用 memset() 来初始化 ,所有申请的元素都被初始化为 0. view plain /** * kzal ...
- Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt
PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...
- jQuery.attr() 函数详解
一,jQuery.attr() 函数详解: http://www.365mini.com/page/jquery-attr.htm 二,jQuery函数attr()和prop()的区别: http: ...
随机推荐
- Android无线调试(转)
Android无线调试——抛开USB数据线 开发Android的朋友都知道,真机调试需要把手机与PC相连,然后把应用部署到真机上进行安装和调试.长长的USB线显得很麻烦,而且如果需要USB接口与其他设 ...
- asp.net core 2.1 增加Nlog日志到sql server数据库
一.增加引用 <PackageReference Include="NLog.Extensions.Logging" Version="1.2.1" /& ...
- sqlserver将数据库的数据导成excel文档方法
sqlserver将数据库的数据导成excel文档方法 最近公司需要下载uniport的数据跟之前的数据进行对比,所以避免不了需要将数据库的数据导出来,把SQLServer表中的数据导出为Excel文 ...
- Part 5 - Django ORM(17-20)
https://github.com/sibtc/django-beginners-guide/tree/v0.5-lw from django.conf.urls import url from d ...
- 判断PC机大小端
判断PC机大小端 #include<stdio.h> #include<stdlib.h> int main() { short a = 0x0102; char *p = ( ...
- 今天研究了一下手机通信录管理系统(C语言)
题目:手机通信录管理系统 一.题目要求 二.需求分析 三.设计步骤/编写代码 四.上机/运行结果 五.总结 一.题目要求 模拟手机通信录管理系统,实现对手机中的通信录进行管理操作.功能要求: (1)查 ...
- linux week3
2.如何快速的回到 上⼀一次所在的位置 cd An argument of - is equivalent to $OLDPWD. cd - #cd $OLDPWD cd - #快速的回到 上 ...
- UML学习归纳整理
转载自:https://www.jianshu.com/p/83afa19c5096 写在前面 之前在学校比较系统的学习过统一建模语言UML,但长时间没使用遗忘了许多,最近因工作需要,所以对UML重新 ...
- ZUFE2389: Occult的卡片升级计划(DP) 2016-05-17 23:12 113人阅读 评论(0) 收藏
2389: Occult的卡片升级计划 Description Occult喜欢玩一款手游,手游中有很多好看的卡片.他想要升级这些卡. 现在他有m块经验石,目标是强化一张卡片,卡片最开始的时候是0级, ...
- (转)mmap和shm共享内存的区别和联系
共享内存的创建 根据理论: 1. 共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制.共享内存可以通过mmap()映射普通文件 (特殊情况下还可以采用 ...