Image 检测照片与渲染图像

Image 检测照片与渲染图像,image,image-processing,numpy,photos,Image,Image Processing,Numpy,Photos,我正在尝试,给定一个随机图像并使用NumPy,检测它是照片还是“渲染”图像(如地图)。图像可以是彩色或黑白,渲染图像中的渐变可能很容易使用0-255,因此计算颜色对灰度没有帮助。我不能使用EXIF/etc元数据 到目前为止,我已经很快地尝试了一些方法,但没有任何意外: 转换为灰度,然后查看直方图 2D FFT,然后查看每个频带的频率直方图(如RGB和YUV) 查看亮度的平均值和标准偏差 基于小波变换和滤波器的边缘检测 比较每个图像中随机21x21面片的属性 将图像压缩为JPEG(适用于照片)或

我正在尝试,给定一个随机图像并使用NumPy,检测它是照片还是“渲染”图像(如地图)。图像可以是彩色或黑白,渲染图像中的渐变可能很容易使用0-255,因此计算颜色对灰度没有帮助。我不能使用EXIF/etc元数据

到目前为止,我已经很快地尝试了一些方法,但没有任何意外:

  • 转换为灰度,然后查看直方图
  • 2D FFT,然后查看每个频带的频率直方图(如RGB和YUV)
  • 查看亮度的平均值和标准偏差
  • 基于小波变换和滤波器的边缘检测
  • 比较每个图像中随机21x21面片的属性
  • 将图像压缩为JPEG(适用于照片)或Deflate(aka.PNG)(适用于地图)并比较每个像素的位
(请随意建议我回去再看一眼)

我通常会分析较大区域的随机样本,而不是下面所示的小作物,因此忽略偶尔边缘情况的方法应该有效

目前有希望的潜在客户如下所述,我还没有看到的想法有:

  • 没有留下
有什么算法/方法我应该关注吗

高速列车 黑白图像仍在进行中:)--但所有渲染图像的色调和饱和度都比照片要尖锐得多,并且通常有2-5倍的最大值

image_hsv = skimage.color.rgb2hsv(image_rgb)

hue_band, sat_band, val_band = np.squeeze(np.dsplit(image_hsv, 3))

band_hist, _ = np.histogram(hue_band.ravel(), bins=256)
peak_idx = np.signal.argrelmax(band_hist, order=20)[0]

peaks = band_hist[peak_idx]
对比度 通过下面的代码计算,检查对比度似乎稍微好一点。照片通常看起来是150张。尽管黑白贴图的对比度很低(如下图中的11):

当前方法 我目前的想法是:

  • 从图像中分析多达8个512x512px的随机面片,这些面片都投票支持结果:
  • 对于RGB图像,将面片转换为HSV颜色
  • 创建黑白数据或色调带的直方图(256个格)(
    np.histogram()
  • 统计直方图中的非空箱子,如果少于100,则投票为“地图”
  • 获取直方图的峰值(
    signal.argrelmax(hist,order=20)
  • 如果最大峰值大于频带内总像素的9%,且最大峰值大于等于峰值平均值的2倍,则投票为“地图”
  • 否则,投票结果为“照片”
  • 如果补丁中50%的投票是“地图”,则结果是“地图”
  • 在彩色图像上运行时效果非常好,如果数据集中有多个图像,并且可以在每个图像级别上再次进行投票,结果会更好

    黑白照片仍然有点随意

    示例图像 高对比度彩色照片。有些可能过度暴露:

    低对比度彩色照片:

    高对比度黑白照片。同样,有些可能会过度暴露:

    低对比度黑白照片:

    低对比度彩色地图:

    高对比度贴图:


    黑白地图:

    我同意这可能稍微超出了SO的范围。也许把它交给你

    为了让你们开始,我建议你们看每一张图片的颜色,而不是颜色或对比度。您的边缘检测想法是朝着正确方向迈出的一步


    一旦你将每张图像转换为一组数字纹理特征,你就可以使用一个新的方法将照片从合成图像中分离出来。

    我认为这超出了StackOverflow的范围。也就是说,我认为这违反了“如果你能想象一整本书都能回答你的问题,那么你问得太多了。”关于。@farenorth“照片与否?”这一点我可以说得很简单:)我同意图像分类或物体检测或其他更复杂的东西,但希望有一个相对简单的答案可以帮助其他人。我同意这个问题在stats.stackexchange.com这样的网站上可能会得到更好的答案。然而,我将在这里提出一个快速建议,即尝试使用频率空间特性来完成此任务。自然图像往往具有相当规则的频谱,在低频时具有很大的功率,而“渲染”图像在高频时可能具有更大的功率。要检查具有相同颜色的平坦区域,生成的图像即使具有渐变也会具有这些功率,而真实照片很少。照片中的平面区域通常会有很多颜色。“照片与否”的问题是否超出了范围?不够专注?我真的不明白为什么这个问题是封闭的。
    # image_rgb is a 3D numpy array: [
    #                                 [ [r,g,b], [r,g,b], ... ],
    #                                 [ [r,g,b], [r,g,b], ... ],
    #                                 ...
    #                                ]
    
    # these constants from http://en.wikipedia.org/wiki/Relative_luminance
    rgb2lum = numpy.array([0.2126, 0.7152, 0.0722])
    luminance = numpy.dot(image_rgb, rgb2lum)
    
    # for B&W images, luminance == image_bw already
    rms_contrast = numpy.sqrt(numpy.mean(numpy.square(luminance)))