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

使用 OpenCV 和 NumPy 进行图像处理:HSV 范围筛选实现PS抠图效果

使用 OpenCV 和 NumPy 进行图像处理:HSV 范围筛选实现PS抠图效果

在计算机视觉和图像处理领域,OpenCV 是一个非常强大的库,能够帮助我们执行各种图像操作。在这篇博客中,我们将通过一个简单的示例演示如何使用 OpenCV 和 NumPy 来进行 HSV(色相、饱和度、明度)范围筛选,以提取图像中的特定颜色区域。

1. 创建虚拟环境

新建文件夹, 并在文件夹中创建虚拟环境,可以使用Vscode打开文件夹, 然后在终端中输入以下命令:

python -m venv venv

2. 激活虚拟环境

在终端中输入以下命令:

venv\Scripts\activate

3. 安装依赖

在终端中输入以下命令:

pip install opencv-python

4. 代码实现

首先,我们需要导入所需的库:

import cv2
import numpy as np

接下来,我们定义一个函数 inrange_demo,该函数接收一幅图像作为参数,并执行以下步骤:

1. 将图像从 BGR 转换为 HSV

OpenCV 默认使用 BGR(蓝、绿、红)颜色空间,因此我们首先需要将图像转换为 HSV 颜色空间,以便更容易地进行颜色范围筛选。

hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow("hsv", hsv)
cv2.waitKey(0)

2. 创建 HSV 范围的掩膜

我们使用 cv2.inRange 函数来创建一个掩膜,该掩膜只保留在指定 HSV 范围内的像素。这里的范围是 (35, 43, 46)(77, 255, 255),这通常对应于绿色的颜色范围。

mask = cv2.inRange(hsv, (35, 43, 46), (77, 255, 255))
cv2.imshow("mask", mask)
cv2.waitKey(0)

3. 创建黑色背景

我们创建一个与原始图像相同大小的黑色背景,以便后续操作。

redback = np.zeros(image.shape, image.dtype)

4. 反转掩膜

通过 cv2.bitwise_not 函数,我们可以反转掩膜,以便选择不在指定颜色范围内的区域。

mask_inv = cv2.bitwise_not(mask)
cv2.imshow("inverted mask", mask_inv)
cv2.waitKey(0)

5. 确保掩膜是三通道

为了将掩膜应用于原始图像,我们需要将反转后的掩膜扩展到三通道。

mask_inv_3d = mask_inv[:, :, np.newaxis]

6. 应用掩膜并显示结果

最后,我们使用 np.where 函数将原始图像与黑色背景结合,显示出感兴趣区域。

redback[:] = np.where(mask_inv_3d == 255, image, redback)
cv2.imshow("roi区域", redback)

示例用法

在函数定义之后,我们可以通过以下代码读取一幅图像并调用 inrange_demo 函数:

image = cv2.imread("D:\\images\\1.png")
inrange_demo(image)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像素材

在这里插入图片描述

实现效果

在运行代码后,你将看到以下图像:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结

以上代码演示了如何使用 OpenCV 和 NumPy 进行基本的图像处理,特别是 HSV 范围筛选。通过这种方法,我们可以提取图像中感兴趣的颜色区域,并在黑色背景上显示它们。这种技术在物体检测和识别、图像分割等应用中非常有用。

扩展

使用白色背景显示图像特定区域

import cv2
import numpy as npdef inrange_demo(image):# Convert the image from BGR to HSVhsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)cv2.imshow("hsv", hsv)cv2.waitKey(0)# Create a mask for the specified HSV rangemask = cv2.inRange(hsv, (35, 43, 46), (77, 255, 255))cv2.imshow("mask", mask)cv2.waitKey(0)# Create a white backgroundredback = np.zeros(image.shape, dtype=image.dtype)whiteback=redback+255# Invert the maskmask_inv = cv2.bitwise_not(mask)# Show the inverted maskcv2.imshow("inverted mask", mask_inv)cv2.waitKey(0)# Ensure mask_inv is 3-channel by expanding its dimensionsmask_inv_3d = mask_inv[:, :, np.newaxis]# Copy the original image to the background where the mask is appliedwhiteback[:] = np.where(mask_inv_3d == 255, image, whiteback)# Show the region of interestcv2.imshow("roi区域", whiteback)# Example usage:
image = cv2.imread("D:\\images\\1.png")
inrange_demo(image)
cv2.waitKey(0)
cv2.destroyAllWindows()

