【问题标题】:How can I detect red particles on an image using python opencv?如何使用 python opencv 检测图像上的红色粒子?
【发布时间】:2017-10-19 18:12:24
【问题描述】:

我的工作是从图像中检测并获取红色颗粒的大小。我尝试了简单的斑点检测,但在滤色器和使用 HSV 提取红色值时效果不佳,但我得到的结果很差,因为图像的分辨率很小(我使用网络摄像头在 Rasperry Pi 上工作)。

这是一个示例图片:

【问题讨论】:

  • 很难想象,没有一些示例图片:(
  • 请发样图,你试过的代码可能
  • 我在帖子中添加了示例图片。感谢您的帮助:)
  • 仅供参考,1080 x 1920 的分辨率不是小。也许对于那些痴迷于高清的人来说,但绝对不是在图像处理方面。此外,颜色分割与分辨率无关。它与颜色的分布有关。这方面的分割与图像的大小无关。

标签: python image opencv image-processing colors


【解决方案1】:

使用 HSV 颜色空间非常好。如果显示图像的色相和饱和度分量,您会看到红色颗粒具有相对较大的色相和较小的饱和度。

顺便说一句,您的图像分辨率相当大。为了将图像拟合到帖子中以及最小化处理时间,我将进行下采样。首先让我们加载您的图像,将其调整为 25% 的分辨率,然后提取 HSV 组件:

import cv2 
import numpy as np

im = cv2.imread('sample.png')
im_resize = cv2.resize(im, None, None, 0.25, 0.25)
out = cv2.cvtColor(im_resize, cv2.COLOR_BGR2HSV)
stacked = np.hstack([out[...,0], out[...,1]])
cv2.imshow("Hue & Saturation", stacked) 
cv2.waitKey(0)
cv2.destroyAllWindows()

我还将色调和饱和度通道叠加到一个图像中,以便我们可以看到它的外观并将其显示到屏幕上。

我们得到这张图片:

与图像的其余部分相比,相对较大的色调分量与低饱和度分量的组合是独一无二的。让我们做一些简单的阈值化来提取那些我们寻找具有大于一个阈值的色调分量和小于另一个阈值的饱和度分量的区域的分量:

hue_thresh = 100
saturation_thresh = 32

thresh = np.logical_and(out[...,0] > hue_thresh, out[...,1] < saturation_thresh)

cv2.imshow("Thresholded", 255*(thresh.astype(np.uint8)))
cv2.waitKey(0)
cv2.destroyAllWindows()

我设置了一些调整的阈值,然后使用numpy.logical_and 将这两个条件组合在一起。因为图像现在是bool 类型,并且要显示图像,它们应该是无符号或浮点类型,我们将图像转换为uint8,然后乘以255。

我们现在得到这张图片:

如您所见,我们提取了与背景不常见的带红色调的部分。还需要调整阈值,但对于这个特定示例来说没问题。

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 2016-11-15
    • 2021-07-31
    • 2017-05-15
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多