我的工作是检测并从图像中获取红色粒子的大小。我尝试了简单的斑点检测,但是使用彩色滤镜效果很差,并使用HSV提取红色值,但由于图像分辨率较小(我使用网络摄像头在Rasperry Pi上工作),因此效果不佳。
答案 0 :(得分:3)
使用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。
我们现在得到这张图片:
如您所见,我们提取出与背景不常见的偏红色调部分。阈值也需要用,但这对于这个特定的例子来说很好。