我正在尝试,给定一个随机图像并使用NumPy,检测它是照片与“渲染”图像(如地图)。图像可以是彩色或黑色&白色和渲染图像中的渐变可能很容易使用0-255,因此计算颜色对灰度无效。我无法使用EXIF / etc元数据。
方法到目前为止我已经很快就尝试了,没有任何跳出来:
(随意建议我回去看看)
我通常会分析较大区域的随机样本,而不是像下面显示的示例那样的小作物,因此忽略偶然边缘情况的方法应该有效。
目前有前景的潜在客户如下所述,我尚未看到的想法是:
我应该关注哪些算法/方法?
仍然是黑白图像的进展中的工作:) - 但色调&所有渲染图像的饱和度很多比照片更苛刻,并且通常也具有高出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]
通过以下代码计算,检查对比度似乎稍好一些。照片通常看起来<= 130,并且地图通常>≥150。虽然黑白地图的对比度非常低(例如,下图中为11):
# 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)))
我目前所使用的是:
np.histogram()
)signal.argrelmax(hist, order=20)
)在彩色图像上运行时非常好,如果数据集中有多个图像,并且可以在每个图像级别重新投票,结果会再次变好。
B&amp; W图像仍有点受欢迎。
高对比度彩色照片。有些可能会过度暴露:
低对比度彩色照片:
高对比度B&amp; W照片。同样,有些可能会过度暴露:
低对比度B&amp; W照片:
低对比度彩色地图:
高对比度地图:
B&amp; W地图:
答案 0 :(得分:0)
我同意这可能略微超出了SO的范围。也许将其提交给Cross Validated?
为了让您入门,我建议您查看每张图片的texture features,而不是颜色或对比度。你所拥有的边缘检测思想是朝着正确方向迈出的一步。
将每张图片转换为一组数字纹理特征后,您可以使用binary classifier将照片与合成图像分开。