执行此操作的最佳方法是使用Gimp中使用的“用于alpha的颜色”算法替换颜色。它会适用于你的情况。我使用PIL为一个开源的python照片处理器phatch重新实现了这个算法。你可以找到完整的实现here。这是一个纯粹的PIL实现,它没有其他依赖。您可以复制功能代码并使用它。下面是使用GIMP之类的样本:
到
可以使用黑色作为颜色应用在图像上color_to_alpha
功能。然后将图像粘贴到不同的背景颜色上进行替换。
顺便说一句,这个实现使用了PIL中的ImageMath模块。它比使用getdata访问像素更有效率。
编辑:这里是全码:
from PIL import Image, ImageMath
def difference1(source, color):
"""When source is bigger than color"""
return (source - color)/(255.0 - color)
def difference2(source, color):
"""When color is bigger than source"""
return (color - source)/color
def color_to_alpha(image, color=None):
image = image.convert('RGBA')
width, height = image.size
color = map(float, color)
img_bands = [band.convert("F") for band in image.split()]
# Find the maximum difference rate between source and color. I had to use two
# difference functions because ImageMath.eval only evaluates the expression
# once.
alpha = ImageMath.eval(
"""float(
max(
max(
max(
difference1(red_band, cred_band),
difference1(green_band, cgreen_band)
),
difference1(blue_band, cblue_band)
),
max(
max(
difference2(red_band, cred_band),
difference2(green_band, cgreen_band)
),
difference2(blue_band, cblue_band)
)
)
)""",
difference1=difference1,
difference2=difference2,
red_band = img_bands[0],
green_band = img_bands[1],
blue_band = img_bands[2],
cred_band = color[0],
cgreen_band = color[1],
cblue_band = color[2]
)
# Calculate the new image colors after the removal of the selected color
new_bands = [
ImageMath.eval(
"convert((image - color)/alpha + color, 'L')",
image = img_bands[i],
color = color[i],
alpha = alpha
)
for i in xrange(3)
]
# Add the new alpha band
new_bands.append(ImageMath.eval(
"convert(alpha_band * alpha, 'L')",
alpha = alpha,
alpha_band = img_bands[3]
))
return Image.merge('RGBA', new_bands)
image = color_to_alpha(image, (0, 0, 0, 255))
background = Image.new('RGB', image.size, (255, 255, 255))
background.paste(image.convert('RGB'), mask=image)
我试图让这个工作,但它说,没有模块命名为核心之类的东西,那只是一团糟。我可能是一个白痴,但我无法让它工作。无论如何,我确定你的答案会帮助其他人。 – Cookies 2009-10-24 16:41:25
你不应该尝试运行整个文件。只需复制color_to_alpha函数本身。无论如何,我很高兴你找到了适合你的解决方案。如果你需要更高效的解决方案,你知道在哪里看;) – 2009-10-24 18:10:06
我做了,它首先说全局名称'OPTIONS'没有定义,所以我复制了那部分,然后它说_t没有定义,但它是我没有的模块。这就是我的意思,我试图让它工作,但不能,下面建议的方法对我来说工作是可以的,但如果你的功能可以真的把图像中的所有背景像素都拿出来,那会很棒。还有一些左派混淆了tesseract。 – Cookies 2009-10-24 22:10:25