使用 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。
我们现在得到这张图片:
如您所见,我们提取了与背景不常见的带红色调的部分。还需要调整阈值,但对于这个特定示例来说没问题。