OpenCV利用HSV颜色区间分离不同物体

2023-12-24 11:04

本文主要是介绍OpenCV利用HSV颜色区间分离不同物体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求

当前有个需求是从一个场景中将三个不同的颜色的二维码分离出来,如下图所示。
示例图像
这里有两个思路可以使用

  • 思路一是通过深度学习的方式,训练一个能够识别旋转边界框的模型,但是需要大量的数据进行模型训练,此处缺少训练数据,不太方便执行。
  • 思路二则是直接通过颜色进行分离,找到颜色的区间,通过去骗判断的方式分别分离出三个不同颜色对应的轮廓。

方案

首先,先要找到图像的HSV颜色对应表格,如下所示。
在这里插入图片描述
然后按照读取图像->转化为HSV通道图像->颜色分离的思路编写代码即可,详细的代码如下。

# -*- coding: utf-8 -*-
# @Time    : 2023/5/31 22:59
# @Author  : 肆十二
# @Email   : 3048534499@qq.com
# @File    : demo
# @Software: PyCharmimport numpy as np
import cv2
import os# 参考:https://blog.csdn.net/chenghaoy/article/details/86509950
def get_red(image_path):# 设定颜色HSV范围,假定为红色redLower_1 = np.array([0, 43, 46])redUpper_1 = np.array([10, 255, 255])redLower_2 = np.array([156, 43, 46])redUpper_2 = np.array([180, 255, 255])# 读取图像img = cv2.imread(image_path)# 将图像转化为HSV格式hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 去除颜色范围外的其余颜色mask_1 = cv2.inRange(hsv, redLower_1, redUpper_1)mask_2 = cv2.inRange(hsv, redLower_2, redUpper_2)mask = mask_1 + mask_2# mask = cv2.merge([mask_1, mask_2])# mask = cv2.# 二值化操作ret, binary = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY_INV)cv2.imwrite("results/red.jpg", binary)def get_yellow(image_path):# 设定颜色HSV范围,假定为红色redLower = np.array([26, 43, 46])redUpper = np.array([34, 255, 255])# 读取图像img = cv2.imread(image_path)# 将图像转化为HSV格式hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 去除颜色范围外的其余颜色mask = cv2.inRange(hsv, redLower, redUpper)# 二值化操作ret, binary = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY_INV)cv2.imwrite("results/yellow.jpg", binary)def get_green(image_path):# 设定颜色HSV范围,假定为红色redLower = np.array([35, 43, 46])redUpper = np.array([77, 255, 255])# 读取图像img = cv2.imread(image_path)# img = cv2.medianBlur(img, 5)# 将图像转化为HSV格式hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# hsv =# 去除颜色范围外的其余颜色mask = cv2.inRange(hsv, redLower, redUpper)# 二值化操作ret, binary = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY_INV)# img[img==0] =cv2.imwrite("results/green.jpg", binary)if __name__ == '__main__':image_path = "a.jpg"get_red(image_path)get_yellow(image_path)get_green(image_path)

OK在主函数中传入上图,之后在result文件夹下就能生成分离之后的结果,如下所示。

  • 绿色二维码分离结果
    在这里插入图片描述

  • 红色二维码分离结果
    在这里插入图片描述

  • 黄色二维码分离结果
    在这里插入图片描述

总结

很多时候,不需要过于依赖AI,通过传统的图像检测算法也能达到良好的效果,比如今天就通过HSV颜色通道的形式来进行分离,这在工业场景中是非常实用的。

这篇关于OpenCV利用HSV颜色区间分离不同物体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/531564

相关文章

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import