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()函数详解的更多相关文章

  1. opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH_OTSU使用

    cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...

  2. php缓存技术——memcache常用函数详解

    php缓存技术——memcache常用函数详解 2016-04-07 aileen PHP编程 Memcache函数库是在PECL(PHP Extension Community Library)中, ...

  3. malloc 与 free函数详解<转载>

    malloc和free函数详解   本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...

  4. NSSearchPathForDirectoriesInDomains函数详解

    NSSearchPathForDirectoriesInDomains函数详解     #import "NSString+FilePath.h" @implementation ...

  5. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  6. Linux C popen()函数详解

    表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * type); 函数说明 popen( ...

  7. kzalloc 函数详解(转载)

    用kzalloc申请内存的时候, 效果等同于先是用 kmalloc() 申请空间 , 然后用 memset() 来初始化 ,所有申请的元素都被初始化为 0. view plain /** * kzal ...

  8. Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt

    PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...

  9. jQuery.attr() 函数详解

    一,jQuery.attr()  函数详解: http://www.365mini.com/page/jquery-attr.htm 二,jQuery函数attr()和prop()的区别: http: ...

随机推荐

  1. Java 关键字有哪些

    数据类型: Boolean(布尔型)    int    long    short    byte    float    double    char    class    interface( ...

  2. 常见的web服务器软件分类

    (1)ApacheApache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上.Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软 ...

  3. java报错java/lang/NoClassDefFoundError: java/lang/Object

    安装完java出错 javac和java -version 都无效,报错如上 解决方法,更改文件中的两个文件(前提是你的 vim  /etc/profile  文件路径写的正确) /usr/java/ ...

  4. 《SLAM for Dummies》中文版《SLAM初学者教程》

    SLAM for Dummies  SLAM初学者教程A Tutorial Approach to Simultaneous Localization and Mapping  一本关于实时定位及绘图 ...

  5. HDU 3455 Leap Frog 2016-09-12 16:34 43人阅读 评论(0) 收藏

    Leap Frog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. 老刘 Yii2 源码学习笔记之 Module 类

    关系类图 从上图可以看出 Application 类继承了 Module,在框架中的是非常重要角色. 加载配置 public function setModules($modules) { forea ...

  7. DBCC--常用命令

    ------------------------------------------------------ --1 DBCC FLUSHPROCINDB 清除SQL SERVER服务器内存中某个数据 ...

  8. 如何在 .NET Core 上测试库

    设置解决方案. 可使用以下命令实现此目的: mkdir SolutionWithSrcAndTest cd SolutionWithSrcAndTest dotnet new sln dotnet n ...

  9. LINQ to SQL语句大全

    LINQ to SQL语句大全     LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判 ...

  10. 20164317《网络对抗技术》Exp4 恶意代码分析

    1.实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systr ...