1

给定具有恰好 22 种颜色的图像(.tiff 或 geotiff 文件)(每种颜色具有不同的 RGB 值),将它们分离(“过滤”)成 22 个单独图像的方法是什么,每个图像仅包含具有特定 RGB 的那些像素价值?

4

1 回答 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()
  1. 调用im.getcolors()返回图像中所有颜色的列表以及它们出现的次数,作为一个元组,除非颜色的数量超过最大值(您可以指定,默认为 256)。
  2. 然后我们构建一个字典colors_dict,以图像中的颜色为键,并带有相应的空图像值。
  3. 然后我们遍历图像的所有像素,为每个像素更新适当的字典条目。这样做意味着我们只需要读取图像一次。load()当我们阅读图像时,我们习惯于使像素访问更快。
  4. 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 回答