【发布时间】: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