首页 > 其他分享 >基于HSV空间的彩色图像分割技术

基于HSV空间的彩色图像分割技术

时间:2023-10-04 21:36:28浏览次数:39  
标签:bags 分割 彩色图像 mask colorbar HSV ax hsv

1. 引言

每当我们看到图像时,它通常都是由各种元素和目标组成的。在某些情况下,我们可能会想要从图像中提取某个特定的对象,大家会怎么做?首先我们会想到的是进行crop相关的操作,这在某种程度上是可行的,但是这通常也会有一些不相关的像素会被包括在内,我确信大多情况下我们不希望这样。事实上,我们可以使用图像处理技术来获得感兴趣的物体。

闲话少说,我们直接使用Python来进行图像分割。

2. 图像分割概念

图像分割是指将图像划分为其组成部分或子对象的过程。常见的技术包括边缘检测、阈值处理、基于区域的分割等。在本文中,让我们专注于通过HSV颜色空间使用彩色图像分割来分割我们的图像。

在此之前,我们需要安装以下库,然后再进行相关的操作。

from skimage.io import imread, imshow
from skimage.color import rgb2hsv
from matplotlib.pyplot as plt

同时我们使用的测试图像如下:

基于HSV空间的彩色图像分割技术_图像分割

3. HSV颜色空间

我们的目标是通过HSV颜色空间来分割每个bag袋子。但是要怎么做呢?一般来说,HSV代表色调、饱和度和亮度,我们稍后将在分割图像时使用来自HSV颜色空间的信息。

但在分割过程之前,让我们首先通过以下代码将RGB图像转换为HSV的形式:

bags_hsv = rgb2hsv(bags)
fig, ax = plt.subplots(1, 3, figsize=(12,4))
ax[0].imshow(bags_hsv[:,:,0], cmap='gray')
ax[0].set_title('Hue')
ax[1].imshow(bags_hsv[:,:,1], cmap='gray')
ax[1].set_title('Saturation')
ax[2].imshow(bags_hsv[:,:,2], cmap='gray')
ax[2].set_title('Value');

结果如下:

基于HSV空间的彩色图像分割技术_图像分割_02

然而,上述灰度图对我们目前还没有太多的帮助。我们需要获得每个HSV通道的强度值,以帮助指导我们稍后进行分割。为此,通过实现以下代码创建了一个彩色条:

fig, ax = plt.subplots(1, 3, figsize=(15, 5))
ax[0].imshow(bags_hsv[:,:,0],cmap='hsv')
ax[0].set_title('hue')
ax[1].imshow(bags_hsv[:,:,1],cmap='hsv')
ax[1].set_title('transparency')
ax[2].imshow(bags_hsv[:,:,2],cmap='hsv')
ax[2].set_title('value')
fig.colorbar(imshow(bags_hsv[:,:,0],cmap='hsv')) 
fig.tight_layout()

结果如下:

基于HSV空间的彩色图像分割技术_颜色空间_03

4. 挑选阈值

哇!看到右边的彩色条了吗?我们将在分割bag时参考这一点。在实现代码之前,让我们首先设置掩码的阈值:

  • 下蒙版(参考色调通道)
  • 上蒙版(参考色调通道)
  • 饱和度遮罩(指透明度通道)

在选择阈值时,请注意查看彩色条。例如,如果我们正在分割蓝色袋子。合适的下掩模值和上掩模值将分别为0.6和0.7。因此,换句话说,它只会得到蓝色像素值,而忽略其余的值。

5. 分割蓝色目标

基于上述分析,我们来使用以下代码对蓝色bag袋进行分割,代码如下:

#refer to hue channel (in the colorbar)
lower_mask = bags_hsv[:,:,0] > 0.6 
#refer to hue channel (in the colorbar)
upper_mask = bags_hsv[:,:,0] < 0.7 
#refer to transparency channel (in the colorbar)
saturation_mask = bags_hsv[:,:,1] > 0.3 
 
mask = upper_mask*lower_mask*saturation_mask
red = bags[:,:,0]*mask
green = bags[:,:,1]*mask
blue = bags[:,:,2]*mask
bags_masked = np.dstack((red,green,blue))
imshow(bags_masked)

结果如下:

基于HSV空间的彩色图像分割技术_颜色空间_04

哇,是不是看上去很完美!

6. 分割黄色目标

有了上述经验,我们接着来分割黄色目标,只需要修改对应的掩码即可,代码如下:

#refer to hue channel (in the colorbar)
lower_mask = bags_hsv[:,:,0] > 0.1
#refer to hue channel (in the colorbar)
upper_mask = bags_hsv[:,:,0] < 0.2
#refer to transparency channel (in the colorbar)
saturation_mask = bags_hsv[:,:,1] > 0.6 
 
mask = upper_mask*lower_mask*saturation_mask
red = bags[:,:,0]*mask
green = bags[:,:,1]*mask
blue = bags[:,:,2]*mask
bags_masked = np.dstack((red,green,blue))
imshow(bags_masked)

结果如下:

基于HSV空间的彩色图像分割技术_图像处理_05

7. 分割橙色目标

更进一步,我们修改阈值来分割橙色目标,代码如下:

