当前位置: 首页 > news >正文

实战OpenCV之图像阈值处理

基础入门

        图像阈值处理是一种二值化技术,它基于预设的阈值,可以将图像中的像素分为两大类:一大类是背景,另一大类是前景或目标对象。这个过程涉及将图像中的每个像素值与阈值进行比较,并根据比较结果决定保留原始值还是替换为新值,新值通常是二值化后的0或255。

        OpenCV提供了cv::threshold()函数,以实现基本的阈值处理。

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);

        各个参数的含义如下。

        src:输入的单通道图像,通常为灰度图像。

        dst:输出图像,与src尺寸相同,类型根据type参数确定。

        thresh:阈值。

        maxval:当像素值超过阈值时,设置的新值。

        type:阈值类型,常见的取值如下。

          cv::THRESH_BINARY:大于阈值设为maxval,否则设为0。

          cv::THRESH_BINARY_INV:小于阈值设为maxval,否则设为0。

          cv::THRESH_TRUNC:大于阈值的像素设为阈值,其余不变。

          cv::THRESH_TOZERO:小于阈值的像素设为0,其余不变。

          cv::THRESH_TOZERO_INV:大于阈值的像素设为0,其余不变。

实战解析

        下面的实战代码完成了一个基本的图像处理任务 —— 将一张灰度图像转换成二值图像。

        首先,我们创建一个Mat类型的变量img,并尝试使用imread函数读取图片,通过参数IMREAD_GRAYSCALE指定以灰度模式加载。接下来,我们调用threshold函数对灰度图像img进行阈值处理,将其转换为二值图像。这里,阈值被设置为127,阈值类型为THRESH_BINARY。这意味着,所有像素值大于或等于127的将被设为最大值255(代表白色),其余设为0(代表黑色)。最后,分别使用imshow函数显示原始的灰度图像和经过二值化处理后的图像。

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat img = imread("OpenCV.png", IMREAD_GRAYSCALE);if (img.empty()){cout << "Can not open or find the image" << endl;return -1;}Mat binaryImg;threshold(img, binaryImg, 127, 255, THRESH_BINARY);imshow("Original Image", img);imshow("Binary Image", binaryImg);waitKey(0);return 0;
}

        执行上面的代码,运行效果可参考下图。

        在实际应用中,阈值的选择往往直接影响到后续处理的效果,特别是对于光照变化大、噪声较多的图像。此时,可以使用下面的自适应阈值处理方法。它能够根据图像局部特性动态调整阈值,特别适合于处理光照不均匀的场景,比如:车牌识别、文档扫描等应用。

自适应阈值处理

        自适应阈值处理是一种更智能的图像二值化方法,它不像普通阈值处理那样使用单一固定阈值,而是针对图像的不同区域或区块计算各自的阈值,以适应局部的亮度变化。这对于光照不均匀的图像特别有效,能够更好地保留图像细节。

        在OpenCV中,自适应阈值处理使用cv::adaptiveThreshold()函数,其声明如下。

void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C);

        其参数含义与cv::threshold()类似,额外参数的含义如下。

        adaptiveMethod:自适应方法,常见取值有cv::ADAPTIVE_THRESH_MEAN_C(均值)和cv::ADAPTIVE_THRESH_GAUSSIAN_C(高斯加权)。

        blockSize:用于计算局部阈值的邻域大小,通常选择奇数值,以便有明确的中心像素点。

        C:常数项,从计算出的局部阈值中减去或加上这个常数,用于调整最终的阈值。

        下面的实战代码演示了使用adaptiveThreshold函数进行自适应阈值处理的情形。

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat img = imread("OpenCV.png", IMREAD_GRAYSCALE);if (img.empty()){cout << "Can not open or find the image" << endl;return -1;}// 自适应阈值处理Mat adaptiveThreshImg;adaptiveThreshold(img, adaptiveThreshImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 11, 2);imshow("Original Image", img);imshow("Adaptive Threshold Image", adaptiveThreshImg);waitKey(0);return 0;
}

        执行上面的代码,运行效果可参考下图。可以看到,经过自适应阈值处理后,图像的轮廓变得格外清晰。自适应阈值处理方法适用于复杂光照条件下图像的预处理,有助于提高后续图像分析和识别的准确率。

