9.5HSV体系进行颜色分割

基本概念

inRange() 函数是 OpenCV 中用于图像处理的一个非常有用的函数,即从图像中提取出介于指定范围内的像素值。这个函数在图像处理中特别有用,比如颜色检测、背景去除等应用。它主要用于图像的阈值处理,但与其他阈值方法(如 threshold())不同的是,inRange() 可以设定一个范围来过滤像素值,非常适合用于色彩空间的分割,如从视频或图像中分离出特定颜色的物体。该函数经常与 HSV 色彩空间结合使用,因为 HSV 色彩空间对颜色变化的反应更加直观和自然。

函数原型

在 OpenCV 中,inRange() 函数的原型如下:

void cv::inRange(InputArray src, InputArray lowerb,InputArray upperb, OutputArray dst)参数介绍:
src: 输入图像,通常是一个多通道数组(图像)。
lowerb: 数组元素的下界,包含与 src 相同数量的通道。
upperb: 数组元素的上界,同样包含与 src 相同数量的通道。
dst: 输出图像,与 src 尺寸和类型相同。对于 src 中的每个像素,如果其值在 lowerb 和 upperb 之间(包括这两个边界),则 dst 中的相应像素设置为 255(白色),否则设置为 0(黑色)。

使用示例

假设你想从一幅图像中分离出绿色的物体。一种常用的方法是将图像从 BGR 色彩空间转换到 HSV 色彩空间,然后使用 inRange() 函数根据 HSV 值范围来分割绿色。

步骤

1.读取图像:使用 cv::imread() 读取图像。

2.转换色彩空间:使用 cv::cvtColor() 将图像从 BGR 转换到 HSV。

3.定义颜色范围:在 HSV 色彩空间中定义绿色的上下界。

4.应用 inRange():使用 inRange() 函数分割出绿色区域。

5.显示结果:显示原始图像和分割后的图像。

示例代码1


#include "pch.h"#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//int main() 
{// 读取图像  Mat img = imread("98.png");if (img.empty()) {std::cout << "Could not read the image." << std::endl;return 1;}// 转换到 HSV  Mat hsv;cvtColor(img, hsv, COLOR_BGR2HSV);// 定义绿色的 HSV 范围  // 注意:这些值可能需要根据实际图像进行调整  Scalar lower_green(25, 36, 25); // 较低的绿色  Scalar upper_green(255, 70, 255); // 较高的绿色  // 创建一个掩模  Mat mask;inRange(hsv, lower_green, upper_green, mask);// 使用掩模  Mat result;bitwise_and(img, img, result, mask);// 显示结果  namedWindow("Original Image", WINDOW_NORMAL);imshow("Original Image", img);namedWindow("Green Objects", WINDOW_NORMAL);imshow("Green Objects", result);waitKey(0);return 0;
}//注意:HSV 中的绿色范围(本例中的 lower_green 和 upper_green)可能需要根据你的特定应用场景进行调整。
//不同的光照条件和相机设置可能会影响图像中的 HSV 值。

运行结果1

红色分量

下面是一个使用 C++ 和 OpenCV 的 inRange() 函数的基本示例,以说明如何使用它来提取图像中的特定颜色:

1.导入必要的头文件:
#include <opencv2/opencv.hpp>
using namespace cv;2.加载图像:
Mat src = imread("path/to/your/image.jpg");
if (src.empty()) {std::cout << "Could not open or find the image" << std::endl;return -1;
}3.转换到HSV颜色空间:
在许多情况下,HSV 颜色模型比 RGB 更适合进行颜色分割,
因为颜色的属性(色调、饱和度、亮度)更清晰地分离了。
Mat hsv;
cvtColor(src, hsv, COLOR_BGR2HSV);4.定义阈值:
假设我们要选择特定的颜色范围,例如红色。我们需要定义两个向量来存储HSV颜色空间的下限和上限。
Scalar lower_red = {160, 100, 100}; // 这些值取决于你要选择的颜色
Scalar upper_red = {180, 255, 255};5.应用 inRange() 函数:
使用 inRange() 函数将图像像素与指定的阈值进行比较,并创建一个掩码,其中介于这两个阈值之间的像素值设置为白色(255),其余设置为黑色(0)。
Mat mask;
inRange(hsv, lower_red, upper_red, mask);6.显示结果:
显示原始图像和掩码图像以便对比查看效果。
namedWindow("Original Image", WINDOW_AUTOSIZE);
imshow("Original Image", src);namedWindow("Mask", WINDOW_AUTOSIZE);
imshow("Mask", mask);7.等待按键退出:
waitKey(0); // Wait for a keystroke in the window8.清理:
不要忘记释放所有使用的内存资源。
destroyAllWindows();以上步骤展示了如何使用 inRange() 函数来创建一个简单的颜色识别程序。
请注意,实际的颜色阈值可能需要根据具体的应用场景和光照条件进行调整。

