我有一个图像(使用img = ImageGrab.grab( box )
得到)并且我希望用白色替换某个RGB值的所有像素(精确地为rgb(74,38,63)),其余的用黑色替换。
问题是图像是RGB格式的,如果它是在单个波段中(正如我之前在程序中那样)我可以使用:img2 = img.point (lambda i: i>254 and 255);
但这不适用于rgb图像, img.point中的i
似乎不是3个整数的元组(正如我希望的那样)它只是数字0到255(如果我没有在某个地方弄乱的话)。
请注意,我不想使用.getpixel()
方法,因为它对我想做的事情来说太慢了。
我的问题的一个替代方案是使用img.load()然后自己处理像素矩阵,但我不知道这是多么有效。
答案 0 :(得分:0)
Numpy适用于广义快速和特定像素操作。这是一个例子:
import Image
import numpy as np
import matplotlib.pyplot as plt
im = Image.open("python.jpg")
a = np.asarray(im)
b = np.where(np.all(((a>[240, 40, 20]) * (a<=[255, 255, 150])), axis=2, keepdims=True), [80,0,0], [0,0,90])
plt.figure()
plt.subplot(1,2,1)
plt.imshow(a)
plt.subplot(1,2,2)
plt.imshow(b)
plt.show()
这里我转换了一系列像素值而不是单个值。要执行单个值,请删除使用==
而不是>
,并仅使用一个条件。另外,我使用matplotlib以简单的方式显示输出和输入,但您也可以使用Image.fromarray(b.astype(np.uint8))
转换回图像。
如果您想要应用一些简单的标准过滤器或使用本地getpixel
操作,保持纯PIL将正常工作,但对于图像,numpy或图像处理包的大多数数字工作是可行的方法。