2012-10-17 111 views
4

我试图确定图像是否平方(像素化)。在Python中检测像素化图像

我听说过使用numpy或scipy进行2D fourrier变换,但它有点复杂。

的目标是确定的平方区的数量,由于恶劣的压缩就像这样(IMG一):

+2

这只是我的头顶,所以它只是一个评论。你有没有访问原始的,未压缩的图像?如果是这样,您可以尝试对2幅图像进行颜色统计。如果其中一个比另一个低得多,那么你几乎肯定会发生像素化/后缀化。 –

+0

我无法使用原始图像很遗憾 – kollo

回答

2

我不知道这是否会工作 - 但是,有些东西你可以尝试是获取像素周围的最近邻居。像素化正方形将成为区域周围RGB值的可见跳转。

你可以找到的东西每个像素最近邻图像中像

def get_neighbors(x,y, img): 
    ops = [-1, 0, +1] 
    pixels = [] 
    for opy in ops: 
     for opx in ops: 
      try: 
       pixels.append(img[x+opx][y+opy]) 
      except: 
       pass 
    return pixels 

这会给你在你的源图像的区域最近的像素。

要使用它,你会做这样的事情

def detect_pixellated(fp): 
    img = misc.imread(fp) 
    width, height = np.shape(img)[0:2] 

    # Pixel change to detect edge 
    threshold = 20 

    for x in range(width): 
     for y in range(height): 
      neighbors = get_neighbors(x, y, img) 

      # Neighbors come in this order: 
      # 6 7 8 
      # 3 4 5 
      # 0 1 2 

      center = neighbor[4] 
      del neighbor[4] 

      for neighbor in neighbors: 
       diffs = map(operator.abs, map(operator.sub, neighbor, center)) 
       possibleEdge = all(diff > threshold for diff in diffs) 

进一步的思考,虽然,使用OpenCV的经过,并做边缘检测,并得到轮廓大小。这将会更容易,更强大。

+0

最后一段“......使用OpenCV并进行边缘检测并获得轮廓大小......”确实有帮助!谢谢 – Hamed

1

如果你扫描它的行,它会稍微容易一些,因为那样你就可以处理线性图而不是二维图,这总是比较简单。

解决方案:

扫描跨越像素的线,放线在阵列如果它是更快地用于计算访问,然后对线(S)上运行的算法来确定所述块效应:

1 /遍历行中的每个像素,并通过减去两个像素之间的值来将它与前一个像素进行比较。制作一组以前的像素值。如果像素值中的大跳跃是规则的宽度,那么它是块状的。如果数值有较大的跃变并伴随着小的跳跃值,那么它就是块状的......你可以假设如果有许多相等的像素差异,那么它是块状的,尤其是如果你以2和4的相邻像素间隔重复两次分析,以及在多条线上。

您还可以制作像素间像素差异3-5-10像素的图形,以获取有关图像采样线的梯度变化的附加信息。如果相邻像素和第5个相邻像素的像素差异比例相似,则它也表示不平滑的颜色。

可以有许多algorythms,包括线性图上的快速fourrier,与音频一样,你可以在pic上使用这些线,比2d图像algorythm简单。