完整代码2

#include "pch.h"//1.导入必要的头文件:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;//2.加载图像:int main()
{Mat src = imread("58.jpeg");if (src.empty()){std::cout << "Could not open or find the image" << std::endl;return -1;}//3.转换到HSV颜色空间://在许多情况下,HSV 颜色模型比 RGB 更适合进行颜色分割,//因为颜色的属性(色调、饱和度、亮度)更清晰地分离了。Mat hsv;cvtColor(src, hsv, COLOR_BGR2HSV);//4.定义阈值://假设我们要选择特定的颜色范围,例如红色。我们需要定义两个向量来存储HSV颜色空间的下限和上限。Scalar lower_red = { 160, 100, 100 }; // 这些值取决于你要选择的颜色Scalar upper_red = { 180, 255, 255 };//5.应用 inRange() 函数://使用 inRange() 函数将图像像素与指定的阈值进行比较,并创建一个掩码,其中介于这两个阈值之间的像素值设置为白色(255),其余设置为黑色(0)。Mat mask;inRange(hsv, lower_red, upper_red, mask);//6.显示结果://显示原始图像和掩码图像以便对比查看效果。namedWindow("Original Image", WINDOW_NORMAL);imshow("Original Image", src);namedWindow("Mask", WINDOW_NORMAL);imshow("Mask", mask);//7.等待按键退出:waitKey(0); // Wait for a keystroke in the window//8.清理://不要忘记释放所有使用的内存资源。destroyAllWindows();return 0;//以上步骤展示了如何使用 inRange() 函数来创建一个简单的颜色识别程序。//请注意,实际的颜色阈值可能需要根据具体的应用场景和光照条件进行调整。
}

运行结果2

实验代码3


#include "pch.h"
//#pragma comment(lib, "opencv_world450d.lib")   
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <opencv2/imgproc/types_c.h>
#include <iostream>
using namespace std;
using namespace cv;//输入图像
Mat img;
//灰度值归一化
Mat bgr;
//HSV图像
Mat hsv;
//色相
int hmin = 0;
int hmin_Max = 360;
int hmax = 180;
int hmax_Max = 180;
//饱和度
int smin = 0;
int smin_Max = 255;
int smax = 255;
int smax_Max = 255;
//亮度
int vmin = 106;
int vmin_Max = 255;
int vmax = 255;
int vmax_Max = 255;
//显示原图的窗口
string windowName = "src";
//输出图像的显示窗口
string dstName = "dst";
//输出图像
Mat dst;
//回调函数
void callBack(int, void*)
{//输出图像分配内存dst = Mat::zeros(img.size(), img.type());//掩码Mat mask;inRange(hsv, Scalar(hmin, smin, vmin), Scalar(hmax, smax, vmax), mask);//掩模到原图的转换for (int r = 0; r < bgr.rows; r++){for (int c = 0; c < bgr.cols; c++){if (mask.at<uchar>(r, c) == 255){dst.at<Vec3b>(r, c) = bgr.at<Vec3b>(r, c);}}}//输出图像imshow(dstName, dst);//保存图像//dst.convertTo(dst, CV_8UC3, 255.0, 0);imwrite("HSV_inRange.jpg", dst);
}
int main(int argc, char** argv)
{//输入图像img = imread("SBB.jpg");if (!img.data || img.channels() != 3)return -1;imshow(windowName, img);bgr = img.clone();//颜色空间转换cvtColor(bgr, hsv, CV_BGR2HSV);//cout << hsv << endl;//定义输出图像的显示窗口//namedWindow(dstName, WINDOW_GUI_EXPANDED);namedWindow(dstName, WINDOW_NORMAL);//调节色相 HcreateTrackbar("hmin", dstName, &hmin, hmin_Max, callBack);createTrackbar("hmax", dstName, &hmax, hmax_Max, callBack);//调节饱和度 ScreateTrackbar("smin", dstName, &smin, smin_Max, callBack);createTrackbar("smax", dstName, &smax, smax_Max, callBack);//调节亮度 VcreateTrackbar("vmin", dstName, &vmin, vmin_Max, callBack);createTrackbar("vmax", dstName, &vmax, vmax_Max, callBack);callBack(0, 0);waitKey(0);return 0;
}

