opencv-python实战项目八:根据颜色抠出图片中感兴趣区域

news2024/11/14 3:14:41

文章目录

  • 一,简介
  • 二,实现方案
  • 三、算法实现步骤
    • 3.2 处理颜色蒙版:
    • 3.3 取出图片中蒙版对应区域
  • 四,整体代码
  • 五,效果:


一,简介

本项目旨在开发一个基于OpenCV的图像处理工具,实现根据颜色从图片中自动抠图的功能。通过该项目,用户可以轻松指定一种颜色,系统将自动识别并提取该颜色的所有像素,生成新的图像。

二,实现方案

本方案基于OpenCV的图像处理,通过指定颜色范围,从输入图像中自动识别并提取该颜色的所有像素,生成新的图像。首先,通过颜色空间转换和掩码生成,实现颜色识别;然后,通过形态学操作修正掩码;最后抠出图像中对应掩码的区域。

三、算法实现步骤

3.1 cv2.inRange()选择抠出的颜色
在这里插入图片描述将图像转化为hsv颜色空间,按照上表中的数值进行颜色选择,本次选择的颜色为红色,使用的函数为cv2.inRange(),
cv2.inRange 是 OpenCV 中的一个函数,用于生成一个掩码,该掩码包含在指定范围内的所有像素。

函数介绍:
src: 输入的图像,可以是灰度图或彩色图。
lowerb: 表示颜色范围的最低边界。它是一个数组,包含三个值:蓝色通道的下限、绿色通道的下限和红色通道的下限。
upperb: 表示颜色范围的最高边界。它也是一个数组,包含三个值:蓝色通道的上限、绿色通道的上限和红色通道的上限。
cv2.inRange 函数返回一个与 src 图像大小相同的掩码图像。在这个掩码图像中,像素值在 lowerb 和 upperb 范围内的像素会被设置为255(白色),表示这些像素属于指定的颜色范围;而其他像素则被设置为0(黑色),表示这些像素不属于指定的颜色范围。

使用方法:

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 生成检测红色区域的掩码
lower_red = np.array([0, 43, 46])
upper_red = np.array([10, 255, 255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)
lower_red = np.array([156, 43, 46])
upper_red = np.array([180, 255, 255])
mask2 = cv2.inRange(hsv, lower_red, upper_red)
mask1 = mask1 + mask2

3.2 处理颜色蒙版:

在图像处理中,为了提高颜色识别的准确性和鲁棒性,我们通常会采用以下步骤:

  1. 执行形态学开运算:通过先腐蚀再膨胀的方式,去除掩码中的小噪声点和细小的白色区域。
  2. 执行膨胀操作:增加掩码中白色区域的面积,填充前景对象中的小孔或间隙。
  3. 执行取反操作:将掩码中的白色区域变为黑色,黑色区域变为白色,有助于将背景区域与前景区域区分开来。
    通过这些步骤,原始的颜色识别掩码被细化和改善,使得后续的图像处理步骤更加准确和有效。

实现方法:

mask1 = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, np.ones((3, 3), np.uint8), iterations=2)
mask1 = cv2.dilate(mask1, np.ones((3, 3), np.uint8), iterations=1)
mask2 = cv2.bitwise_not(mask1)

3.3 取出图片中蒙版对应区域

代码:

res1 = cv2.bitwise_and(img, img, mask=mask1)
res2 = cv2.bitwise_and(img, img, mask=mask2)

四,整体代码

import cv2
import numpy as np

# 指定图像路径
image_path = r"F:\OIP-C.jfif"

# 加载图像
img = cv2.imread(image_path)

# 检查图像是否加载成功
if img is None:
    print("Error: Image cannot be loaded. Please check the path.")
    exit()

# 将颜色空间从BGR转换为HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 生成检测红色区域的掩码
lower_red = np.array([0, 43, 46])
upper_red = np.array([10, 255, 255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)

lower_red = np.array([156, 43, 46])
upper_red = np.array([180, 255, 255])
mask2 = cv2.inRange(hsv, lower_red, upper_red)

mask1 = mask1 + mask2
# 细化检测到的红色区域对应的掩码
mask1 = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, np.ones((3, 3), np.uint8), iterations=2)
mask1 = cv2.dilate(mask1, np.ones((3, 3), np.uint8), iterations=1)
mask2 = cv2.bitwise_not(mask1)

# 生成最终输出
res1 = cv2.bitwise_and(img, img, mask=mask1)
res2 = cv2.bitwise_and(img, img, mask=mask2)
# 显示融合后的图像
cv2.imshow('roi', res1)
cv2.imshow('background', res2)

# 等待按键
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()

五,效果:

原图:
在这里插入图片描述
前景和背景:
在这里插入图片描述

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

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

相关文章

商贸城小程序系统开发制作方案

商贸城作为集批发、零售、展示、交流于一体的综合性商业体。通过商贸城小程序系统促进商家与消费者之间的互动,实现线上线下流量的无缝对接。一、用户需求分析 1、顾客需求: 快速查找店铺信息; 在线浏览商品和服务; 实现线上预约、…

【网站项目】SpringBoot675学生心理压力咨询评判

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Vue启动时报异常 ‘error:03000086:digital envelope routines::initialization error‘

问题描述 启动Vue项目时,突发报如下异常: opensslErrorStack: [error:03000086:digital envelope routines::initialization error,error:0308010C:digital envelope routines::unsupported],library: digital envelope routines,reason: unsupported,…

