OpenCV4.9​​​​基本阈值操作

目标

在本教程中,您将学习如何:

  • 使用 OpenCV 函数 cv::threshold 执行基本阈值操作

理论依据

注意

下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书

阈值?

  • 最简单的分割方法
  • 应用示例:分离出与要分析的对象相对应的图像区域。这种分离基于对象像素和背景像素之间的强度变化。
  • 为了将我们感兴趣的像素与其他像素区分开来(最终会被拒绝),我们对每个像素强度值与阈值(根据要解决的问题确定)进行比较。
  • 一旦我们正确地分离了重要的像素,我们就可以为它们设置一个确定的值来识别它们(即我们可以为它们分配一个值(0)(黑色)、(255)(白色)或任何适合您需求的值)。
  • .

阈值的类型

  • OpenCV 提供了函数 cv::threshold 来执行阈值操作。
  • 我们可以使用此函数实现 (5) 类型的阈值操作。我们将在以下小节中解释它们。
  • 为了说明这些阈值过程是如何工作的,让我们假设我们有一个源图像,其像素的强度值为(src(x,y))下图描绘了这一点。水平蓝线表示阈值 (thresh)(固定)。

阈值二进制

  • 此阈值操作可以表示为:

  • 因此,如果像素src(x,y) 的强度高于 (thresh),则新像素强度设置为 (MaxVal)否则,像素设置为(0)。

阈值二进制,反转

  • 此阈值操作可以表示为:

  • 如果像素src(x,y) 的强度高于 thresh,则新像素强度设置为0.否则,它设置为MaxVal

截断

  • 此阈值操作可以表示为:

  • 像素的最大强度值为 thresh,如果src(x,y)大于此,则其值将被像素的最大强度值为。见下图:

阈值为零

  • 此操作可以表示为:

  • 如果 src(x,y)低于thresh,则新像素值将设置为 0。

阈值为零,倒置

  • 此操作可以表示为:

  • 如果src(x,y)大于thresh,则新像素值将设置为0。

演示代码

C++

教程代码如下所示。您也可以从这里下载

#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>using namespace cv;
using std::cout;int threshold_value = 0;
int threshold_type = 3;
int const max_value = 255;
int const max_type = 4;
int const max_binary_value = 255;Mat src, src_gray, dst;
const char* window_name = "Threshold Demo";const char* trackbar_type = "Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted";
const char* trackbar_value = "Value";static void Threshold_Demo( int, void* )
{/* 0: Binary1: Binary Inverted2: Threshold Truncated3: Threshold to Zero4: Threshold to Zero Inverted*/threshold( src_gray, dst, threshold_value, max_binary_value, threshold_type );imshow( window_name, dst );
}int main( int argc, char** argv )
{String imageName("stuff.jpg"); // by defaultif (argc > 1){imageName = argv[1];}src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an imageif (src.empty()){cout << "Cannot read the image: " << imageName << std::endl;return -1;}cvtColor( src, src_gray, COLOR_BGR2GRAY ); // Convert the image to GraynamedWindow( window_name, WINDOW_AUTOSIZE ); // Create a window to display resultscreateTrackbar( trackbar_type,window_name, &threshold_type,max_type, Threshold_Demo ); // Create a Trackbar to choose type of ThresholdcreateTrackbar( trackbar_value,window_name, &threshold_value,max_value, Threshold_Demo ); // Create a Trackbar to choose Threshold valueThreshold_Demo( 0, 0 ); // Call the function to initializewaitKey();return 0;
}

解释

C++

让我们检查一下程序的一般结构:

  • 加载图像。如果是 BGR,我们将其转换为灰度。为此,请记住,我们可以使用函数  cv::cvtColor : :
 String imageName("stuff.jpg"); // by defaultif (argc > 1){imageName = argv[1];}src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an imageif (src.empty()){cout << "Cannot read the image: " << imageName << std::endl;return -1;}cvtColor( src, src_gray, COLOR_BGR2GRAY ); // Convert the image to Gray

  • 创建一个窗口来显示结果
 namedWindow( window_name, WINDOW_AUTOSIZE ); // Create a window to display results
  • 创建2个跟踪栏供用户输入:
    • 阈值类型:二进制、归零等...
    • 阈值
 createTrackbar( trackbar_type,window_name, &threshold_type,max_type, Threshold_Demo ); // Create a Trackbar to choose type of ThresholdcreateTrackbar( trackbar_value,window_name, &threshold_value,max_value, Threshold_Demo ); // Create a Trackbar to choose Threshold value
  • 等到用户输入阈值、阈值类型(或程序退出)
  • 每当用户更改任何 Trackbar 的值时,都会调用函数 Threshold_Demo(Java 中的 update):