实现效果

在这里插入图片描述

这里特别提供一下HSV颜色取值范围,建议收藏一下:

HSV 颜色取值范围

在这里插入图片描述

希望这篇博客对你理解图像处理有所帮助!

相关文章:

使用 OpenCV 和 NumPy 进行图像处理:HSV 范围筛选实现PS抠图效果

使用 OpenCV 和 NumPy 进行图像处理:HSV 范围筛选实现PS抠图效果 在计算机视觉和图像处理领域,OpenCV 是一个非常强大的库,能够帮助我们执行各种图像操作。在这篇博客中,我们将通过一个简单的示例演示如何使用 OpenCV 和 NumPy 来…...

IIS中间件

中间件 中间件是一类软件,为应用程序、服务和组件提供一个通用的服务层。 主要功能 通信:提供通信框架,帮助不同系统与应用之间进行数据交换和通信 事务管理、资源管理 安全服务:提供认证、授权、加密等安全策略 数据访问&a…...

BMP280气压传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.传感器数据获取流程 三、程序设计 main.c文件 bmp280.h文件 bmp280.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 BMP280是一款基于博世公司APSM工艺的小封装低功耗数字复合传感器,它可以测…...

DWPD指标:为何不再适用于大容量SSD?

固态硬盘(Solid State Drives, SSD)作为计算机行业中最具革命性的技术之一,凭借其更快的读写速度、增强的耐用性和能效,已经成为大多数用户的首选存储方案。然而,如同任何其他技术一样,SSD也面临自身的挑战…...

路由器的固定ip地址是啥意思?固定ip地址有什么好处

‌在当今数字化时代,‌路由器作为连接互联网的重要设备,‌扮演着举足轻重的角色。‌其中,‌路由器的固定IP地址是一个常被提及但可能让人困惑的概念。‌下面跟着虎观代理小二一起将深入探讨路由器的固定IP地址的含义,‌揭示其背后…...

Java——踩坑Arrays.asList()