相关文章:

实战OpenCV之图像阈值处理

基础入门 图像阈值处理是一种二值化技术&#xff0c;它基于预设的阈值&#xff0c;可以将图像中的像素分为两大类&#xff1a;一大类是背景&#xff0c;另一大类是前景或目标对象。这个过程涉及将图像中的每个像素值与阈值进行比较&#xff0c;并根据比较结果决定保留原始值还是…...

登录后继续执行方法

场景 点击按钮&#xff0c;检测到未登录&#xff0c;直接跳转到登录页&#xff0c;登录成功后&#xff0c;返回页面继续执行刚才的点击事件 思路 在跳转时用一个队列存储该事件&#xff0c;登录成功后执行队列里的事件 队列 class Queue {constructor() {this.task []}cl…...

JVM-类加载器的双亲委派模型详解

JVM中存在三个默认的类加载器&#xff1a; BootstrapClassLoaderExtClassLoaderAppClassLoader AppClassLoader的父加载器是ExtClassLoader&#xff0c;ExtClassLoader的父加载器是 BootstrapClassLoader。 它们之间的关系是&#xff1a;AppClassLoader->ExtClassLoader-&…...

【计算机基础题目】Linux系统中文件权限 字母权限和数字权限的相互转换

创作日志&#xff1a; 很久之前对这个略有了解&#xff0c;但是现在完全忘记了&#xff0c;看到这类题目一脸懵逼&#xff0c;现在系统复习下。 1、权限的数字表示&#xff08;3位&#xff09; 在Linux系统中&#xff0c;文件权限由一个三位的八进制数表示&#xff0c;每一位代…...

VRRP协议原理

目录 VRRP概述 VRRP产生背景 VRRP介绍 VRRP相关概念 VRRP报文 VRRP的三种状态 VRRP工作原理 优先级和抢占 VRRP接口跟踪 VRRP概述 VRRP产生背景 通常同一网段内的所有主机都会配置相同的网关&#xff0c;以访问外部网络 当唯一的网关设备发生故障时&#xff0c;所有主…...

Dockerfile自定义制作镜像,其中10个指令的作用分析

docker容器中 做镜像是重要的技能。 docker commit只能制作比较简单的镜像&#xff0c; 要制作比较完善的镜像&#xff0c; 自定义程度比较高的&#xff0c; 就需要用到dockerfile dockerfile可以回溯历史 动态生成镜像。 FROM是基础镜像 CMD是在容器创建的时候默认的启动命令 …...

Linux6-vi/vim

1.vi与vim vi是Linux操作系统下的标准编辑器&#xff0c;类似Windows下的记事本 vim是vi的升级版&#xff0c;包括vi的所有功能&#xff0c;而且支持shell 2.vi/vim下的三种模式 vi/vim有三种模式&#xff1a;命令模式&#xff0c;插入模式和底行模式 命令模式&#xff1a…...

2012年408考研真题-数据结构

8.【2012统考真题】求整数n(n≥0)的阶乘的算法如下&#xff0c;其时间复杂度是(&#xff09;。 int fact(int n){ if(n<1) return 1; return n*fact (n-1); } A. O(log2n) B. O(n) C. O(nlog2n) D. O(n^2) 解析&#xff1a; 观察代码&#xff0c;我们不…...

【北京迅为】《STM32MP157开发板使用手册》- 第四十章 二值信号量实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…...

Docker UI强大之处?

