OpenCV学习笔记(十一):阈值化:threshold(),adaptivethreshold()

一、定义:

1)固定阈值操作

double threshold(
InputArray src,         // 输入图像,单通道
OutputArray dst,        // 输出图像
double thresh,          // 阈值的具体值
double maxval,          // 最大值,生成二值图时用到
int type);              // 阈值类型// 常用的两种阈值化类型// THRESH_BINARY     = 0, 阈值化处理生成二值图像// THRESH_BINARY_INV = 1, 阈值化处理并反转生成二值图
==阈值类型:==
0 = THRESH_BINARY二进制阈值化:
将灰度值大于thresh的设置为maxval,不大于thresh设置为0。1 = THRESH_BINARY_INV反二进制阈值化:
将灰度值大于thresh的设置为0,不大于thresh设置为maxval。2 = THRESH_TRUNC截断阈值化:
将灰度值大于thresh的设置为threshold,不大于thresh的灰度值不变。3 = THRESH_TOZERO阈值化为0:
将灰度值大于thresh的不变,超过阈值置为0。4 = THRESH_TOZERO_INV反阈值化为0:
将灰度值大于thresh的不变,低于阈值置为0。THRESH_MASKTHRESH_OTSU 使用Otsu算法选择最优阈值,使这个阈值可以将前景色和背景色尽可能分开。 THRESH_TRIANGLE 使用三角形算法选择最优阈值

2)自适应阈值化操作

void adaptiveThreshold(
InoutArray src,         // 源图像数组
OutputArray dst,        // 输出图像组
double maxValue,        // 最大值,生成二值图时用到
int adaptiveMethod,     // 自适应阈值算法选择 ADAPTIVE_THRESH_MEAN_C或ADAPTIVE_THRESH_GAUSSIAN_C;
int thresholdType,      // 阈值类型THRESH_BINARY或THRESH_BINARY_INV
int blockSize,          // 邻域块大小,用来计算区域阈值,一般选择3、5、7……;
double C                // 它是一个从均匀或加权均值提取的常数,可以是负数
)==自适应阈值算法==
ADAPTIVE_THRESH_MEAN_C 的计算方法是
计算出邻域的平均值再减去第七个参数double C的值ADAPTIVE_THRESH_GAUSSIAN_C 的计算方法是
计算出邻域的高斯均匀值再减去第七个参数double C的值

二、固定阈值threshold() 代码示例:

1)主函数

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int g_nThresholdValue1 = 124,g_nThresholdValue2=175;
int g_nThresholdType = 0;              // 阈值类型 标识
Mat g_srcImage,g_grayImage,g_dstImage,g_dstImage1,g_dstImage2;int main()
{// 显示欢迎和帮助文字ShowHelpText( );// 1、读入源图片g_srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/pellets.png");if(!g_srcImage.data ) { printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); return false; }imshow("原始图",g_srcImage);// 2、存留一份原图的灰度图cvtColor( g_srcImage, g_grayImage, COLOR_RGB2GRAY );// 3、创建窗口并显示原始图namedWindow( "【程序窗口】", WINDOW_AUTOSIZE );// 4、创建滑动条来控制阈值createTrackbar( "模式", "【程序窗口】", &g_nThresholdType,4, on_Threshold );createTrackbar( "min阈值1","【程序窗口】", &g_nThresholdValue1,255, on_Threshold );createTrackbar( "max阈值2","【程序窗口】", &g_nThresholdValue2,255, on_Threshold );// 5、初始化自定义的阈值回调函数on_Threshold( 0, 0 );// 6、轮询等待用户按键,如果ESC键按下则退出程序while(1){int key;key = waitKey( 20 );if( (char)key == 27 ){ break; }}return 0;
}

2)获取区间像素点总数:

int getWhitePixel(Mat& img)
{int area=0;for(int i=0 ; i<img.rows ; i++)for(int j=0 ; j<img.cols ; j++)if(img.at<uchar>(i,j)==255)area ++;return area;//    int area=0;
//    int rowNumber = img.rows;  //行数
//    int colNumber = img.cols*img.channels();  //列数 x 通道数=每一行元素的个数
//    //双重循环,遍历所有的像素值
//    for (int i = 0; i < rowNumber; i++)  //行循环
//    {//        uchar *data = img.ptr<uchar>(i);  //获取第i行的首地址
//        for (int j = 0; j < colNumber; j++)
//            if(data[j] ==255)
//                area ++;
//    }
//    return area;
}

3)区间阈值实现函数:

void on_Threshold( int, void* )
{//调用阈值函数//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                */threshold(g_grayImage,g_dstImage1,g_nThresholdValue1,255,g_nThresholdType);    //    CV_THRESH_BINARYimshow( "threshold1", g_dstImage1 );threshold(g_grayImage,g_dstImage2,g_nThresholdValue2,255,g_nThresholdType);imshow( "threshold2", g_dstImage2 );// 两图相减 g_dstImage1-g_dstImage2=g_dstImageaddWeighted(g_dstImage1,1.0,g_dstImage2,-1,0,g_dstImage);// 显示区间像素点数int area = getWhitePixel(g_dstImage);printf("\n 区间面积area =%d pixel",area);//更新效果图imshow( "【程序窗口】", g_dstImage );
}
static void ShowHelpText()
{//输出一些帮助信息printf(  "\n\t欢迎来到【基本阈值操作】示例程序~\n\n");printf(  "\n\t按键操作说明: \n\n""\t\t键盘按键【ESC】- 退出程序\n""\t\t滚动条模式0- 二进制阈值\n""\t\t滚动条模式1- 反二进制阈值\n""\t\t滚动条模式2- 截断阈值\n""\t\t滚动条模式3- 反阈值化为0\n""\t\t滚动条模式4- 阈值化为0\n"  );
}

结果:


在这里插入图片描述
Halcon对比:

二、固定阈值threshold() 代码示例:

1)主函数

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;Mat g_srcImage, g_grayImage,g_matAdaptive;
int g_nadaptiveMethod = ADAPTIVE_THRESH_MEAN_C;
int g_C = 5;
int g_blockSize=1;int main()
{// 1、读入源图片g_srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/pellets.png");if(!g_srcImage.data ) { printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); return false; }imshow("原始图",g_srcImage);// 2、存留一份原图的灰度图cvtColor( g_srcImage, g_grayImage, COLOR_RGB2GRAY );// 3、创建窗口并显示原始图namedWindow( "【自适应阈值分割】" , WINDOW_AUTOSIZE );// 4、创建滑动条来控制阈值createTrackbar( "阈值算法", "【自适应阈值分割】" , &g_nadaptiveMethod,1, on_Threshold );createTrackbar( "领域尺寸","【自适应阈值分割】" , &g_blockSize,9, on_Threshold );createTrackbar( "常数 C","【自适应阈值分割】" , &g_C,255, on_Threshold );// 5、初始化自定义的阈值回调函数on_Threshold( 0, 0 );// 6、轮询等待用户按键,如果ESC键按下则退出程序while(1){int key;key = waitKey( 20 );if( (char)key == 27 ){ break; }}return 0;
}
void on_Threshold( int, void* )
{   // 自适应阈值分割adaptiveThreshold(g_grayImage, g_matAdaptive, 255, g_nadaptiveMethod, THRESH_BINARY_INV, 2*g_blockSize+1, g_C);// 更新效果图imshow( "【自适应阈值分割】" , g_matAdaptive );
}

结果:


OpenCV学习笔记(十一):阈值化:threshold(),adaptivethreshold()相关推荐

  1. OpenCV学习笔记十一-findcounters函数

    findCounters函数是个重载函数,有两种声明方式: 普通声明: findContours( InputOutputArray image, OutputArrayOfArrays contou ...

  2. OpenCV学习笔记(五十一)——imge stitching图像拼接stitching OpenCV学习笔记(五十二)——号外:OpenCV 2.4.1 又出来了。。。。。 OpenCV学习笔记(五

    OpenCV学习笔记(五十一)--imge stitching图像拼接stitching stitching是OpenCV2.4.0一个新模块,功能是实现图像拼接,所有的相关函数都被封装在Stitch ...

  3. opencv学习笔记10:阈值分割

    阈值分割 像素图 原始图像像素图 见下面 红色线:标注一条阈值线 二进制阈值化 首先设定一条阀值线 如127 大于127的像素点灰度值设为最大(如unit8的格式为255) 小于127的像素点灰度值设 ...

  4. opencv学习笔记之二值化

    opencv学习笔记之二值化 1.什么是二值化 二值化,从名词意义上可以看出来,是将一共物体转化成两个值.二值即:0或255.即一个白色一个黑色.即一个图片经过二值化之后会显示成白色和黑色的形式. 2 ...

  5. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co

    OpenCV学习笔记(四十一)--再看基础数据结构core 记得我在OpenCV学习笔记(四)--新版本的数据结构core里面讲过新版本的数据结构了,可是我再看这部分的时候,我发现我当时实在是看得太马 ...

  6. OpenCV自适应阈值化函数adaptiveThreshold详解,并附实例源码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 2016-6-14日:又发现一种阈值分割法,最大 ...

  7. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  8. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  9. OpenCV学习笔记(十一)(十二)(十三)(十四)(十五)

    OpenCV学习笔记(十一)--谈谈像素的类型和对Templates的限制使用 Templates是c++的一个很强大的特征,可以是数据结构更加安全高效.但也会增加编译时间和代码的长度,当函数被频繁调 ...

最新文章

  1. bug诞生记——const_cast引发只读数据区域写违例
  2. 超越RMI,高效Java remote调用
  3. 关于Warshall、Roy对寻找传递闭包方法的不同表达的探讨
  4. Image Pro Plus测量组织平均厚度
  5. .Net Core分布式部署中的DataProtection密钥安全性
  6. 我对软件开发的一点思考
  7. 【高并发解决方案】1、高并发解决方案汇总
  8. 语音识别技术是什么_语音识别技术应用领域介绍
  9. CheerpJ调用的两种方式
  10. 日报管理系统_设备维护管理系统的自动化报告功能
  11. 单循环赛制php,年度总决赛个人PK循环赛赛制解读
  12. 华为手机像素密度排行_「屏幕像素密度」(全解析)屏幕尺寸,分辨率,像素,PPI之间到底什么关系? - seo实验室...
  13. 如何设置无线网络中计算机的ip,无线网络设置方法【详细步骤】
  14. 那些怪异的量化交易策略
  15. (一)SDN基本架构
  16. checkra1n越狱错误79_新的unc0ver漏洞可让运行iOS / iPadOS 12至13.5的苹果iPhone和iPad越狱...
  17. 三相滤波器怎么接线_三相滤波器(380v滤波器)
  18. 判断一个数是否为Sky数
  19. 百度地图离线化(API v=1.3)
  20. 部署在IIS上的程序,可以找到文件夹,能看到文件却报404

热门文章

  1. final 数组 java_Java Final数组列表
  2. 什么?!“路由器”也会做信息抽取了?
  3. 他与她,一个两年前的故事
  4. 会议交流 | DataFunCon 线上大会 - 知识图谱专题论坛
  5. 领域应用 | 如何将知识图谱特征学习应用到推荐系统?
  6. 知识工场 | CN-DBpedia 漫游指南
  7. 快速的找出元素是否在list中 python
  8. Keras共享某个层
  9. [KMP]一本通(http://ybt.ssoier.cn:8088) 1698:字符串匹配
  10. 18-ESP8266 SDK开发基础入门篇--TCP 服务器 RTOS版,串口透传,TCP客户端控制LED