坑1:不能直接使用 Arrsys.asList() 来转换基本类型数据 public static void test1(){// 1、不能直接使用asList来转换基本类型数组int[] arr {1, 2, 3};List list Arrays.asList(arr);System.out.printf("list:%s size:%s class:%s", list, list.size(…...

前缀列表(ip-prefix)配置

一. 实验简介 本来前缀列表是要和访问控制列表放在一起讲的,但是这里单拎出来是为了更详细的讲解两者的区别 1.前缀列表针对IP比访问控制更加灵活。 2.前缀列表在后面被引用时是无法对数据包进行过滤的 实验拓扑 二. 实验目的 R4路由器中只引入子网LoopBack的…...

每日OJ_牛客_电话号码(简单哈希模拟)

目录 牛客_电话号码&#xff08;简单哈希模拟&#xff09; 解析代码 牛客_电话号码&#xff08;简单哈希模拟&#xff09; 电话号码__牛客网 解析代码 #include <iostream> #include <unordered_map> #include <set> #include <string> using name…...

鸿蒙轻内核M核源码分析系列十二 事件Event

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 轻内核M核源码分析系列一 数据结构-双向循环链表 轻内核M核源码分析系列二 数据结构-任务就绪队列 鸿蒙轻内核M核源码分析系列三 数据结构-任务排序链表 轻…...

基于 RocketMQ 的云原生 MQTT 消息引擎设计

作者&#xff1a;沁君 概述 随着智能家居、工业互联网和车联网的迅猛发展&#xff0c;面向 IoT&#xff08;物联网&#xff09;设备类的消息通讯需求正在经历前所未有的增长。在这样的背景下&#xff0c;高效和可靠的消息传输标准成为了枢纽。MQTT 协议作为新一代物联网场景中…...

AWVS/Acunetix Premium V24.8

前言 Acunetix Premium 是一款网络安全 漏洞扫描 工具&#xff0c;主要用于自动化网站漏洞扫描和管理。它的特点包括深度扫描和发现各种类型的漏洞&#xff08;如 SQL 注入和跨站脚本&#xff09;&#xff0c;支持多种技术和平台&#xff0c;提供详尽的报告和修复建议&#xf…...

[数据集][目标检测]灭火器检测数据集VOC+YOLO格式3255张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3255 标注数量(xml文件个数)&#xff1a;3255 标注数量(txt文件个数)&#xff1a;3255 标注…...

【技术警报】Redis故障启示录:当主节点宕机,如何避免数据“雪崩”?

在高并发的互联网世界中&#xff0c;Redis作为一个高性能的键值存储系统&#xff0c;常被用于缓存、消息队列等场景&#xff0c;为应用提速增效。然而&#xff0c;技术的光芒背后也隐藏着潜在的危机——今天&#xff0c;我们就来探讨一个真实发生的案例&#xff1a;Redis主节点…...

【基础】Three.js加载纹理贴图、加载外部gltf格式文件

1. 模型使用纹理贴图 const geometry new THREE.BoxGeometry(10, 10, 10);const textureLoader new THREE.TextureLoader(); // 创建纹理贴图加载器const texture textureLoader.load("/crate.gif"); // 加载纹理贴图const material new THREE.MeshLambertMater…...

【区块链 + 人才服务】FISCO BCOS 区块链实训和管理平台 | FISCO BCOS应用案例

中博数科 FISCO BCOS 区块链实训和管理平台主要应用于区块链领域的教育和实训&#xff0c;目的是为学生、教师等用户 提供高效的区块链技术学习和实践体验&#xff0c;同时也为学校提供了一套完整的区块链解决方案。 该平台提供了一套完整的区块链课程体系&#xff0c;包括理论…...

联众优车持续加大汽车金融服务投入与创新,赋能汽车消费新生态

近年来&#xff0c;中国汽车消费市场呈现出蓬勃发展的态势&#xff0c;而汽车金融服务作为降低购车门槛、优化购车体验的重要手段&#xff0c;正日益受到市场的青睐。《2023中国汽车消费趋势调查报告》显示&#xff0c;相较于前一年&#xff0c;今年选择汽车金融服务的市场消费…...

基于yolov8的西红柿检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的西红柿检测系统是一种利用深度学习技术的创新应用&#xff0c;旨在通过自动化和智能化手段提高西红柿成熟度检测的准确性和效率。该系统采用YOLOv8算法&#xff0c;该算法是深度学习领域中的先进目标检测模型&#xff0c;具备实时检测和多目标识别的…...

PHP轻量级高性能HTTP服务框架 - webman

摘要 webman 是一款基于 workerman 开发的高性能 HTTP 服务框架。webman 用于替代传统的 php-fpm 架构&#xff0c;提供超高性能可扩展的 HTTP 服务。你可以用 webman 开发网站&#xff0c;也可以开发 HTTP 接口或者微服务。 除此之外&#xff0c;webman 还支持自定义进程&am…...

Python实现人工鱼群算法

博客目录 引言 什么是人工鱼群算法&#xff08;AFSA&#xff09;&#xff1f;人工鱼群算法的应用场景为什么使用人工鱼群算法&#xff1f; 人工鱼群算法的原理 人工鱼群算法的基本概念人工鱼的三种行为模式人工鱼群算法的流程人工鱼群算法的特点与优势 人工鱼群算法的实现步骤…...

【网络安全】密码学概述

1. 密码学概述 1.1 定义与目的 密码学是一门研究信息加密和解密技术的科学&#xff0c;其核心目的是确保信息在传输和存储过程中的安全性。密码学通过加密算法将原始信息&#xff08;明文&#xff09;转换成难以解读的形式&#xff08;密文&#xff09;&#xff0c;只有拥有正…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...