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.mzph.cn/news/815820.shtml

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

相关文章

步骤大全:网站建设3个基本流程详解

一.领取一个免费域名和SSL证书&#xff0c;和CDN 1.打开网站链接&#xff1a;https://www.rainyun.com/z22_ 2.在网站主页上&#xff0c;您会看到一个"登陆/注册"的选项。 3.点击"登陆/注册"&#xff0c;然后选择"微信登录"选项。 4.使用您的…

Claude3和GPT4哪个强?

在短短两个月内&#xff0c;全球最强人工智能的桂冠再次易主。此前&#xff0c;Claude3 Opus以其卓越的表现超越了GPT-4&#xff0c;吸引了无数用户抛弃GPT&#xff0c;转而拥抱Claude3。然而&#xff0c;OpenAI近日强势回归&#xff0c;用实力证明了GPT依然是人工智能领域的霸…

Jmeter杂记:测试计划参数详解

测试计划各参数详解 1&#xff0c;用户自定义变量&#xff0c;是全局变量&#xff0c;供所有线程组使用&#xff0c;可用配置元件&#xff1a;用户自定义变量替代 2&#xff0c;连续的运行线程组&#xff0c;默认不勾选&#xff0c;则随机的运行多个线程组中的取样器&#xff…

图机器学习NetworkX代码实战-创建图和可视化

完整代码见资源&#xff0c;下面列举了其中的几个图 安装networkX及相应工具包 pip install numpy pandas matplotlib tqdm networkx 当安装完成后&#xff0c;输入如下代码验证版本及是否安装成功 import networkx as nxnx.__version__ import matplotlib.pyplot as plt …

国内ai人工智能软件大全

很多人一直在寻找一个稳定且可靠的全球AI大模型测试平台&#xff0c;希望它不仅真实可信&#xff0c;而且能提供稳定、快速的服务&#xff0c;不会频繁出现故障或响应缓慢。迄今为止&#xff0c;我已经尝试了国内外至少10个不同的服务站点。不幸的是&#xff0c;这些站点总是存…

Linux 文件页反向映射

0. 引言 操作系统中与匿名页相对的是文件页&#xff0c;文件页的反向映射对比匿名页的反向映射更为简单。如果还不清楚匿名页反向映射逻辑的&#xff0c;请移步 匿名页反向映射 1. 文件页反向映射数据结构 struct file&#xff1a; 用户进程每open()一次文件&#xff0c;则会生…

分享一个 git stash 的实际使用场景。

当我将新的变更记录提交为 git commit --amend 后&#xff0c;发现这需要修改云端上的提交记录&#xff0c;也就是 vscode 中会出现这张图 于是&#xff0c;我通过 git reset head^ 撤销掉刚刚的提交。 reset 前&#xff1a; reset 后&#xff1a; 但在撤销的同时&#xf…

深入理解计算机网络分层结构

一、 为什么要分层&#xff1f; 计算机网络分层的主要目的是将复杂的网络通信过程分解为多个相互独立的层次&#xff0c;每个层次负责特定的功能。这样做有以下几个好处&#xff1a; 模块化设计&#xff1a;每个层次都有清晰定义的功能和接口&#xff0c;使得网络系统更易于设…

解决Xshell登录云服务器的免密码和云服务器生成子用户问题

Xshell登录云服务器的免密码问题 前言一、Xshell登录云服务器的免密码操作实践 二、centos创建用户创建用户实操删除用户更改用户密码直接删除子用户 前言 Xshell登录云服务器免密码问题的解决方案通常涉及使用SSH密钥对。用户生成一对密钥&#xff08;公钥和私钥&#xff09;…

Spring源码刨析之配置文件的解析和bean的创建以及生命周期

public void test1(){XmlBeanFactory xmlBeanFactory new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));user u xmlBeanFactory.getBean("user",org.xhpcd.user.class);// System.out.println(u.getStu());}先介绍一个类XmlBeanFac…

