我有stanrd 52游戏卡的图片。其中一些是黑色的,一些是红色的。已经对神经网络进行了训练以正确识别它们。现在事实证明,有时使用绿色而不是红色。这就是为什么我想将所有绿色(ish)的图像转换为红色(ish)。如果它们是黑色或红色的,它们不应该被改变太多或根本不可能。
实现这一目标的最佳方式是什么?
答案 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')
或者,您也可以通过颜色矩阵乘法来做同样的事情:
#!/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。这是各种可能性的动画:
如果仍使用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
示例运行 -
输入图片:
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")
输出 -