如果我知道颜色(RGB),如何获取像素坐标?

dr.*_*dia 6 python opencv python-imaging-library python-3.x

我使用 Python、opencv 和 PIL。

image = cv2.imread('image.jpg')

color = (235, 187, 7)
Run Code Online (Sandbox Code Playgroud)

如果我知道像素颜色,如何获得像素坐标(x,y)?

Jer*_*uke 5

这是一个 numpythonic 解决方案。Numpy 库尽可能加快操作速度。

  • 假设颜色为: color = (235, 187, 7)

indices = np.where(img == color)

  • 我使用 numpy.where() 方法来检索两个数组的元组索引,其中第一个数组包含颜色像素 (235, 187, 7) 的 x 坐标,第二个数组包含这些像素的 y 坐标.

现在indices返回如下内容:

(array([ 81,  81,  81, ..., 304, 304, 304], dtype=int64),
 array([317, 317, 317, ..., 520, 520, 520], dtype=int64),
 array([0, 1, 2, ..., 0, 1, 2], dtype=int64))
Run Code Online (Sandbox Code Playgroud)
  • 然后我使用 zip() 方法来获取包含这些点的元组列表。

coordinates = zip(indices[0], indices[1])

  • 但是如果您注意到这是一个具有三个通道的彩色图像,每个坐标将重复三次。我们只需要保留唯一的坐标。这可以使用set()方法来完成。

unique_coordinates = list(set(list(coordinates)))


QA *_*ive 4

尝试类似的方法:

color = (235, 187, 7)
im = Image.open('image.gif')
rgb_im = im.convert('RGB')
for x in range(rgb_im.size()[0]):
    for y in range(rgb_im.size()[1]):
        r, g, b = rgb_im.getpixel((x, y))
        if (r,g,b) == colour:
            print(f"Found {colour} at {x},{y}!")
Run Code Online (Sandbox Code Playgroud)

getpixel 可能会很慢,因此请考虑使用像素访问对象

另请注意,返回的值可能取决于图像类型。例如,pix[1, 1]由于 GIF 像素引用 GIF 调色板中的 256 个值之一,因此返回单个值。

另请参阅这篇文章:Python and PIL Pixel Values different for GIF and JPEG,此PIL 参考页面 包含有关该函数的更多信息convert()

顺便说一句,您的代码对于图像来说效果很好.jpg