【问题标题】:Find pixels with given RGB colors查找具有给定 RGB 颜色的像素
【发布时间】:2017-07-05 10:07:19
【问题描述】:

我想从 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。)

【问题讨论】:

  • 什么exaclty不起作用?您收到错误还是没有找到像素?
  • 每次我尝试时它只显示一个坐标,并且总是相同的坐标。
  • 尝试将return 替换为yield。使用前者,你只会得到一个返回值,因为函数完成了第一个匹配。后者继续搜索并最终创建一个包含所有找到的像素的生成器。生成器可以用list(find_rgb(imagename, r_query, g_query, b_query))进行转换

标签: python colors


【解决方案1】:

出于速度原因,我建议使用 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中?
  • 你需要下载它。最好使用 conda 或 pip。
【解决方案2】:
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() 代替

【讨论】:

  • 我混合了这个和前一个,它对我有用。谢谢!
【解决方案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 (last recent call last): File "", line 1, in find_yellow_pixels('t1.jpg ') 文件“”,第 14 行,在 find_yellow_pixels rgb = img.convert('rgb') AttributeError: 'file' object has no attribute 'convert'
  • 是的,有错误,已修复
猜你喜欢
  • 2020-04-27
  • 1970-01-01
  • 2015-03-15
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
相关资源
最近更新 更多