Python 从图像中获取颜色并表示它

Python 从图像中获取颜色并表示它,python,python-3.x,opencv,Python,Python 3.x,Opencv,我想知道X颜色是否出现在图像中。在这种情况下,研究的颜色将为绿色,因此其RGB值为(0.255.0) 我应用以下代码: img=cv2.imread('img.jpg') L1=[0,255,0] 匹配=np.all(img==L1,轴=2) 结果=np.类零(img) 打印(result.any()) 结果[匹配]=[255,0,255] cv2.imwrite('resultado.jpg',result) 基本上: 我加载要分析的图像 我描述了我想要获得的RGB值 我检查此颜色(绿色)是

我想知道X颜色是否出现在图像中。在这种情况下,研究的颜色将为绿色,因此其RGB值为(0.255.0)

我应用以下代码:

img=cv2.imread('img.jpg')
L1=[0,255,0]
匹配=np.all(img==L1,轴=2)
结果=np.类零(img)
打印(result.any())
结果[匹配]=[255,0,255]
cv2.imwrite('resultado.jpg',result)
基本上:

  • 我加载要分析的图像
  • 我描述了我想要获得的RGB值
  • 我检查此颜色(绿色)是否出现在图像中
  • 我创建了一个我的尺寸完全为黑色的图像,并称之为 “结果”
  • 我通过屏幕显示颜色是否通过布尔值显示
  • 我在结果中画出了红色的绿色区域
  • 最后我坚持这最后一步
  • 下面是工作室的图片,然后是涂成红色的

    要学习的图像:

    结果:

    为什么盒子的颜色不是和绿色一样,而是红色?为什么只是那个小点


    谢谢大家!

    问题的原因是,绿色区域不是仅从
    [0,255,0]
    构建的,正如您所想,
    OT21t.jpg
    是您的输入图像,当我这样做时:

    import cv2
    img = cv2.imread('OT21t.jpg')
    print(img[950,1300])
    

    我得到了
    [22551]
    ,所以它不是
    [0255,0]
    。请记住,当保存
    .jpg
    图像时,通常是有损过程-部分数据可能会被丢弃,从而允许更小的文件大小(有关搜索
    有损压缩的详细信息,请参见)。

    以下是一个脚本,它可以满足您的需要,我也使用了numpy,因此它不会很难适应您的需要

    此脚本将找到一种颜色并替换为另一种颜色:

    import numpy
    from PIL import Image
    im = numpy.array(Image.open("/path/to/img.jpg"))
    
    tol = 4     # tolerence (0 if you want an exact match) 
    target_color = [0, 255, 0, 255]  # color to change
    replace_color = [255, 0, 255, 255]  # color to use to paint the zone
    for y, line in enumerate(im):
        for x, px in enumerate(line):
            if all((abs(px[i] - target_color[i]) < tol for i in range(3))):
                im[y][x] = replace_color
    Image.fromarray(im).save("./Desktop/img.png")
    
    导入numpy
    从PIL导入图像
    im=numpy.array(Image.open(“/path/to/img.jpg”))
    tol=4#公差(如果需要精确匹配,则为0)
    目标颜色=[0,255,0,255]#要更改的颜色
    替换_color=[255,0,255,255]#用于绘制分区的颜色
    对于y,枚举(im)中的行:
    对于枚举中的x,px(第行):
    如果所有((abs(px[i]-target_color[i])
    此款为黑色,仅与替换色匹配:

    import numpy
    from PIL import Image
    im = numpy.array(Image.open("/path/to/img.jpg"))
    new_im = numpy.zeros_like(im)
    
    tol = 4     # tolerence (0 if you want an exact match) 
    target_color = [0, 255, 0, 255]  # color to change
    replace_color = [255, 0, 255, 255]  # color to use to paint the zone
    for y, line in enumerate(im):
        for x, px in enumerate(line):
            if all((abs(px[i] - target_color[i]) < tol for i in range(3))):
                new_im[y][x] = replace_color
    Image.fromarray(new_im).save("./Desktop/img.png")
    
    导入numpy
    从PIL导入图像
    im=numpy.array(Image.open(“/path/to/img.jpg”))
    new_im=numpy.zero_like(im)
    tol=4#公差(如果需要精确匹配,则为0)
    目标颜色=[0,255,0,255]#要更改的颜色
    替换_color=[255,0,255,255]#用于绘制分区的颜色
    对于y,枚举(im)中的行:
    对于枚举中的x,px(第行):
    如果所有((abs(px[i]-target_color[i])

    脚本中缺少的是一些公差,因为您的绿色可能不是完美的绿色。

    我通常更适合使用“色调、饱和度和亮度”系统而不是RGB来分离图像中的颜色-请参阅

    所以你可以考虑这样的事情:

    #!/usr/local/bin/python3
    import numpy as np
    from PIL import Image
    
    # Open image and make RGB and HSV versions
    RGBim = Image.open("seaside.jpg")
    HSVim = RGBim.convert('HSV')
    
    # Make numpy versions
    RGBna = np.array(RGBim)
    HSVna = np.array(HSVim)
    
    # Extract Hue
    H = HSVna[:,:,0]
    
    # Find all green pixels, i.e. where 110 < Hue < 130
    lo,hi = 110,130
    # Rescale to 0-255, rather than 0-360 because we are using uint8
    lo = int((lo * 255) / 360)
    hi = int((hi * 255) / 360)
    green = np.where((H>lo) & (H<hi))
    
    # Make all green pixels red in original image
    RGBna[green] = [255,0,0]
    
    count = green[0].size
    print("Pixels matched: {}".format(count))
    Image.fromarray(RGBna).save('result.png')
    
    #/usr/local/bin/python3
    将numpy作为np导入
    从PIL导入图像
    #打开图像并制作RGB和HSV版本
    RGBim=Image.open(“seaside.jpg”)
    HSVim=RGBim.convert('HSV')
    #制作numpy版本
    RGBna=np.阵列(RGBim)
    HSVna=np.数组(HSVim)
    #提取色调
    H=HSVna[:,:,0]
    #查找所有绿色像素,即110<色调<130
    低,高=110130
    #重新缩放到0-255,而不是0-360,因为我们使用的是uint8
    lo=int((lo*255)/360)
    hi=int((hi*255)/360)
    绿色=np.其中((H>lo)和(H