将绿色转换为红色

时间:2017-10-12 12:56:50

标签: python filter colors python-imaging-library

我有stanrd 52游戏卡的图片。其中一些是黑色的,一些是红色的。已经对神经网络进行了训练以正确识别它们。现在事实证明,有时使用绿色而不是红色。这就是为什么我想将所有绿色(ish)的图像转换为红色(ish)。如果它们是黑色或红色的,它们不应该被改变太多或根本不可能。

实现这一目标的最佳方式是什么?

enter image description here

2 个答案:

答案 0 :(得分:2)

最简单的方法,恕我直言,是将图像分成其组成的R,G和B通道,然后以“错误” 顺序重新组合它们:

#!/usr/bin/env python3

from PIL import Image

# Open image
im = Image.open('cards.jpg')

# Split into component channels
R, G, B = im.split()

# Recombine, but swapping order of red and green
result = Image.merge('RGB',[G,R,B])

# Save result   
result.save('result.jpg')

enter image description here


或者,您也可以通过颜色矩阵乘法来做同样的事情:

#!/usr/bin/env python3

from PIL import Image

# Open image
im = Image.open('cards.jpg')

# Define color matrix to swap the green and red channels
# This says:
# New red   = 0*old red + 1*old green + 0*old blue + 0offset
# New green = 1*old red + 0*old green + 0*old blue + 0offset
# New blue  = 1*old red + 0*old green + 1*old blue + 0offset
Matrix = ( 0, 1, 0, 0,
           1, 0, 0, 0,
           0, 0, 1, 0)

# Apply matrix
result = im.convert("RGB", Matrix)
result.save('result.jpg')

或者,您可以在终端中使用 ImageMagick 将图像separate分成其组成的R,G和B通道,swap红色和绿色通道并像这样重组:

magick cards.jpg -separate -swap 0,1 -combine result.png

或者,您可以使用 ImageMagick 来执行“色相旋转” 。基本上,您可以将图像转换为HSL colourspace并旋转色相,而饱和度和亮度不会受到影响。这使您可以灵活地制作几乎所需的任何颜色。您可以在终端中执行以下操作:

magick cards.jpg -modulate 100,100,200 result.jpg

上面的200是有趣的参数-请参见文档here。这是各种可能性的动画:

enter image description here

如果仍使用v6 ImageMagick ,请在所有命令中将magick替换为convert

关键字:Python,图像处理,色相旋转,通道交换,卡片,主要,交换通道,PIL,枕头,ImageMagick。

答案 1 :(得分:1)

这是一种使用容差值决定-ish因子来设置数学符号的方法 -

def set_image(a, tol=100): #tol - tolerance to decides on the "-ish" factor

    # define colors to be worked upon
    colors = np.array([[255,0,0],[0,255,0],[0,0,0],[255,255,255]])

    # Mask of all elements that are closest to one of the colors
    mask0 = np.isclose(a, colors[:,None,None,:], atol=tol).all(-1)

    # Select the valid elements for edit. Sets all nearish colors to exact ones
    out = np.where(mask0.any(0)[...,None], colors[mask0.argmax(0)], a)

    # Finally set all green to red
    out[(out == colors[1]).all(-1)] = colors[0]
    return out.astype(np.uint8)

更节省内存的方法是循环使用这些选择性颜色,如此 -

def set_image_v2(a, tol=100): #tol - tolerance to decides on the "-ish" factor

    # define colors to be worked upon
    colors = np.array([[255,0,0],[0,255,0],[0,0,0],[255,255,255]])

    out = a.copy()
    for c in colors:
        out[np.isclose(out, c, atol=tol).all(-1)] = c

    # Finally set all green to red
    out[(out == colors[1]).all(-1)] = colors[0]
    return out

示例运行 -

输入图片:

enter image description here

from PIL import Image
img = Image.open('green.png').convert('RGB')
x = np.array(img)
y = set_image(x) 
z = Image.fromarray(y, 'RGB')
z.save("tmp.png")

输出 -

enter image description here