1

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

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

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

不要让我检查通道数和分类,因为我们以 .jpg 格式加载它,所以这两个类都给出了 3。

提前致谢

4

2 回答 2

1

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

请注意,JPEG 完全有一个灰度选项。但是,在存储图片时,您需要该模式。压缩机通常不会自动拾取它。IMREAD_UNCHANGED此外,您在使用 OpenCV 阅读时明确需要设置标志imread

于 2018-08-10T10:52:17.833 回答
1

使用@ 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'

感谢所有的建议。

于 2018-09-04T11:44:42.097 回答