在早期,有人问过这样的问题:Detecting a pixelated image in python以及quora
我试图找出是否可以将用户上传的图像检测为“像素化”。像素化是指图像like these:对于我而言,我无法访问原始(非像素化)版本。
我的方法:
不确定这种方法的效果如何,但是如果我可以获取图像中每个像素的RGB,然后将其与相邻像素进行比较以查看它们是否相似,那么我可以检测到图像被像素化了吗?我可以得到像素的RGB,但不知道如何将它们与相邻像素进行比较。
是否已经有执行此类操作的算法?我还能采取其他方法吗?我不受任何特定语言的约束。
最佳答案
这是一个可行的相当简单的方法:
步骤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更高。
希望这足以说明这种方法可以很好地工作。