查找具有给定RGB颜色的像素

4

我希望能够在Python中获取具有给定RGB颜色的像素的所有坐标。这是我正在使用的代码,但它不起作用。我想找到所有黄色像素。

from PIL import Image
def find_rgb(imagename, r_query, g_query, b_query):
    img = Image.open(imagename)
    rgb = img.convert('RGB')
    for x in range(507):
        for y in range(337):
            r, g, b, = rgb.getpixel((x, y))
            if r >= r_query and g >= g_query and b <= b_query:
                return (x,y)

如何让Python只在至少有三个像素具有相同颜色时才给出坐标?(它们不必是完全相同的颜色,例如156,173,87和155,173,87。)


具体是什么出了问题?你是否收到了错误提示,还是没有找到像素? - An intern has no name
1
每次我尝试时,它只显示一个坐标,并且始终是相同的坐标。 - AV13
1
尝试用“yield”代替“return”。前者只会返回单个返回值,因为函数已经完成了第一次匹配。后者会继续搜索,最终创建一个包含所有找到的像素的生成器。可以使用“list(find_rgb(imagename, r_query, g_query, b_query))”将生成器转换为列表。 - fsimkovic
3个回答

4

出于速度考虑,我建议使用numpy:

import numpy as np

width = 100
height = 100
channels = 3
img = np.random.rand(width, height, channels) * 255

r=0
g=1
b=2

r_query = 240
g_query = 240
b_query = 20
print(np.where((img[:,:,r] >= r_query) & (img[:,:,g] >= g_query) & (img[:,:,b] <= b_query)))

这将给您一个二维数组,其中包含原始图像中黄色像素的坐标。


你应该下载NumPy还是它已经安装在Python中了? - AV13
你需要下载它。最好使用conda或pip。 - Flomp

3

在循环中使用了return,所以您将始终仅返回最多一个像素,您可以将像素存储在set中,以便返回所有黄色像素。

def find_yellow_pixels(image_name):

    # Set the value you want for these variables
    r_min = 250
    r_max = 255
    g_min = 250
    g_max = 255
    b_min = 0
    b_max = 0

    yellow_pixels = set()

    img = Image.open(image_name)
    rgb = img.convert('rgb')
    for x in range(img.size[0]):
        for y in range(img.size[1]):
            r, g, b = rgb.getpixel((x, y))
            if r >= r_min and r <= r_max and b >= b_min and b <= b_max and g >= g_min and g <= g_max:
                yellow_pixels.add((x,y))

    return yellow_pixels

编辑:修复,将open(更改为Image.open(


当我尝试运行它时,它会给我以下错误:Traceback (most recent call last): File "<pyshell#137>", line 1, in <module> find_yellow_pixels('t1.jpg') File "<pyshell#136>", line 14, in find_yellow_pixels rgb = img.convert('rgb') AttributeError: 'file' object has no attribute 'convert' - AV13
是的,有错误,现在已经修复了。 - Benoît Zu

1
from PIL import Image
def find_rgb(imagename, r_query, g_query, b_query):
    img = Image.open(imagename)
    pix = img.load()
    coordinates= []
    for x in range(img.size[0]):
        for y in range(img.size[1]):
            r, g, b = pix[x,y]
            if matching_algo(r, g, b, r_query, g_query, b_query):
                # print("{},{} contains {}-{}-{} ".format(x, y, r, g, b))
                coordinates.append((x, y))
    return(coordinates)


def matching_algo(r, g, b, r_query, g_query, b_query):
    if r == r_query and g == g_query:
        return True
    elif r == r_query and b == b_query:
        return True
    elif b == b_query and g == g_query:
        return  True
    else:
        return False


if __name__== "__main__":
    find_rgb('dead_parrot.jpg', 255, 255, 0)

尝试一下这个,你可以改进我的匹配算法实现。 我移除了你的convert()代码并使用了load()。

1
我把这个和之前的混合在一起,对我很有效。谢谢! - Vahid S. Bokharaie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接