CentOS7下载与安装 即配置网卡

CentOS 7是什么? CentOS7是基于RHEL的企业级Linux操作系统,引入了Systemd、XFS文件系统和Docker支持。它提供了新的软件包、工具和性能调优选项,同时加强了系统安全和稳定性。总的来说,CentOS7是一个稳定、安全、长期支持的操作系统&#xf…

【wiki知识库】09.欢迎页面展示(浏览量统计)SpringBoot部分

🍊 编程有易不绕弯,成长之路不孤单! 大家好,我是熊哈哈,这个项目从我接手到现在有了两个多月的时间了吧,其实本来我在七月初就做完的吧,但是六月份的时候生病了,在家里休息了一个月的…

【和可被 K 整除的子数组】python刷题记录

R4-前缀和专题 class Solution:def subarraysDivByK(self, nums: List[int], k: int) -> int:ret0# 存储当前位置的上一个位置的前缀和的余数加上当前位置的值对K的余数pre_mod0dictdefaultdict(int)dict[0]1for i in range(len(nums)):pre_mod(pre_modnums[i])%k# 如果能在…

Kubernetes 基础概念介绍

1. 应用部署方式 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影…

投票小程序App功能开发源码技术实现

随着移动互联网的快速发展,小程序作为一种轻量级应用,因其无需安装、即用即走的特点,在各类应用场景中迅速普及。投票小程序作为其中的一种,因其便捷性和实用性,广泛应用于各类活动、问卷调查及意见收集中。本文将围绕…

Linux-Shell入门-05

1.Shell的概念 1.1 什么是shell Shell脚本语言是实现Linux/UNIX系统管理及自W动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符…

上海“创投十九条”明确政府引导基金带动作用,银行如何挖掘投贷联动增长潜力?

发展创业投资是促进科技、产业、金融良性循环的重要举措。为促进创业投资高质量发展,近几个月来,“国创投十七条”“上海创投十九条”等政策陆续发布,明确指出发挥政府引导基金带动作用,进一步加大对战略性新兴产业和未来产业的支…

空指针异常(NullPointerException)以及解决方案

之前我们提到过,在学习数组这一篇章时,有两种运行时异常,可能会反复的出现,首先第一个就是我们之前所讲述的,数组下标越界异常(ArrayIndexOutOfBoundsException),如需查看详情,可跳转…

tekton通过ceph挂载node_modules的时候报错failed to execute command: copying dir: symlink

分析: 如果ceph的mountPath和workingDir路径一致的话,就会报错。 解决:node_modules挂载到/workspace下,workingDir的代码mv到/workspace下进行构建。

Spring Boot和OCR构建车牌识别系统

​ 博客主页: 南来_北往 系列专栏:Spring Boot实战 OCR介绍 OCR(Optical Character Recognition)是光学字符识别技术的缩写,它能够将图像中的文本转换为机器可读和编辑的数字文本格式。这种技术广泛应用于数据输入、文档管理…

⼆叉树选择题

⼆叉树选择题 本篇文章是初阶二叉树的收尾,旨在进一步加深对于二叉树性质的理解,祝你有一个愉快的学习之旅! 💡 ⼆叉树性质 1)对任何⼀棵⼆叉树, 如果度为 0 其叶结点个数为 n0 , 度为 2 的分⽀结点个数为 n2 ,则有…

Unity | AmplifyShaderEditor插件基础(第二集:模版说明)

目录 一、前言 二、核心模版和URP模版 1.区别介绍 2.自己的模版 三、输出节点 1.界面 2.打开OutPut 3.ShderType 4.ShaderName 5.Shader大块内容 6.修改内容 四、预告 一、前言 内容全部基于以下链接基础以上讲的。 Unity | Shader基础知识(什么是shader…

JSON与EXL文件互转

功能:实现json到excel文件的相互转换(支持json多选版) 目的:编码与语言对应,方便大家使用 页面设计: 介绍: 1.选择文件栏目选择想要转换的文件 2.生成路径是转换后文件所在目录 3.小方框勾选与不勾选分别代表exl到…

Apache Doris 中Compaction问题分析和典型案例

说明 此文档主要说明一些常见compaction问题的排查思路和临时处理手段。这些问题包括 Compaction socre高Compaction失败compaction占用资源多Compaction core 如果问题紧急,可联系社区同学处理 如果阅读中有问题,可以反馈给社区同学。 1 compaction …

VulnHub:BlueMoon

准备工作 靶机下载地址,下载完成后使用virtualbox打开虚拟机,网络设置修改为桥接。 信息收集 主机发现 攻击机ip:192.168.31.218,nmap扫描攻击机同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 目标靶机ip为:192…

Docker最佳实践进阶(一):Dockerfile介绍使用

大家好,上一个系列我们使用docker安装了一系列的基础服务,但在实际开发过程中这样一个个的安装以及繁杂命令不仅仅浪费时间,更是容易遗忘,下面我们进行Docker的进阶教程,帮助我们更快速的部署和演示项目。 一、什么是…

免费抠图项目

零元部署一个产品落地页 最近花了点时间,为我之前写的AI抠图项目,写了个产品落地页,效果如下。 项目使用tailwindcss和vue3实现,支持主题切换、中英文切换等功能。 更多功能可以点击Matting Website查看。 部署这个页面几乎是0元…