给定具有恰好 22 种颜色的图像(.tiff 或 geotiff 文件)(每种颜色具有不同的 RGB 值),将它们分离(“过滤”)成 22 个单独图像的方法是什么,每个图像仅包含具有特定 RGB 的那些像素价值?
问问题
3057 次
1 回答
5
这是一种按像素计算的方法,它可以适用于图像中的任意数量的颜色(尽管对于许多颜色和大图像来说它可能会变慢)。它也适用于调色板图像(它转换它们)。
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 色隔离图像:
于 2012-04-06T13:54:54.283 回答