首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测照片和呈现的图像

检测照片和呈现的图像
EN

Stack Overflow用户
提问于 2014-10-13 22:23:41
回答 1查看 369关注 0票数 3

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

到目前为止,我很快就尝试了一些方法,没有跳出来:

  • 转换为灰度,然后查看直方图
  • 然后查看每个频带的频率直方图(如RGB和YUV)。
  • 看亮度的均值和标准差
  • 基于机智索贝尔滤波器的边缘检测
  • 比较每幅图像中随机21x21块的GLCM特性
  • 将图像压缩为JPEG (对照片有用)或Deflate (又名Deflate)。(用于地图)和每像素位的比较。

(建议我回去再看一看)

我通常是在分析大面积的随机样本,而不是像下面这样的小作物的样本,所以忽略偶尔的边缘情况的方法应该有效。

下面描述了当前的有希望的线索,我还没有看过的想法是:

  • 一个也没留下

有什么算法/方法我应该看看吗?

HSV

对黑白图像的研究仍在进行中:) --但是所有渲染图像的色调和饱和度都比照片高得多,而且通常也有一个2-5倍的最大值。

代码语言:javascript
复制
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以下图片:

代码语言:javascript
复制
# 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)))

现行方法

我现在要说的是:

  1. 从图像中分析多达8x512x512px随机斑块,所有这些都投票支持一个结果:
    1. 对于RGB图像,将补丁转换为HSV颜色。
    2. 创建B&W数据或色调带(np.histogram())的直方图(256个桶)
    3. 统计直方图中的非空箱,如果票数少于100,则为“地图”。
    4. 获取直方图(signal.argrelmax(hist, order=20))的峰值
    5. 如果最大峰值大于带宽总像素的9%,最大峰值为峰值均值的>=2x,则投票为“map”。
    6. 否则,投票就是“照片”。

  1. 如果50%的选票是“地图”,那么结果就是“地图”。

如果你在一个数据集中有多个图像,并且可以在每个图像级别上重新投票,结果会变得更好。

B&W图像仍然有些不太好用。

示例图像

高对比度彩色照片。有些可能暴露得过高:

低对比度彩色照片:

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

低对比度黑白照片:

低对比度彩色地图:

高对比度地图:

B&W地图:

EN

回答 1

Stack Overflow用户

发布于 2014-10-14 00:24:19

我同意这样做可能有点超出了范围。也许把它提交给交叉验证

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

一旦将每幅图像转换成一组数字纹理特征,就可以使用二进制分类器将照片与合成图像分开。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26349837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档