将当前像素值与numpy数组上的前一像素值进行比较

时间:2014-02-27 19:53:51

标签: python arrays image numpy

是否可以在numpy数组中实现此图像过滤过程?我需要检查前一列和上一行中的像素是否与当前像素不同。

width, height = orig_bin.size
pixels = orig_bin.load()

delta = 50
begin = 10
min_w = 30
max_w = 260
min_h = 10
max_h = 40

w_range = range(begin, width - min_w - delta)
h_range = range(begin, height - min_h - delta)

is_changing = False
for x in w_range:
    for y in h_range:
        change_pixel = False
        current_pixel = pixels[x,y]
        if current_pixel != pixels[x, y+1]:
            change_pixel = True

        if current_pixel != pixels[x+1, y]:
            change_pixel = True

        if change_pixel:
            pixels[x,y] = (0,0,0)
        else:
            pixels[x,y] = (255,255,255)

祝你好运, 埃米利奥

2 个答案:

答案 0 :(得分:2)

这是一种方法。拿一个example image

Render of Utah teapot model by Martin Newell

您没有说出orig_bin来自哪里,所以我使用了scipy.misc.imread

from scipy.misc import imread, imsave
img = imread('input.png')

首先,为与上面的像素不同的像素创建一个遮罩(这使用来自Bi Rico's answer的想法):

up   = (img[1:,1:] != img[:-1,1:]).any(axis=2)

请注意imread按行主顺序加载图像,因此第一个NumPy轴是垂直轴。见" Multidimensional Array Indexing Order Issues"作出解释。

同样,为不同于左边像素的像素创建一个遮罩:

left = (img[1:,1:] != img[1:,:-1]).any(axis=2)

组合这些以获得与上方或左侧像素不同的像素的遮罩:

mask = numpy.zeros(img.shape[:2], dtype=bool)
mask[1:,1:] = left | up

创建正确尺寸的黑色输出图像;然后将蒙版设置为白色:

output = numpy.zeros(img.shape)
output[mask] = (255, 255, 255)
imsave('output.png', output)

结果如下:

Output white

或者如果您希望颜色相反,请反转遮罩:

output[~mask] = (255, 255, 255)

Output black

答案 1 :(得分:1)

你想要这样的东西:

change = (pixels[1:, 1:] != pixels[1:, :-1]) | (pixels[1:, 1:] != pixels[:-1, 1:])

这将是二进制(True,False),如果您希望结果为0/255,则需要将其乘以255。如果数组是(x,y,3),你也可能需要在最后一个维度上运行。

还有其他方法可以重新解决这个问题,例如使用[1,-1]的卷积可能会让你大部分都在那里。