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

2023-12-24 10:15

本文主要是介绍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/531449

相关文章

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

ShardingSphere之读写分离方式

《ShardingSphere之读写分离方式》:本文主要介绍ShardingSphere之读写分离方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录ShardingSphere-读写分离读写分离mysql主从集群创建 user 表主节点执行见表语句项目代码读写分