在早期,有人问过这样的问题:Detecting a pixelated image in python以及quora

我试图找出是否可以将用户上传的图像检测为“像素化”。像素化是指图像like these:对于我而言,我无法访问原始(非像素化)版本。

我的方法:

不确定这种方法的效果如何,但是如果我可以获取图像中每个像素的RGB,然后将其与相邻像素进行比较以查看它们是否相似,那么我可以检测到图像被像素化了吗?我可以得到像素的RGB,但不知道如何将它们与相邻像素进行比较。

是否已经有执行此类操作的算法?我还能采取其他方法吗?我不受任何特定语言的约束。

最佳答案

这是一个可行的相当简单的方法:

  • 从x和y中经过1像素转换的副本中减去图像。
  • 对列和行中的像素求和(我仅在下面显示列)。
  • 找出峰值位置的频率和标准偏差。
  • 如果标准偏差低于某个阈值,则图像将被像素化。

  • 步骤1之后的图片:

    显示清晰的网格图案。现在,如果我们按列对像素求和,我们将得到:

    现在,我们可以找出峰列间距的规律性,并将其用作确定图像是否像素化的阈值。

    这是一些快速而粗糙的python代码,给出了一种方法的想法:
    import numpy as np
    import Image, ImageChops
    
    im = Image.open('fireworks-pixelate-02.gif')
    im2 = im.transform(im.size, Image.AFFINE, (1,0,1,0,1,1))
    im3 = ImageChops.subtract(im, im2)
    im3 = np.asarray(im3)
    im3 = np.sum(im3,axis=0)[:-1]
    mean = np.mean(im3)
    peak_spacing = np.diff([i for i,v in enumerate(im3) if v > mean*2])
    mean_spacing = np.mean(peak_spacing)
    std_spacing = np.std(peak_spacing)
    print 'mean gap:', mean_spacing, 'std', std_spacing
    

    输出:
    mean gap: 14.6944444444 std: 3.23882218342
    

    低标准差=像素化图像

    此未像素化的图像:

    有一个类似这样的图形:

    更高的标准输出:
    mean gap: 16.1666666667 std: 26.8416136293
    

    请注意,“平均差距”是没有意义的,因为std更高。

    希望这足以说明这种方法可以很好地工作。

    07-24 18:57
    查看更多