c++视觉处理----固定阈值操作:Threshold()函数,实时处理:二值化,反二值化,截断,设为零,反向设为零

news2024/11/15 12:04:18

固定阈值操作: Threshold()函数

cv::threshold() 函数是OpenCV中用于执行固定阈值二值化操作的函数。它可以用来将图像中的像素值根据用户定义的阈值转换为二进制值(0或255),以便进行图像分割、物体检测和特征提取等任务。

cv::threshold() 函数的基本语法如下:

double cv::threshold(
    cv::InputArray src,       // 输入图像
    cv::OutputArray dst,      // 输出图像
    double thresh,            // 阈值
    double maxval,            // 阈值以上像素的新值
    int type                  // 阈值类型
);

参数解释:

  • src:输入图像,应为单通道灰度图像。
  • dst:输出图像,函数将处理后的图像存储在这里。
  • thresh:阈值,用于将像素分为两类。像素值大于等于阈值将被赋予 maxval 值,小于阈值的将被赋予0。
  • maxval:阈值以上像素的新值,通常为255。
  • type:阈值类型,用于指定阈值化的方式,常见的类型包括
    • cv::THRESH_BINARY(二值化)、
    • cv::THRESH_BINARY_INV(反二值化)、
    • cv::THRESH_TRUNC(截断)、
    • cv::THRESH_TOZERO(设为零)、
    • cv::THRESH_TOZERO_INV(反向设为零)等。

以下是一个简单的示例代码,演示如何使用 cv::threshold() 函数对图像进行二值化:

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image = cv::imread("input_image.jpg", cv::IMREAD_GRAYSCALE);

    if (image.empty()) {
        std::cerr << "Failed to open the image!" << std::endl;
        return -1;
    }

    // 设置阈值和阈值类型
    double thresholdValue = 128;
    double maxVal = 255;
    int thresholdType = cv::THRESH_BINARY; // 二值化

    // 应用阈值操作
    cv::Mat thresholdedImage;
    cv::threshold(image, thresholdedImage, thresholdValue, maxVal, thresholdType);

    // 显示处理后的图像
    cv::imshow("Thresholded Image", thresholdedImage);
    cv::waitKey(0);

    return 0;
}

在这里插入图片描述

使用相机实时处理:二值化,反二值化,截断,设为零,反向设为零

#include <opencv2/opencv.hpp>

// 回调函数,用于处理滑动条变化
void onThresholdChange(int thresholdType, void* userdata) {
    cv::Mat* inputImage = static_cast<cv::Mat*>(userdata);

    // 初始化阈值和阈值类型
    int thresholdValue = 128;
    int maxVal = 255;

    // 应用不同类型的阈值操作
    switch (thresholdType) {
    case 0: // 二值化
        cv::threshold(*inputImage, *inputImage, thresholdValue, maxVal, cv::THRESH_BINARY);
        break;
    case 1: // 反二值化
        cv::threshold(*inputImage, *inputImage, thresholdValue, maxVal, cv::THRESH_BINARY_INV);
        break;
    case 2: // 截断
        cv::threshold(*inputImage, *inputImage, thresholdValue, maxVal, cv::THRESH_TRUNC);
        break;
    case 3: // 设为零
        cv::threshold(*inputImage, *inputImage, thresholdValue, maxVal, cv::THRESH_TOZERO);
        break;
    case 4: // 反向设为零
        cv::threshold(*inputImage, *inputImage, thresholdValue, maxVal, cv::THRESH_TOZERO_INV);
        break;
    default:
        break;
    }

    // 显示处理后的图像
    cv::imshow("Thresholded Image", *inputImage);
}