DockerUI是一款由国内开发者打造的优秀Docker可视化管理工具。它拥有简洁直观的用户界面&#xff0c;使得Docker主机管理、集群管理和任务编排变得轻松简单。DockerUI不仅能展示资源利用率、系统信息和更新日志&#xff0c;还提供了镜像管理功能&#xff0c;帮助用户高效清理中…...

前端面试题——token安全问题处理与大数据列表展示

1.长时间保存token问题 长时间保存Token涉及多个方面的问题&#xff0c;包括安全性、性能、以及Token的管理策略等。以下是对长时间保存Token问题的详细分析&#xff1a; 一、安全性问题 Token泄露风险&#xff1a; Token是用户身份验证的凭证&#xff0c;如果长时间保存且未…...

Flask项目入门和视图

1、第一个项目的结构 以示例代码中的入口文件app.py为例子 &#xff08;1&#xff09;引入Flask以及创建Flask对象 from flask import Flask app Flask(__name__)&#xff08;2&#xff09; 路由route 视图函数 app.route(/index/) def hello_world():# 响应&#xff1a;…...

深入理解Lucene:开源全文搜索引擎

目录 引言 Lucene的核心概念 索引 分析器 存储 Lucene的工作流程 创建索引 搜索索引 Lucene核心技术 倒排索引 排序算法 索引压缩与合并 并发控制与实时更新 结论 引言 随着互联网的飞速发展&#xff0c;信息量呈指数级增长&#xff0c;如何有效地管理和检索这些…...

Qt中pro项目文件配置介绍

Qt中&#xff0c;工程文件是以.pro后缀的文件&#xff0c;主要用以包含Qt模块&#xff0c;代码文件&#xff0c;依赖库&#xff0c;以及对项目的一些属性进行配置。 具体看个例子&#xff1a; #这块是添加Qt模块 #.pro文件中使用#号作为注释 QT core gui #QT webengine…...

相亲交友中的用户画像构建方法探讨

随着互联网技术的发展&#xff0c;相亲交友平台成为现代人寻找伴侣的重要渠道之一。在这一过程中&#xff0c;如何精准地为用户推荐合适的对象成为了平台能否成功的关键。本文旨在探讨相亲交友平台中用户画像的构建方法&#xff0c;并分析其对于提高匹配度的重要性&#xff08;…...

总结

本来想把这个写完再写总结的&#xff0c;但是我发现卡了&#xff0c;明天去问问别人。 今天写上传个文件&#xff0c;没上传好&#xff0c;找到问题了&#xff0c;但是还不知道怎么改&#xff0c;我发给前端成功了&#xff0c;刚刚看了下好像是这里的问题&#xff0c;但是不是…...

C# 开发教程-入门基础

1.C# 简介、环境&#xff0c;程序结构 2.C# 基本语法&#xff0c;变量&#xff0c;控制局域&#xff0c;数据类型&#xff0c;类型转换 3.C# 数组、 循环&#xff0c;Linq 4.C# 类&#xff0c;封装&#xff0c;方法 5.C# 枚举、字符串 6.C# 面相对象&#xff0c;继承&#xff0…...

Windows上,使用远程桌面连接Ubuntu

要在 Ubuntu 上设置公网 IP 并通过 Windows 远程桌面连接到 Ubuntu&#xff0c;你需要完成以下步骤&#xff1a; 设置 Ubuntu 公网 IP&#xff1a; 确保你的 Ubuntu 服务器已经配置了一个公网 IP 地址。 你可以通过云服务提供商&#xff08;如 AWS、Azure、Google Cloud&#…...

SharePoint Online 计划 1 部署方案

概述 SharePoint Online 是 Microsoft 365 的一部分,为组织提供了一种高效、灵活的协作平台。SharePoint Online 计划 1(Plan 1)尤其适用于中小型企业,提供了基本的文档管理和协作功能。本文将详细介绍如何部署 SharePoint Online 计划 1,并探讨其配置、管理和最佳实践。…...

kubernetes存储之GlusterFS(GlusterFS for Kubernetes Storage)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...