给定一个图像(.tiff或geotiff文件),其中只有22种颜色(每种颜色具有不同的RGB值),将它们分离(“过滤”)到22个单独的图像中的方法是什么,每个图像仅包含那些像素特定的RGB值?
答案 0 :(得分:4)
这是一种按像素方式执行此操作,可以处理图像中的任意数量的颜色(尽管对于许多颜色和大图像可能会变慢)。它也适用于调色板图像(它会转换它们)。
import Image
def color_separator(im):
if im.getpalette():
im = im.convert('RGB')
colors = im.getcolors()
width, height = im.size
colors_dict = dict((val[1],Image.new('RGB', (width, height), (0,0,0)))
for val in colors)
pix = im.load()
for i in xrange(width):
for j in xrange(height):
colors_dict[pix[i,j]].putpixel((i,j), pix[i,j])
return colors_dict
im = Image.open("colorwheel.tiff")
colors_dict = color_separator(im)
#show the images:
colors_dict.popitem()[1].show()
colors_dict.popitem()[1].show()
im.getcolors()
会返回图像中所有颜色的列表及其出现的次数,作为元组,除非颜色数超过最大值(您可以指定,默认为256) )。colors_dict
,用图像中的颜色键入,并使用相应的空图像值。load()
来加快像素访问速度。color_separator()
返回图像字典,按图像中的每种独特颜色键入。为了加快速度,您可以对load()
中的每个图像使用colors_dict
,但是您可能需要小心一点,因为如果图像有很多颜色,它可能会占用大量内存大。如果这不是问题,那么添加(在创建colors_dict
之后):
fast_colors = dict((key, value.load()) for key, value in colors_dict.items())
并交换:
colors_dict[pix[j,i]].putpixel((j,i), pix[j,i])
有:
fast_colors[pix[j,i]][j,i] = pix[j,i]
22彩色图像:
22色分离图像:
{{ 0}}