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

2024-04-14 23:44
文章标签 操作 阈值 基本 opencv4.9

本文主要是介绍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

这篇关于OpenCV4.9​​​​基本阈值操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

python操作redis基础

《python操作redis基础》Redis(RemoteDictionaryServer)是一个开源的、基于内存的键值对(Key-Value)存储系统,它通常用作数据库、缓存和消息代理,这篇文章... 目录1. Redis 简介2. 前提条件3. 安装 python Redis 客户端库4. 连接到 Re

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

MySQL表空间结构详解表空间到段页操作

《MySQL表空间结构详解表空间到段页操作》在MySQL架构和存储引擎专题中介绍了使用不同存储引擎创建表时生成的表空间数据文件,在本章节主要介绍使用InnoDB存储引擎创建表时生成的表空间数据文件,对... 目录️‍一、什么是表空间结构1.1 表空间与表空间文件的关系是什么?️‍二、用户数据在表空间中是怎么