Image 检测照片与渲染图像
我正在尝试,给定一个随机图像并使用NumPy,检测它是照片还是“渲染”图像(如地图)。图像可以是彩色或黑白,渲染图像中的渐变可能很容易使用0-255,因此计算颜色对灰度没有帮助。我不能使用EXIF/etc元数据 到目前为止,我已经很快地尝试了一些方法,但没有任何意外:Image 检测照片与渲染图像,image,image-processing,numpy,photos,Image,Image Processing,Numpy,Photos,我正在尝试,给定一个随机图像并使用NumPy,检测它是照片还是“渲染”图像(如地图)。图像可以是彩色或黑白,渲染图像中的渐变可能很容易使用0-255,因此计算颜色对灰度没有帮助。我不能使用EXIF/etc元数据 到目前为止,我已经很快地尝试了一些方法,但没有任何意外: 转换为灰度,然后查看直方图 2D FFT,然后查看每个频带的频率直方图(如RGB和YUV) 查看亮度的平均值和标准偏差 基于小波变换和滤波器的边缘检测 比较每个图像中随机21x21面片的属性 将图像压缩为JPEG(适用于照片)或
- 转换为灰度,然后查看直方图
- 2D FFT,然后查看每个频带的频率直方图(如RGB和YUV)
- 查看亮度的平均值和标准偏差
- 基于小波变换和滤波器的边缘检测
- 比较每个图像中随机21x21面片的属性
- 将图像压缩为JPEG(适用于照片)或Deflate(aka.PNG)(适用于地图)并比较每个像素的位
- 没有留下
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):
当前方法
我目前的想法是:
np.histogram()
)signal.argrelmax(hist,order=20)
)低对比度彩色照片:
高对比度黑白照片。同样,有些可能会过度暴露:
低对比度黑白照片:
低对比度彩色地图:
高对比度贴图:
黑白地图:
我同意这可能稍微超出了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)))