我正在尝试,给出一个随机的图像,并使用NumPy来检测它是否是一张照片,而不是一张“呈现”的图像(比如地图)。图像可以是彩色的,也可以是黑白的,渲染图像中的渐变可能很容易使用0-255,所以计数颜色对灰度没有帮助。我不能使用EXIF/etc元数据。
到目前为止,我很快就尝试了一些方法,没有跳出来:
(建议我回去再看一看)
我通常是在分析大面积的随机样本,而不是像下面这样的小作物的样本,所以忽略偶尔的边缘情况的方法应该有效。
下面描述了当前的有希望的线索,我还没有看过的想法是:
有什么算法/方法我应该看看吗?
HSV
对黑白图像的研究仍在进行中:) --但是所有渲染图像的色调和饱和度都比照片高得多,而且通常也有一个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())的直方图(256个桶)signal.argrelmax(hist, order=20))的峰值
如果你在一个数据集中有多个图像,并且可以在每个图像级别上重新投票,结果会变得更好。
B&W图像仍然有些不太好用。
示例图像
高对比度彩色照片。有些可能暴露得过高:

低对比度彩色照片:

高对比度B&W照片。再一次,有些人可能暴露得很过分:

低对比度黑白照片:

低对比度彩色地图:

高对比度地图:

B&W地图:

发布于 2014-10-14 00:24:19
我同意这样做可能有点超出了范围。也许把它提交给交叉验证
为了让您开始,我建议您查看每幅图像的纹理特征,而不是颜色或对比度。你的边缘检测想法是朝着正确方向迈出的一步。
一旦将每幅图像转换成一组数字纹理特征,就可以使用二进制分类器将照片与合成图像分开。
https://stackoverflow.com/questions/26349837
复制相似问题