使用OpenCV进行颜色分割

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:机器学习算法那些事

在滤波、变换、缩放等任务中,图像分割具有重要的意义。图像分割是将不同的对象划分为不同的部分,并将这些区域以明显的颜色或者记号标记出来。图像分割是使用轮廓、边界框等概念进行其他高级计算机视觉任务(例如对象分类和对象检测)的基础。良好的图像分割为我们后续的图像分类以及检测奠定了基础。

在计算机视觉中主要有3种不同的图像分割类型:

1.颜色分割或阈值分割

2.语义分割

3.边缘检测

在本文里,我们将介绍基于颜色的图像分割,并通过OpenCV将其实现。小伙伴可能会问,当我们拥有像Caffe和Keras这样的工具时,为什么要使用拥有21年历史的OpenCV库。与Caffe和Keras等现代SOTA DL方法相比,OpenCV虽然在准确性方面有一些落后,但是运行速度相较于上述方法具有得天独厚的优势。

跨框架进行图像分类任务的CPU性能比较

即使使用最著名的神经网络框架之一的YOLOv3进行对象检测时,其运行速度也是不尽如人意的。此外,Darknet使用OpenMP(应用程序编程接口)进行编译的时间几乎是OpenCV的18倍。这更加说明了使用OpenCV的速度是比较快速的。

在OpenCV和Darknet上进行YOLOv3培训时CPU性能

颜色分割可用于检测身体肿瘤、从森林或海洋背景中提取野生动物的图像,或者从单一的背景图像中提取其他彩色物体。下面几幅图是图像分割的几个典型示例。:

医学中的颜色分割

     

    

颜色分割示例

从以上示例中可以看出,尽管OpenCV是一种更快的方法,但是它对于图像的分割结果并不是非常的理想,有时会出现分割误差或者错误分割的情况

接下来我们将介绍如何通过OpenCV对图像进行颜色的分割。这里我们有一张含有鸟的图片,我们的目标是通过颜色分割尝试从图片中提取这只鸟。

含鸟的图片

首先我们导入完成该任务所需的所有库和这张图像:

import cv2 as cv
import matplotlib.pyplot as pltfrom PIL
import Image
!wget -nv https://static.independent.co.uk/s3fs-public/thumbnails/image/2018/04/10/19/pinyon-jay-bird.jpg -O bird.png
img = Image.open('./bird.png')

接下来我们使用滤波器对该图像进行预处理,对图像进行模糊操作,以减少图像中的细微差异。在OpenCV中提供了4个内置的滤波器,以满足用户对图像进行不同滤波的需求。这4种滤波器的使用方式在下面的代码中给出。但是,针对于本文中需要分割的图像,我们并不需要将4种滤波器都使用。

blur = cv.blur(img,(5,5))
blur0=cv.medianBlur(blur,5)
blur1= cv.GaussianBlur(blur0,(5,5),0)
blur2= cv.bilateralFilter(blur1,9,75,75)

下图是图像滤波模糊后的结果:

模糊后的图像

如果小伙伴对图像滤波感兴趣,可以在这里进行了解https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_filtering/py_filtering,这里再做过多的介绍。

接下来我们需要将图像从BGR(蓝绿色红色)转换为HSV(色相饱和度值)。为什么我们要从BGR空间中转到HSV空间中?因为像素B,G和R的取值与落在物体上的光相关,因此这些值也彼此相关,无法准确描述像素。相反,HSV空间中,三者相对独立,可以准确描述像素的亮度,饱和度和色度。

hsv = cv.cvtColor(blur2, cv.COLOR_BGR2HSV)

这个操作看似很小,但当我们尝试找到要提取的阈值或像素范围时,它会使我们的工作变得更加简单。

接下来是“颜色分割”的最重要一步,即“阈值分割”。这里我们将确定要提取的所有像素的阈值。使用OpenCV进行颜色分割中最重要步骤——阈值分割,这可能是一个相当繁琐的任务。即使我们可能想到通过使用颜色选择器工具来了解像素值,但是仍然需要进行不断的尝试,以便在所有像素中获取期望的像素,有些时候这也可能是一项艰巨的任务。具体操作如下:

low_blue = np.array([55, 0, 0])
high_blue = np.array([118, 255, 255])
mask = cv.inRange(hsv, low_blue, high_blue)

上面代码中最后一行的“Mask”将所有不在描述对象范围内的其他像素进行覆盖。程序运行结果如下图所示:

Mask

接下来,运行最后的代码以显示由Mask作为边界的图像。所使用的代码和程序运行结果在下面给出:

res = cv.bitwise_and(img,img, mask= mask)

从颜色分割中提取图像

那么通过上面的方式,我们就实现了基于颜色的图像分割,感兴趣的小伙伴们可以通过上面的代码和步骤进行尝试,看看能否满足自己的图像分割需求。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于在 Android 上使用 OpenCV 进行 RGB 色域的颜色分割,你可以按照以下步骤进行操作: 1. 首先,确保你已经在 Android 项目中集成了 OpenCV 库。你可以在 OpenCV 官方网站上找到相关的文档和指南。 2. 在你的代码中,导入必要的 OpenCV 类和方法: ```java import org.opencv.android.CameraBridgeViewBase; import org.opencv.android.JavaCameraView; import org.opencv.android.Utils; import org.opencv.core.Mat; import org.opencv.core.MatOfRect; import org.opencv.core.Rect; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgproc.Imgproc; ``` 3. 在你的 Activity 中,实现 `CameraBridgeViewBase.CvCameraViewListener2` 接口,并初始化相机视图: ```java public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 { private JavaCameraView javaCameraView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); javaCameraView = (JavaCameraView) findViewById(R.id.java_camera_view); javaCameraView.setVisibility(SurfaceView.VISIBLE); javaCameraView.setCvCameraViewListener(this); } } ``` 4. 实现相机视图的回调方法,在 `onCameraFrame()` 方法中进行图像处理: ```java @Override public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { Mat rgba = inputFrame.rgba(); // 将图像转换成 HSV 色域 Mat hsv = new Mat(); Imgproc.cvtColor(rgba, hsv, Imgproc.COLOR_RGB2HSV); // 颜色阈值,通过调整下面两个 Scalar 的值来选择特定颜色范围 Scalar lower = new Scalar(0, 100, 100); Scalar upper = new Scalar(10, 255, 255); // 对图像进行颜色分割 Mat mask = new Mat(); Core.inRange(hsv, lower, upper, mask); // 对分割结果进行处理,例如形态学操作或轮廓检测等 return rgba; } ``` 在上述代码中,我们首先将图像转换成 HSV 色域,然后通过调整 `lower` 和 `upper` 的值来选择特定的颜色范围,再使用 `Core.inRange()` 方法对图像进行颜色分割。你还可以根据需求对分割结果进行进一步的处理,例如应用形态学操作或进行轮廓检测等。 请注意,这只是一个简单的示例,你可能需要根据你的具体需求进行更多的图像处理和调整。同时,确保你已经在 AndroidManifest.xml 文件中添加了相机权限。 希望这能帮到你!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值