int main() {
    cv::VideoCapture cap(0); // 打开本地相机
    if (!cap.isOpened()) {
        std::cerr << "Failed to open the camera!" << std::endl;
        return -1;
    }

    cv::Mat frame;
    cap >> frame; // 读取一帧图像

    // 创建窗口
    cv::namedWindow("Thresholded Image");

    // 初始化阈值类型滑动条
    int initialThresholdType = 0;
    cv::createTrackbar("Threshold Type", "Thresholded Image", &initialThresholdType, 4, onThresholdChange, &frame);

    // 显示原始图像
    cv::imshow("Thresholded Image", frame);

    // 循环捕获并处理图像,直到按下ESC键退出
    while (true) {
        int key = cv::waitKey(10);
        if (key == 27) // 按下ESC键退出循环
            break;

        cap >> frame; // 读取一帧图像

        // 实时更新阈值类型滑动条的值,触发回调函数
        cv::setTrackbarPos("Threshold Type", "Thresholded Image", initialThresholdType);

        // 显示原始图像
       // cv::imshow("Thresholded Image", frame);
    }

    // 关闭相机和窗口
    cap.release();
    cv::destroyAllWindows();

    return 0;
}

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

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

相关文章

迁移Linux服务器用户数据(将一个服务器的Linux用户数据迁移到另一个Linux服务器用户的流程)

文章目录 1、打包源Linux服务器用户的数据2、发送源Linux服务器用户的数据3、查看目的服务器用户接受到的数据 1、打包源Linux服务器用户的数据 先来到根目录&#xff0c;再使用tar命令打包数据&#xff1a;tar czvf root.zip.gz ./* 2、发送源Linux服务器用户的数据 在根目…

【深度学习】深度学习实验二——前馈神经网络解决上述回归、二分类、多分类、激活函数、优化器、正则化、dropout、早停机制

一、实验内容 实验内容包含要进行什么实验&#xff0c;实验的目的是什么&#xff0c;实验用到的算法及其原理的简单介绍。 1.1 手动实现前馈神经网络解决上述回归、二分类、多分类问题 分析实验结果并绘制训练集和测试集的loss曲线。 原理介绍&#xff1a;回归问题使用的损失函…

【手写数字识别】GPU训练版本

SVM Adaboost Bagging 完整代码 I import torch import torch.nn.functional as F from torch.utils.data import DataLoader, TensorDataset from torchvision import transforms, datasets import matplotlib.pyplot as plt# 超参数 batch_size 64 num_epochs 10# 数据…

