【问题标题】:How to classify between a color image and grey scale image using opencv?如何使用opencv在彩色图像和灰度图像之间进行分类?
【发布时间】:2019-01-17 23:07:55
【问题描述】:

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

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

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

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

提前致谢

【问题讨论】:

  • @SuryaTej 我只从这个逻辑开始。我应用了它并按照问题中的说明进行了尝试。它不适用于所有情况
  • @Sreekiran 你能发布一个不符合这个逻辑的例子吗?
  • 我不认为我被允许这样做。我会试试的。
  • 您可以稍微放宽标准并保留像素计数器。例如,如果计数器计数通道之间差异小于(小)阈值的像素,则在计数器上设置相对于图像分辨率的另一个阈值。

标签: python opencv image-processing classification opencv-python


【解决方案1】:

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

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

【讨论】:

  • IMREAD_UNCHANGED 适用于我转换为灰度并存储的普通图像。但是,不适用于我的用例。它仅作为 3 通道读取。
  • 你能检查每对通道的元素之间的最大差异吗?
【解决方案2】:

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

感谢所有建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 2019-03-04
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 2015-11-20
    相关资源
    最近更新 更多