运行结果3

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

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

相关文章

前端——浮动+定位样式

一、浮动float——浮动是会使盒子脱离文档流 添加了浮动的元素 1.原本的位置不占用 脱离文档流 2.设置了浮动 就不支持auto自适应居中 3.文字会感受到浮动 跟着进行文字环绕效果 而不是浮动元素覆盖文字 文字和浮动处于同一层的关系 4.可以使行内元素支持 高…

苍穹外卖——day3

1.公共字段自动填充 我们在添加功能的时候常常要重复执行一些重复的操作 如下图 我们在执行update或者insert数据库操作的时候&#xff0c;总是要给下面的一些属性赋值 这样如果代码功能一多&#xff0c;这会显得代码很冗长 所以我们引入了公共字段自动填充这个功能的实现…

从入门到精通:SQL 100个关键技术关键词

无论你是刚刚接触数据库管理的新手&#xff0c;还是希望提升技能水平的数据分析师&#xff0c;掌握SQL都是至关重要的一步。SQL是一种强大的工具&#xff0c;用于管理和操作关系型数据库。从简单的数据检索到复杂的事务处理&#xff0c;SQL提供了广泛的功能来满足各种需求。为了…

软件设计师:01计算机组成与结构

文章目录 一、校验码1.奇偶校验码2.海明码3.循环冗余检验码 二、原码反码补码移码三、浮点数表示法1.浮点数相加时 四、寻址方式五、CPU1.访问速度2.cpu的组成 六、RISC和CISC&#xff08;<font color red>只用记住不同就可以&#xff09;七、冗余技术1.结构冗余2.信息冗…

unix中的vfork函数

一、前言 本文介绍unix中的vfork函数&#xff0c;vfork函数功能和fork函数类似&#xff0c;也是用于创建新的进程&#xff0c;只不过调用vfork函数创建的子进程将共享父进程的进程空间&#xff0c;且只有当子进程调用exec()或者exit()函数后&#xff0c;父进程才会继续运行。 …

统信服务器操作系统【Cron定时任务服务】

Cron定时任务服务服务介绍、服务管理、服务配置 文章目录 一、功能概述二、功能介绍1. Cron 服务管理2.Cron 服务管理3.Cron 服务配置run-parts一、功能概述 cron是一个可以用来根据时间、日期、月份、星期的组合来 调度对周期性任务执行的守护进程。利用 cron 所提供的功能,可…

苹果电脑系统重磅更新——macOS Sequoia 15 系统 新功能一 览

有了 macoS Sequoia&#xff0c;你的工作效率将再次提升&#xff1a;快速调整桌面布局&#xff0c;一目了然地浏览网页重点&#xff0c;还可以通过无线镜像功能操控你的iPhone。 下面就来看看几项出色新功能&#xff0c;还有能够全面发挥这些功能的 App 和游戏。 macOS Sequo…

Vue 中 watch 的使用方法及注意事项

前言 Vue 的 Watch 是一个非常有用的功能&#xff0c;它能够监听 Vue 实例数据的变化并执行相应的操作。本篇文章将详细介绍 Vue Watch 的使用方法和注意事项&#xff0c;让你能够充分利用 Watch 来解决 Vue 开发中的各种问题。 1. Watch 是什么&#xff1f; 1.1 Watch 的作…

NVIDIA发布端到端自动驾驶框架Hydra-MDP

