【问题标题】:Determine if certain parts of an RGB image are colored or grayscale using numpy使用 numpy 确定 RGB 图像的某些部分是彩色还是灰度
【发布时间】:2022-01-06 14:45:54
【问题描述】:

我正在尝试使用 python、opencv 和 numpy 库来确定 RGB 图像的某些部分是彩色的还是灰度的。更具体地说,在 RGB 图像中,我使用神经网络确定人脸位置,当该图像包含打印照片时,我想知道该图像中的人脸位置是灰度还是彩色。

到目前为止我尝试了什么:

            red_average = np.average(rgb_image_crop[:,:,0])
            green_average = np.average(rgb_image_crop[:,:,1])
            blue_average = np.average(rgb_image_crop[:,:,2])

            highest_distance = max(abs(red_average-green_average), abs(red_average-blue_average), abs(green_average-blue_average))
            if highest_distance> 15:
                print("this crop is colored")
            else:
                print("this crop is grayscale")

找到人脸位置后,人脸被裁剪并命名为“rgb_image_crop”。我基本上使用 numpy 拆分 R、G、B 通道并分别取它们的平均值。我的逻辑是,与彩色图像相比,灰度图像的 R、G、B 像素值彼此接近,这种方法的性能一般。

但我想知道有没有比这更复杂的方法并有望获得更高的成功?我查看了其他问题,但每个人都只是想确定图像文件是黑白还是 RGB。

得出结果后编辑: 我尝试了计算机视觉中的各种方法,然后尝试使用我创建的数据集训练 CNN 分类器。显然 CNN 网络不能学习太多颜色,但大多数情况下它们学习纹理,结果真的令人失望。我训练了一个基于 Darknet YOLOV4 的分类器,并用现实生活中的例子进行了测试,但未能给出令人满意的结果。马克的建议是最稳定的建议,然后是我在问题中提到的建议。我将尝试使用硬件加速来实现 Mark 的解决方案,并使其使用更少的 CPU 资源。

【问题讨论】:

  • 在我的脑海中,尝试将裁剪的图像转换为灰度并使用 MSE(均方误差)函数来确定裁剪的图像最初是否为灰度?
  • 转换为 YUV,考虑 U 和 V 通道。 --“考虑”意味着应用统计数据(最小值/最大值、标准差、...)——如果你转换为 HSV 或类似的,饱和度在暗点上可能会变得荒谬,然后你也必须查看值,所以也许不使用 HSV
  • 只需裁剪您要测试的部分,并通过在通道对之间进行差分来检查 3 个通道是否相等(或仅检查 3 个通道的均值是否相等)
  • @sai 谢谢你的回复,我尝试了你的建议,结果平均成功。但它不如我在问题中首先提到的方法稳定。彩色和灰度图片之间的差异不是那么明显,尤其是在非洲人的深色皮肤上。
  • 您选择了一个相当不幸的示例图像,因为灰色具有明显的蓝色调,这意味着它们实际上并未显示为灰色。尝试在男人的脸上运行 “颜色选择器” 工具,你就会明白我的意思了。如果你的操作系统上没有,你可以使用pinetools.com/image-color-picker

标签: python numpy opencv computer-vision


【解决方案1】:

您可以在第 3 维上使用 Numpy peak-to-peak 来获取每个像素位置的最小和最大 RGB 值之间的差异。然后阈值并计算异常值:

RGBrange = np.ptp(im, axis=2)
coloured = RGBrange > 10

您可能还会得到一些想法here

【讨论】:

  • 非常感谢您花时间研究您的旧答案。我尝试了您的建议:RGB_range = np.ptp(img_spoof, axis=2) coloured_ptp = RGB_range > 15 coloured_ptp = np.count_nonzero(colored_ptp) #colored_pth 越高,越有可能是彩色作物。结果比我最初提出的想法更稳定。目前我正在尝试使用 CNN 模型来比较结果。得到所有结果后,我会告诉你哪种解决方案效果最好。
【解决方案2】:

如何找到裁剪图像的每个像素的最大差异,然后获取它们的 STD。对于灰度图像,该值与彩色图像相比必须很小。

【讨论】:

  • 我认为您的建议只会确定裁剪后的图像是否主要由一种颜色组成,因为标准偏差只会告诉我们 RGB 通道之间的差异是否在整个图像中发生了变化。
猜你喜欢
  • 2012-01-09
  • 2021-12-13
  • 2014-07-18
  • 2013-12-02
  • 2013-03-13
  • 1970-01-01
  • 2014-07-02
  • 2011-06-05
  • 2021-08-19
相关资源
最近更新 更多