是否可以在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)
祝你好运, 埃米利奥
答案 0 :(得分:2)
这是一种方法。拿一个example image:
您没有说出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[~mask] = (255, 255, 255)
答案 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]的卷积可能会让你大部分都在那里。