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

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设置为01 = THRESH_BINARY_INV反二进制阈值化:
将灰度值大于thresh的设置为0,不大于thresh设置为maxval。2 = THRESH_TRUNC截断阈值化:
将灰度值大于thresh的设置为threshold,不大于thresh的灰度值不变。3 = THRESH_TOZERO阈值化为0:
将灰度值大于thresh的不变,超过阈值置为04 = 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 );
}

结果:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北京邮电大学刘伟教授:人机融合与混合智能的新应用场景

前言&#xff1a;本文是北京邮电大学人机交互与认知工程实验室主任、科技委人机融合智能组首席科学家刘伟教授就混合智能的产生、起源和新应用场景所做的深度阐述。第一部分是刘伟老师从新书《崛起的超级智能&#xff1a;互联网大脑如何影响科技未来》延伸的关于人机融合的思考…

VC++6.0怎么打开工程

点击文件→打开&#xff0c;选择工程所在文件夹&#xff0c;选择后缀名为dsp的文件打开即可。 若直接选择cpp后缀名打开&#xff0c;打开的只是cpp文件&#xff0c;而不是工程&#xff0c;此时VC右侧不会显示工程信息。

问题解决:QtCreator屏蔽指定警告:如C4819等

QT creator 频繁报出 &#xff0c;不好解决的错误如&#xff1a; warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 方法一&#xff1a;&#xff08;屏蔽此警告&#xff09; 在工程文件.pro里面添加 # disable C…

解析|2G~5G与未来天线技术!

来源&#xff1a;电子万花筒过去二十年&#xff0c;我们见证了移动通信从1G到4G LTE的转变。在这期间&#xff0c;通信的关键技术在发生变化&#xff0c;处理的信息量成倍增长。而天线&#xff0c;是实现这一跨越式提升不可或缺的组件。按照业界的定义&#xff0c;天线是一种变…

QT+OpenCV综合示例:图像混合(滑动条)

QTOpenCV综合示例&#xff1a;图像混合&#xff08;滑动条&#xff09;1、代码&#xff1a;2、运行结果&#xff1a;0&#xff09;Widget_op.ui &#xff08;界面文件&#xff09;设计&#xff1a; 1、代码&#xff1a; 1&#xff09;opencv_imwrite_Q.pro 添加&#xff1a;…

图说报告|智能技术群的“核聚变”推动智能+时代到来

来源&#xff1a;阿里研究院2019年政府工作报告正式提出了“智能”重要战略。5G、物联网、人工智能、数字孪生、云计算、边缘计算等智能技术群的融合与叠加就像“核聚变”&#xff0c;推动着万物互联迈向万物智能时代&#xff0c;进而带动了“智能”时代的到来&#xff0c;以智…

C++局部变量和全局变量的初始化

当局部变量被定义时&#xff0c;系统不会对其初始化&#xff0c;此时局部变量的初始值未定义&#xff0c;必须自行对其初始化。定义全局变量时&#xff0c;系统会自动初始化为下列值&#xff1a;

OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器

OpenCV学习笔记&#xff08;十二&#xff09;&#xff1a;边缘检测&#xff1a;Canny(),Sobel(),Laplace(),Scharr滤波器 1&#xff09;滤波&#xff1a;边缘检测的算法主要是基于图像强度的一阶和二阶导数&#xff0c;但导数通常对噪声很敏感&#xff0c;因此必须采用滤波器来…

微软转型里程碑:云计算收入首次超过Windows业务

来源&#xff1a;腾讯科技导语 微软云计算业务第二季度收入为114亿美元&#xff0c;实现了64%的营收增长&#xff0c;上年同期和上一季度的增幅分别为89%和73%。腾讯科技讯 据国外媒体报道&#xff0c;微软公司今日公布了二季度财报&#xff08;自然季度&#xff0c;下同&#…

OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( )

OpenCV学习笔记&#xff08;十三&#xff09;&#xff1a;霍夫变换&#xff1a;HoughLines(),HoughLinesP(),HoughCircles( ) 1、霍夫线变换HoughLines() OpenCV支持三种不同的霍夫线变换&#xff0c;它们分别是&#xff1a; 1&#xff09;标准霍夫变换(Standard Hough Trans…

“如果没有IBM和其所提供的系统,我们就无法登上月球。”

来源&#xff1a;IBM中国“如果没有IBM和其所提供的系统&#xff0c;我们就无法登上月球。”——NASA飞行指挥官 Gena Kra1969年7月20日&#xff0c;就在距离阿姆斯特朗迈出“人类一大步”约122米的月球上空&#xff0c;登月舱里突然响起了刺耳的警报声。警报向NASA显示机载电脑…

C++有符号和无符号数的转换

本文转自&#xff1a;http://www.94cto.com/index/Article/content/id/59973.html 1.引例&#xff1a; 今天在做了一道关于有符号数和无符号数相互转换及其左移/右移的问题&#xff0c;被它们之间的转换原理和位移原理搞得头大了。真的很后悔本科的时候没有认真学习《计算机组成…

OpenCV学习笔记(十四):重映射:remap( )

OpenCV学习笔记&#xff08;十四&#xff09;&#xff1a;重映射&#xff1a;remap( ) 图像的坐标映射是通过原图像与目标图像之间建立一种映射关系&#xff0c;这种映射关系有两种&#xff0c;一种是计算原图像任意像素在映射后图像的坐标位置&#xff0c;另一种是计算变换后…

C++中setw()的用法

setw&#xff08;&#xff09; 用于控制输出之间的间隔 #include <iomanip> using std::setw;cout<<s<<setw(8)<<a<<endl; s和a之间有7个空格&#xff0c;cout<<s<<setw(8)<<a<<endl;的意思是s后面输出8个字符&#xf…

自动驾驶产业链全景图

来源&#xff1a;乐晴智库精选自动驾驶产业链构成:感知-决策-执行 三个层面从感知层面看&#xff0c;感知环境的激光雷达、毫米波雷达、摄像头、红外夜视和组合导航设备&#xff0c;感知车辆自身的包括压力传感器、流量传感器、陀螺仪及加速度传感器等传感器都属于感知层面的零…

OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()

OpenCV学习笔记&#xff08;十五&#xff09;&#xff1a;图像仿射变换&#xff1a;warpAffine(),getRotationMatrix2D() 一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式。 仿射变换&#xff08;Affine Transformation或 Affine Map&…

『科技』2019全球最有前景AI公司TOP100

来源&#xff1a;eet-china I 整理&#xff1a;弗锐达引言&#xff1a;硅谷最强智库之一的CB Insights发布AI 100 2019报告&#xff0c;在全球范围内评选出了100家“最有前景”的AI创业公司&#xff0c;其中中国公司有6家&#xff0c;分别是……日前&#xff0c;硅谷最强智库之…

《环球》杂志 :《人工智能的“大脑”》

《环球》杂志 &#xff08;2019年6月26日出版的第13期&#xff09;文章来源&#xff1a;《环球》杂志 &#xff08;2019年6月26日出版的第13期&#xff09;&#xff0c;原题《人工智能的“大脑”》作者&#xff1a;徐贵宝 中国信息通信研究院图片来源&#xff1a;网络编辑&…

人类首次登月50年后,这60家公司决心重返月球

来源&#xff1a; 资本实验室1969年7月20日&#xff0c;美国宇航员尼尔阿姆斯特朗在踏上月球的那一刻&#xff0c;发出了“这是个人的一小步&#xff0c;却是人类的一大步”的经典感慨。这句话既是对地球之外更广袤空间的由衷赞叹&#xff0c;也是对人类勇气与探索精神的坚定表…