static void Threshold_Demo( int, void* )
{/* 0: Binary1: Binary Inverted2: Threshold Truncated3: Threshold to Zero4: Threshold to Zero Inverted*/threshold( src_gray, dst, threshold_value, max_binary_value, threshold_type );imshow( window_name, dst );
}

如您所见,函数 cv::threshold 被调用。我们在 C++ 代码中给出 (5)个参数:

  • src_gray:我们的输入图像
  • dst:目标(输出)图像
  • threshold_value:进行阈值操作所依据的 \(thresh\) 值
  • max_BINARY_value:用于二进制阈值操作的值(用于设置所选像素)
  • threshold_type:(5) 阈值操作之一。它们列在上面函数的注释部分。

结果

  1. 编译此程序后,运行它,将图像的路径作为参数。例如,对于输入图像,如下所示:

  1. 首先,我们尝试使用反转的二进制阈值来阈值图像。我们预计比 \(thresh\) 更亮的像素会变暗,这就是我们实际发生的情况,正如我们在下面的快照中看到的那样(请注意,从原始图像中可以看出,与图像相比,狗狗的舌头和眼睛特别明亮,这反映在输出图像中)。

  1. 现在我们尝试将阈值设置为零。这样,我们预计最暗的像素(低于阈值)将完全变为黑色,而值大于阈值的像素将保持其原始值。这由输出图像的以下快照验证:


参考文献:

1、《Basic Thresholding Operations》-----Ana Huamán

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

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

相关文章

使用 R.swift(生成不了R.generated.swift)

今天算是正儿八经创建第一个swift工程&#xff0c;照着视频引用R.swift pod R.swift 工程配置 "$PODS_ROOT/R.swift/rswift" generate "$SRCROOT/R.generated.swift" $TEMP_DIR/rswift-lastrun $SRCROOT/R.generated.swift * 注意 Run角本要放在 Che…

vmware安装win10及ubuntu

安装win10 新建一个文件夹 选择刚才创建的文件夹 选择需要保存文件的位置&#xff0c;还是选择刚才创建的文件夹 选择自定义硬件 选择下载的win10镜像iso文件,导入后&#xff0c;点击完成即可 接下来就是下一步 没有此电脑&#xff0c;可以点击个性化-》主题-》桌面设置…

已解决ERROR:ssl_client_socket_impl.cc(992)] handshake failed; returned -1, SSL error code 1, net_error

已解决ERROR:ssl_client_socket_impl.cc(992)] handshake failed; returned -1, SSL error code 1, net_error -101 文章目录 报错问题报错翻译报错原因解决方法千人全栈VIP答疑群联系博主帮忙解决报错 报错问题 粉丝群里面的一个小伙伴遇到问题跑来私信我&#xff0c;想用s…

MySQL复习

in和exists的区别&#xff1f; in是内外表hash连接&#xff0c;exists是对外表做loop循环&#xff0c;每次loop后再对内表查询&#xff0c;如果外表小就用exists&#xff1b; not in和not exists前者是全表扫描&#xff0c;后者是可以走索引 锁 对于标准的插入操作&#xf…

CUDA编程---全局内存

CUDA内存模型概述 内存的访问和管理是所有编程语言的重要部分。在现代加速器中&#xff0c;内存管理对高性能计算有着很大的影响。因为多数工作负载被加载和存储数据的速度所限制&#xff0c;所以有大量低延迟、高带宽的内存对性能是十分有利的。 然而&#xff0c;大容量、高性…

基于51单片机的无线病床呼叫系统设计—LCD1602显示

基于51单片机的无线病床呼叫系统 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.病人按下按键&#xff0c;LCD1602显示对应的床位号&#xff1b; 2.多人同时呼叫&#xff0c;显示屏同时显示&#xf…

React 使用 three.js 加载 gltf 3D模型 | three.js 入门

系列文章 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制React three.js 实现人脸动捕与3D模型表情同步结合 react-webcam、three.js 与 electron 实现桌面人脸动捕应用 示例项目(gitcode)&#xf…

开源博客项目Blog .NET Core源码学习(15:App.Hosting项目结构分析-3)

本文学习并分析App.Hosting项目中前台页面的关于本站页面和点点滴滴页面。 关于本站页面 关于本站页面相对而言布局简单&#xff0c;与后台控制器类的交互也不算复杂。整个页面主要使用了layui中的面包屑导航、选项卡、模版、流加载等样式或模块。   面包屑导航。使用layui…

【C++]C/C++的内存管理

这篇博客将会带着大家解决以下几个问题 1. C/C内存分布 2. C语言中动态内存管理方式 3. C中动态内存管理 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placement-new) 1. C/C内存分布 我们先来看下面的一段代码和相关问题 int global…