自动驾驶是目前人工智能领域的一个主要分支&#xff0c;目前特斯拉的FSD确实是为数不多的大模型框架。与其说特斯拉是一个造车公司&#xff0c;不如说是一个人工智能大数据公司。特斯拉每天靠行驶在道路上的汽车搜集的道路数据不胜其数&#xff0c;而拥有海量的数据是人工智能领…

数据结构——顺序表、链表

目录 前言 一&#xff0c;数据结构 1&#xff0c;什么是数据结构&#xff1f; 2&#xff0c;有什么类型&#xff1f; 二&#xff0c;顺序表 1&#xff0c;线性表 2&#xff0c;顺序表基本结构 3&#xff0c;动态顺序表的功能实现 三&#xff0c;链表 1&#xff0c;链…

乌克兰因安全风险首次禁用Telegram

据BleepingComputer消息&#xff0c;乌克兰国家网络安全协调中心 &#xff08;NCCC&#xff09; 以国家安全为由&#xff0c;已下令限制在政府机构、军事单位和关键基础设施内使用 Telegram 消息应用程序。 这一消息通过NCCC的官方 Facebook 账号对外发布&#xff0c;在公告中乌…

2024icpc(Ⅱ)网络赛补题 L

L、502 Bad Gateway 题意&#xff1a; 给定一个 T T T&#xff0c;每一步可以做以下两个操作&#xff1a; 1、减1 2、随机重置为 [ 1 , T ] [1,T] [1,T]中的某个整数 求在最优策略下&#xff0c;得到 0 0 0的期望步数 思路&#xff1a; 最优策略为选择一个阈值 S S S&…

01.系统IO

文章的函数说明只是简单的说明&#xff0c;具体还得查看man手册 Linux文件说明 linux下一切皆是文件。 Linux 下的文件类型&#xff1a; 1&#xff0c;普通文件&#xff08;regular&#xff09;&#xff1a;存在于外部存储器中&#xff0c;用于存储普通数据。 2&#xff0…

深入理解音视频pts,dts,time_base以及时间数学公式

引入 首先介绍一下基础名词 DTS&#xff08;Decoding Time Stamp&#xff09;&#xff1a;即解码时间戳&#xff0c;这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。当数据没b帧时&#xff0c;dts pts&#xff0c;有兴趣可参阅我前面视频知识类文章。 PTS&a…

统信服务器操作系统【开机自启动】配置方法

开机自启动的四种配置方法,包括systemctl命令、rc.local文件、crontab任务,通过desktop配置开机自动,前三种方法适合后台程序或者脚本启动,最后一种方法适合图形化程序启动。 文章目录 准备环境配置方法一、通过编写service的方法,使用systemctl配置开机自启二、通过rc.lo…

展锐平台的手机camera 系统isptool 架构

展锐平台的isptool 主要用于支持展锐各代芯片isp的各效果模块快速tuning和参数生成打包。 具体需要&#xff1a; 一、工具段能在线实时预览到调试sensor经过isp 处理后的图像&#xff0c;也就是各模块的参数在当下实时生效&#xff0c;通过工具能在PC 上在线观看到修改的效果。…

【企业微信】群机器人自动消息配置

0、群聊机器人 内部企微群聊可以添加一个机器人&#xff0c;这个机器人其实是个消息接口&#xff0c;可以外部脚本来自动定时发送消息到群里&#xff0c;打工人最有用的提醒就是每周提醒发周报了。 1、创建机器人 一般公司都没有人使用&#xff0c;我们可以手动创建一个。 …

小程序开发设计-小程序的宿主环境:宿主环境简介⑥

上一篇文章导航&#xff1a; 小程序开发设计-小程序代码的构成&#xff1a;小程序页面的组成部分详解⑤-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142306902?spm1001.2014.3001.5501 注&#xff1a;不同版本选项有所不同&#xff0c;并无大碍。 目录 上…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【用户态内存调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 Debug版本的musl-libc库为用户提供内存泄漏检测、堆内存…

2024在线翻译工具横评:准确率、速度与易用性大比拼

在日常的学习与生活中&#xff0c;翻译工具无疑成为了我们迅速获取国际新闻与知识的得力助手。起初&#xff0c;我倾向于依赖有道在线翻译这一平台来解决我的语言障碍问题。然而&#xff0c;随着对翻译质量要求的提升和多元化比较的需求增加&#xff0c;我进一步探索并发现了数…