计算机网络第三章——数据链路层(二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 3.4.2 停止等待协议为什么要有停止等待协议无差错情况有差错的情况 停等协议性能分析脑图时刻 3.4.3 后退n帧协议后退n帧协议中的滑动窗口GBN发送方必须响应的三件事…

智能晾衣架丨以科技解放双手

以往的晾衣架大多是平放式、手摇式居多&#xff0c;为衣物的晾晒提供了一个“栖身之所。”随着科技的日新月异&#xff0c;智能家居的产品越来越多。晾衣架也不例外&#xff0c;一款带有语音控制升降、同时具备照明和消毒的多功能衣架也已深入生活&#xff0c;正被人们所接受。…

算法题系列12·字符串判断子序列

目录 题目描述 实现 题目描述 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"…

RabbitMQ与springboot整合

1、基本概念 Server&#xff1a;接收客户端的连接&#xff0c;实现AMQP实体服务&#xff1b;Connection&#xff1a;连接&#xff0c;应用程序与Server的网络连接&#xff0c;TCP连接&#xff1b;Channel&#xff1a;信道&#xff0c;消息读写等操作在信道中进行。客户端可以建…

Python 图形化界面基础篇:发布应用程序到不同平台

Python 图形化界面基础篇&#xff1a;发布应用程序到不同平台 引言步骤1&#xff1a;准备应用程序1.1 处理依赖关系1.2 创建用户文档1.3 处理平台差异 步骤2&#xff1a;创建安装程序2.1 使用cx_Freeze创建独立包2.2 使用 PyInstaller 创建可执行文件2.3 使用其他工具 步骤3&am…

如何在 Spring Boot 中进行数据备份

在Spring Boot中进行数据备份 数据备份是确保数据安全性和可恢复性的关键任务之一。Spring Boot提供了多种方法来执行数据备份&#xff0c;无论是定期备份数据库&#xff0c;还是将数据导出到外部存储。本文将介绍在Spring Boot应用程序中进行数据备份的不同方法。 方法1: 使用…

CSS图文悬停翻转效果完整源码附注释

实现效果截图 HTML页面源码 <!DOCTYPE html> <html><head><meta http-equiv="content-type

正点原子嵌入式linux驱动开发——Linux内核移植

之前的两篇笔记&#xff0c;简单了解了一下Linux内核顶层 Makefile和Linux内核的启动流程&#xff0c;本篇内容来学习一下如何将ST官方提供的Linux内核移植到正点原子的STM32MP157开发板上。通过本章的学习&#xff0c;将掌握如何将半导体厂商提供的Linux BSP包移植到自己的平台…

【分享】小红书数据采集入excel表格

思路&#xff1a; 1. 打开小红书关键词页面 2. 循环指定次数&#xff0c;并鼠标往下滚 3. 获取元素列表&#xff0c;循环元素列表 4. 判断标题是否在list中&#xff0c;如果在就跳过&#xff0c;如果不在将标题存入list中 5. 点击元素&#xff0c;读取标题和内容&#xff…

LeetCode 1503. 所有蚂蚁掉下来前的最后一刻【脑筋急转弯】1618

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

2018架构真题案例(四十九)

某文件采用多级索引结构&#xff0c;磁盘大小4K字节&#xff0c;每个块号4字节&#xff0c;那么二级索引结果时&#xff0c;文件最大。 A、1024 B、1024*1024 C、2048*2048 D、4096*4096 答案&#xff1a;B 霍尔三维结构以时间堆、&#xff08;&#xff09;堆、知识堆组成…

vue踩坑

文章目录 1.error1 1.error1 在项目里面前端报这个错&#xff0c;有点蒙 确定了错误是在遍历数组中的图片部分 猜测可能是一开始的时候没有把photoList在form中写出来&#xff0c;form里面啥没有&#xff0c;导致渲染的时候有问题 所以以后在页面上渲染数据的都在data里…

网络-WebSocket

文章目录 前言一、WebSocket简介应用场景原理 二、使用心跳监测广播消息 三、群聊demo总结 前言 本文主要记录WebSocket的简单介绍和使用&#xff0c;完成群聊的demo 一、WebSocket简介 WebSocket是一种通信协议&#xff0c;它通过单个TCP连接提供全双工的通信通道。 它允许客…

【C#】标准WebService Soap1.1 兼容 ContentType: application/xml

一、问题描述 1.1 ESB平台要求 ContentType&#xff1a;application/xml Soap协议版本&#xff1a;1.1 1.2 提供的 WebService 接口 语言&#xff1a;C# 目标框架&#xff1a;.NetFramework 4.6.1 1.3 Postman 测试结果 HTTP Error 415.0 - Unsupported Media Type 服务器…

计算机竞赛YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快&#xff0c;YOLOv6还没用熟YOLOv7就来了&#xff0c;如果有同学的毕设项目想用上最新的技术&#xff0c;不妨看看学长的这篇文章&#xff0c;学长带大家简单的…

如何为您的 Linux 服务器设置简单的 Grafana 云监控仪表板

Grafana 是一个开源可观察性平台,用于创建可视化数据集的仪表板。您可以使用它方便地监控服务器统计信息,例如 CPU 消耗、网络吞吐量和正常运行时间。 Grafana可以自托管,也可以通过官方Grafana Cloud实例作为 SaaS 解决方案进行访问。在本文中,您将了解如何设置 Grafana …

修炼k8s+flink+hdfs+dlink(四:k8s(一)概念)

一&#xff1a;概念 1. 概述 1.1 kubernetes对象. k8s对象包含俩个嵌套对象字段。 spec&#xff08;规约&#xff09;&#xff1a;期望状态 status&#xff08;状态&#xff09;&#xff1a;当前状态 当创建对象的时候&#xff0c;会按照spec的状态进行创建&#xff0c;如果…