第二证券策略:股指预计维持震荡格局 关注汽车、工程机械等板块

第二证券指出&#xff0c;指数自今年2月份阶段低点反弹以来&#xff0c;3月份持续高位整理。进入4月份之后面对年报和一季报的双重财报发表期&#xff0c;预计指数短期保持高位整理概率比较大。前期缺乏成绩支撑的概念股或有回落的危险&#xff0c;主张重视成绩稳定、估值低、分…

快速入门深度学习9.1(用时20min)——GRU

速通《动手学深度学习》9.1 写在最前面九、现代循环神经网络9.1 门控循环单元&#xff08;GRU&#xff09;9.1.1. 门控隐状态9.1.1.1. 重置门和更新门9.1.1.2. 候选隐状态9.1.1.3. 隐状态 9.1.3 API简洁实现小结 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 20…

HTML图片

图片标签&#xff1a; ~img图片标签 ~是自结束标签 ~属性 ~src表示要引入图片的位置 ~src需要一个路径作为参数 ~alt是对图片的描述 ~帮助搜索引擎来识别图片 ~如果不写alt则搜索引擎不会收录图片 ~width与height只有一个时是同步改变的&#xff0c;但两者同时存在时则是两者按…

头歌-机器学习 第11次实验 softmax回归

第1关&#xff1a;softmax回归原理 任务描述 本关任务&#xff1a;使用Python实现softmax函数。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.softmax回归原理&#xff0c;2.softmax函数。 softmax回归原理 与逻辑回归一样&#xff0c;softmax回归同样…

MySQL学习笔记(数据类型, DDL, DML, DQL, DCL)

Learning note 1、前言2、数据类型2.1、数值类型2.2、字符串类型2.3、日期类型 3、DDL总览数据库/表切换数据库查看表内容创建数据库/表删除数据库/表添加字段删除字段表的重命名修改字段名&#xff08;以及对应的数据类型&#xff09; 4、DML往字段里写入具体内容修改字段内容…

杰发科技AC7840——CAN通信简介(3)_时间戳

0. 时间戳简介 时间戳表示的是收到该CAN消息的时刻&#xff0c;通过连续多帧的时间戳&#xff0c;可以计算出CAN消息的发送周期&#xff0c;也可以用于判断CAN消息是否被持续收到。 1. 使用步骤 注意分别是发送和接收的功能&#xff1a; 2. 现象分析_接收时间戳 看下寄存器的…

机器学习(31)PINN

文章目录 摘要Abstract一、监督学习二、文献阅读1. 题目2. abstract3. 偏微分方程的数据驱动解3.1连续时间模型example(Schrodinger equation)&#xff1a; 3.2离散时间模型Example (Allen–Cahn equation)&#xff1a; 4. 文献解读4.1 Introduction4.2 创新点 三、实验内容1.实…

Eigen库从入门到放弃(2. Getting Started)

Eigen的头文件定义了多种类型&#xff0c;但是对于简单的来说&#xff0c;使用MatrixXd就足够了&#xff0c;MatrixXd表示任意尺寸的矩阵&#xff0c;但是要注意数据类型是double的。Eigen/Dense的头文件定义了所有MatrixXd和相关类型的成员函数。所有头文件中定义的函数都是在…

华为2024年校招实习硬件-结构工程师机试题(四套)

华为2024年校招&实习硬件-结构工程师机试题&#xff08;四套&#xff09; &#xff08;共四套&#xff09;获取&#xff08;WX: didadidadidida313&#xff0c;加我备注&#xff1a;CSDN 华为硬件结构题目&#xff0c;谢绝白嫖哈&#xff09; 结构设计工程师&#xff0c;结…

基于”Python+”多技术融合在蒸散发与植被总初级生产力估算中的应用

熟悉蒸散发ET及其组分&#xff08;植被蒸腾Ec、土壤蒸发Es、冠层截留Ei&#xff09;、植被总初级生产力GPP的概念和碳水耦合的基本原理&#xff1b;掌握利用Python与ArcGIS工具进行课程相关的操作&#xff1b;熟练掌握国际上流行的Penman-Monteith模型&#xff0c;并能够应用该…

大语言模型总结整理(不定期更新)

《【快捷部署】016_Ollama&#xff08;CPU only版&#xff09;》 介绍了如何一键快捷部署Ollama&#xff0c;今天就来看一下受欢迎的模型。 模型简介gemmaGemma是由谷歌及其DeepMind团队开发的一个新的开放模型。参数&#xff1a;2B&#xff08;1.6GB&#xff09;、7B&#xff…