【问题标题】:Detecting a pixelated image in python在python中检测像素化图像
【发布时间】:2012-10-08 04:27:49
【问题描述】:

我正在尝试确定图像是否为正方形(像素化)。

我听说过使用 numpy 或 scipy 进行二维傅里叶变换,但它有点复杂。

目标是确定由于压缩不良导致的平方区域的数量,如下所示(img a):

【问题讨论】:

  • 这只是我的想法,所以它只是一个评论。您可以访问原始的未压缩图像吗?如果是这样,您可以尝试对 2 张图像进行颜色计数。如果一个比另一个低很多,你几乎肯定会发生像素化/分色。
  • 遗憾的是我无法访问原始图像

标签: python image pixel


【解决方案1】:

如果你扫描它的线条,它会更容易一些,因为你处理的是线性图而不是二维图像图,这总是更简单。

解决方案:

在像素上扫描一条线,如果计算访问速度更快,则将该线放入一个数组中,然后对该线运行算法以确定块状:

1/ 遍历行中的每个像素,并通过减去两个像素之间的值将其与前一个像素进行比较。制作一个先前像素值的数组。如果像素值的大跳跃以常规方式进行,则它是块状的。如果值有较大的跳跃和值的小跳跃,则它是块状的......您可以假设如果有许多相等的像素差异,它是块状的,特别是如果您以 2 和 4 个相邻像素间隔重复分析两次,并且多行。

您还可以制作相距 3-5-10 像素的像素之间的像素差异图表,以获取有关图片采样线的渐变变化的更多信息。如果相邻像素和第 5 个相邻像素的像素差异比率相似,也表示颜色不平滑。

可以有许多算法,包括线性图上的快速傅里叶算法,与音频相同,您可以在图片中的行上使用它,这比 2d 图像算法更简单。

【讨论】:

    【解决方案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 进行边缘检测并获取轮廓尺寸。这样会更容易、更健壮。

    【讨论】:

    • 最后一段“...使用 OpenCV 并进行边缘检测并获取轮廓大小...”确实有很大帮助!谢谢
    • 对于迟到的问题,我很抱歉,但我最近发现了这篇文章,我也遇到了同样的问题。当您谈论轮廓尺寸时,您的意思是像使用轮廓区域一样mentioned in here?
    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2019-08-25
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多