如何使用opencv在彩色图像和灰度图像之间进行分类?

How to classify between a color image and grey scale image using opencv?

我有一个用例,我需要将一些图像分类为灰度或彩色。我最初的步骤是基于灰度图像在一个像素上应该有 r、g、b 值的特性,与单通道的值相同。对于彩色图像,同一像素的r、g、b值可能不相同。

所以我通过获取 (r,g)、(b,g) 和 (r,b) 之间的差异来检查,如果所有三个都只有零,那么它的灰度级,它的颜色。

这种方法帮助我识别了许多灰度图像,但仍然有一些图像不遵循这种逻辑。任何人都可以指定一些好的特征,我们可以使用 opencv 将图像分类为彩色或灰度吗?

不要让我检查频道数量和分类,它为两个 类 提供 3,因为我们以 .jpg 格式加载它。

提前致谢

我怀疑,有些在数字化后从来不是灰度图像(例如灰度图片的彩色扫描)。由于噪声,RGB 值的差异很小。大于完美零的低阈值应该可以解决问题。

请注意,JPEG 完全具有灰度选项。但是,在存储图片时,您请求该模式。压缩机通常不会自动拾取它。此外,您在阅读 OpenCV 的 imread.

时明确需要设置标志 IMREAD_UNCHANGED

使用@QuangHoang 建议的方法,我得到了 85+% 准确率的结果。 这是解释的方法。

#test image
img=cv2.imread('test.jpg')
r,g,b=cv2.split(img)
#spliting b,g,r and getting differences between them
r_g=np.count_nonzero(abs(r-g))
r_b=np.count_nonzero(abs(r-b))
g_b=np.count_nonzero(abs(g-b))
diff_sum=float(r_g+r_b+g_b)
#finding ratio of diff_sum with respect to size of image
ratio=diff_sum/img.size
if ratio>0.005:
    label='color'
else:
    label='grey'

感谢所有建议。