PIL?提取给定RGB值的所有像素

时间:2011-12-28 00:39:54

标签: python-imaging-library gdal

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

1 个答案:

答案 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()
  1. 调用im.getcolors()会返回图像中所有颜色的列表及其出现的次数,作为元组,除非颜色数超过最大值(您可以指定,默认为256) )。
  2. 然后我们构建一个字典colors_dict,用图像中的颜色键入,并使用相应的空图像值。
  3. 然后,我们遍历所有像素的图像,更新每个像素的相应字典条目。这样做意味着我们只需要阅读一次图像。我们在阅读图片时使用load()来加快像素访问速度。
  4. color_separator()返回图像字典,按图像中的每种独特颜色键入。
  5. 为了加快速度,您可以对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彩色图像:enter image description here

    22色分离图像:

    enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here {{ 0}} enter image description here enter image description here enter image description here  enter image description here enter image description here enter image description here enter image description here enter image description here  enter image description here enter image description here enter image description here enter image description here