当前位置: 首页 > 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;只有拥有正…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里

写一个shell脚本&#xff0c;把局域网内&#xff0c;把能ping通的IP和不能ping通的IP分类&#xff0c;并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...