5

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

我听说过 numpy 或 scipy 的 2D Fourrier 变换,但它有点复杂。

目标是确定由于这样的不良压缩导致的平方区域的数量(img a):

4

2 回答 2

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 并进行边缘检测并获取轮廓尺寸。这将更容易和更强大。

于 2012-11-13T10:35:35.633 回答
1

If you scan through lines of it it's abit easier because then you deal with linear graphs instead of 2d image graphs, which is always simpler.

Solution:

scan a line across the pixels, put the line in an array if it is faster to access for computations, and then run algorithms on the line(s) to determine the blockiness:

1/ run through every pixel in your line and compare it to the previous pixel by substracting the value between the two pixels. make an array of previous pixel values. if large jumps in pixel values are at regular invervals, it's blocky. if there are large jumps in values combined with small jumps in values, it's blocky... you can assume that if there are many equal pixel differences, it's blocky, especially if you repeat the analysis twice at 2 and 4 neighbour pixel intervals, and on multiple lines.

you can also make graphs of pixel differences between pixels 3-5-10 pixels apart, to have additional information on gradient changes of sampled lines of pics. if the ratio of pixel differences of neighbour pixels and 5th neighbour pixels is similar, it also indicates unsmooth colors.

there can be many algorythms, including fast fourrier on a linear graph, same as audio, that you would use on line(s) from the pic, that is simpler than a 2d image algorythm.

于 2014-03-05T09:13:47.713 回答