#refer to hue channel (in the colorbar)
lower_mask = bags_hsv[:,:,0] > 0.0
#refer to hue channel (in the colorbar)
upper_mask = bags_hsv[:,:,0] < 0.09
#refer to transparency channel (in the colorbar)
saturation_mask = bags_hsv[:,:,1] > 0.4 
 
mask = upper_mask*lower_mask*saturation_mask
red = bags[:,:,0]*mask
green = bags[:,:,1]*mask
blue = bags[:,:,2]*mask
bags_masked = np.dstack((red,green,blue))
imshow(bags_masked)

结果如下:

基于HSV空间的彩色图像分割技术_颜色空间_06

8. 分割绿色目标

最后,我们修改阈值来分割剩下的绿色目标,代码如下:

#refer to hue channel (in the colorbar)
lower_mask = bags_hsv[:,:,0] > 0.0
#refer to hue channel (in the colorbar)
upper_mask = bags_hsv[:,:,0] < 0.09
#refer to transparency channel (in the colorbar)
saturation_mask = bags_hsv[:,:,1] > 0.4 
 
mask = upper_mask*lower_mask*saturation_mask
red = bags[:,:,0]*mask
green = bags[:,:,1]*mask
blue = bags[:,:,2]*mask
bags_masked = np.dstack((red,green,blue))
imshow(bags_masked)

结果如下:

基于HSV空间的彩色图像分割技术_图像分割_07

9. 结论

本文通过介绍HSV颜色空间在图像分割领域的用途,并通过一个具体的示例来对其进行讲解,主要通过分析HSV相应的通道上不同的阈值来对设置不同的掩码,进而对不同的对象进行分割,并给出了相应的代码实现。

您学废了嘛?

标签:bags,分割,彩色图像,mask,colorbar,HSV,ax,hsv
From: https://blog.51cto.com/u_15506603/7706553

相关文章

  • C# OpenVino Yolov8 Seg 分割
    效果 项目代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingOpenCvSharp;namespaceOpenVino_Yolov8_Demo{publi......
  • openvino道路分割
    我这里仅显示道路和车道线1mask=np.zeros((hh,ww,3),dtype=np.uint8)2mask[np.where(res>0)]=(0,255,0)#路面3mask[np.where(res>1)]=(255,0,0)#车道线 模型的下载还是老方法AccuracyThequalitymetricscalculatedon500imagesfrom"Might......
  • json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及by
    json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及bytes指定长度分割。importsysimportzlibimportjsonimportmathKAFKA_MAX_SIZE=1024*1024CONTENT_MIN_MAX_SIZE=KAFKA_MAX_SIZE*0.9defsplit_data(data):""":param......
  • 如何使用python进行pdf文件分割
    1.安装PyPDF2包pipinstallPyPDF2然后importPyPDF22.在PyPDF2库中,可以使用以下代码打开PDF文件:pdf_file=open('filename.pdf','rb')pdf_reader=PyPDF2.PdfFileReader(pdf_file)total_pages=pdf_reader.numPages3.下面代码将每一页分开fromPyPDF2impo......
  • Shell中如何分割字符串
    使用字符替换来分割字符串tr或者类似实现字符串替换的工具,如sed。echo"go:python:rust:js"|tr":""\n"#使用tr将分隔符:替换成换行符\n使用tr将分隔符:替换成换行符\n。使用cut分割字符串echo"go:python:rust:js"|cut-d":"-f1echo"go:pyth......
  • 基于Unet+opencv实现天空对象的分割、替换和美化
      传统图像处理算法进行“天空分割”存在精度问题且调参复杂,无法很好地应对云雾、阴霾等情况;本篇文章分享的“基于Unet+opencv实现天空对象的分割、替换和美化”,较好地解决了该问题,包括以下内容:1、基于Unet语义分割的基本原理、环境构建、参数调节等2、一种有效的天空分割数......
  • 马毅教授新作:白盒ViT成功实现分割涌现,经验深度学习时代即将结束?
    前言 CRATE模型完全由理论指导设计,仅用自监督学习即可实现分割语义涌现。本文转载自新智元仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署框架最全教程整理【CV技......
  • SAP 评估类、评估类型、分割评估、评估范围的区别
    SAP评估类、评估类型、分割评估、评估范围的区别SAPMM评估类型评估类别同一物料的使用,既有“自制品”,又有“外购品”,并且其来源不同,如同一外购品由不同的供应商提供,价格也不相同,也就是说:同一物料有不同的价值指派,即在不同的条件下,同一物料可能有不同的价值。将“自制品”和......
  • ICCV 2023 | 超越SAM!EntitySeg:更少的数据,更高的分割质量!
    前言 在本文中,High-QualityEntitySegmentation对分割问题进行了全新的探索。本文转载自CVer仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署框架最全教程整理【CV......
  • 图像语义分割的图片标注及标注图片的读取 --- labelme
    labelme的安装1:先打开anacondaprompt命令行创建一个虚拟环境:condacreate--namelabelmepython=3.6condacreate-nlabpython=3.6  2:激活虚拟环境:condaactivatelab 3:安装labelme:4:输入labelme->系统会打开labelme的界面   单张图片和......