Linux —— FTP服务【从0-1】

目录 一、介绍 1.概述 2.FTP的传输模式 PORT 主动模式 PASV 被动模式 3.FTP服务的作用 二、搭建FTP服务器 FTP服务端配置 1.安装vsftpd文件服务 2.启动服务 3.防火墙配置 4.FTP服务相关文件说明 FTP客户端配置 1.安装FTP客户端工具 lftp 2.访问FTP服务器 Linux系…

深度学习图像处理基础工具——opencv 实战2 文档扫描OCR

输入一个文档&#xff0c;怎么进行文档扫描&#xff0c;输出扫描后的图片呢&#xff1f; 今天学习了 opencv实战项目 文档扫描OCR 问题重构&#xff1a;输入图像 是一个含有文档的图像——> 目标是将其转化为 规则的扫描图片 那么怎么实现呢&#xff1f; 问题分解&#…

Python 复杂密码图形化生成工具,支持选择生成10位和12位复杂密码(初版)

代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2024/3/26 15:22 # Author : wyq # File : 部署测试.py import random import string from tkinter import *def generate_password(length):characters string.ascii_letters string.digits string.p…

【vue】Vue3开发中常用的VSCode插件

Vue - Official&#xff1a;vue的语法特性&#xff0c;如代码高亮&#xff0c;自动补全等 Vue VSCode Snippets&#xff1a;自定义一些代码片段 v3单文件组件vdata数据vmethod方法 别名路径跳转 参考 https://www.bilibili.com/video/BV1nV411Q7RX

学校4-11天梯赛选拔赛

目录 L1-5 6翻了 题目 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 思路 AC代码 L1-1 嫑废话上代码 题目 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; AC代码 L1-8 刮刮彩…

深入了解边缘AI的发展

人工智能先进功能的融合、物联网设备的广泛采用以及边缘计算的强大性能释放了边缘AI的潜力。这种变革性的协同作用涵盖了辅助医疗诊断、自动驾驶和仓库物流自动化等应用。 边缘计算起源于1990年代的内容分发网络&#xff0c;现在被广泛使用&#xff0c;尤其是在边缘AI领域。企…

Vue入门:天不生Vue,前端万古如长夜 - Vue从入门到放弃

&#x1f44b; Vue环境搭建 首先&#xff0c;搭一个打代码的环境 1.安装node.js 在使用VS Code之前&#xff0c;需要安装Vue的开发环境。 安装Vue的最简单方法是使用npm包管理器&#xff0c;先安装Node.js和npm。 node官网 ​​ 2.配置环境变量 在nodejs安装目录下新建…

免费分享Springboot+Vue的影院管理系统源码,真酷!

今天给大家分享一套基于SpringbootVue的影院管理系统源码&#xff0c;在实际项目中可以直接复用。(免费提供&#xff0c;文末自取) 一、系统运行图 1、登陆页面 2、系统后台 3、选座功能 影院管理系统通常具有以下七个功能点&#xff1a; 1.电影管理&#xff1a; 包括电影信…

c++ - 动态载入DLL接口,可以给IDA静态分析增加一点麻烦

文章目录 c - 动态载入DLL接口&#xff0c;可以给IDA静态分析增加一点麻烦概述笔记测试工程test_load_dll_then_call_api.cppCMyUser32Dll.hCMyUser32Dll.cppLateLoad.hIDA静态分析引入表中没有PostMessageW字符串查找能找到PostMessageW备注看看CMyUser32Dll.h编译完的样子备注…

CSS快速入门

目录 一、CSS介绍 1、什么是CSS&#xff1f; ​编辑2、基本语法规范 3、引入方式 4、规范 二、CSS选择器 1、标签选择器 2、类&#xff08;class&#xff09;选择器 3、id选择器 4、通配符选择器 5、复合选择器 三、常用CSS 1、color 2、font-size 3、border 4…