1

我有这张图片,里面有两个人。它是二进制图像,仅包含黑白像素。

首先,我想遍历所有像素并在图像中找到白色像素。

比我想做的是,我想为某个白色像素找到 [x,y] 。

之后我想在图像中使用那个特定的[x,y],它是图像中的白色像素。

使用 [x,y] 的坐标,我想将相邻的黑色像素转换为白色像素。不是完整的图像。

我想在这里张贴图片,但不幸的是我不能张贴。我希望我的问题现在可以理解了。在下图中,您可以看到边缘。

例如,我发现鼻子的边缘使用 [x,y] 循环,然后将所有相邻的黑色像素变成白色像素。

这是二进制图像

4

1 回答 1

3

所描述的操作称为膨胀,来自数学形态学。例如,您可以使用,也可以scipy.ndimage.binary_dilation实现自己的。

这是执行此操作的两种形式(一种是简单的实现),您可以检查生成的图像是否相同:

import sys
import numpy
from PIL import Image
from scipy import ndimage

img = Image.open(sys.argv[1]).convert('L') # Input is supposed to the binary.
width, height = img.size
img = img.point(lambda x: 255 if x > 40 else 0) # "Ignore" the JPEG artifacts.

# Dilation
im = numpy.array(img)
im = ndimage.binary_dilation(im, structure=((0, 1, 0), (1, 1, 1), (0, 1, 0)))
im = im.view(numpy.uint8) * 255
Image.fromarray(im).save(sys.argv[2])

# "Other operation"
im = numpy.array(img)
white_pixels = numpy.dstack(numpy.nonzero(im != 0))[0]
for y, x in white_pixels:
    for dy, dx in ((-1,0),(0,-1),(0,1),(1,0)):
        py, px = dy + y, dx + x
        if py >= 0 and px >= 0 and py < height and px < width:
            im[py, px] = 255
Image.fromarray(im).save(sys.argv[3])
于 2013-02-22T17:20:40.933 回答