从调色板图像中获取RGB颜色并应用于二值图像

时间:2017-08-05 14:49:11

标签: python numpy image-processing scikit-image

我有一个像this one这样的调色板图像和一个numpy数组中的二值化图像,例如像这样的正方形:

img = np.zeros((100,100), dtype=np.bool)
img[25:75,25:75] = 1

(当然,真实的图像更复杂。)

我想做以下事情:

  1. 从调色板图像中提取所有RGB颜色。

  2. 对于每种颜色,请使用透明背景保存该颜色的img副本。

  3. 到目前为止,我的代码(见下文)可以将img保存为具有透明背景的黑色对象。我正在努力的是提取RGB颜色的好方法,这样我就可以将它们应用到图像中。

    # Create an MxNx4 array (RGBA)
    img_rgba = np.zeros((img.shape[0], img.shape[1], 4), dtype=np.bool)
    
    # Fill R, G and B with inverted copies of the image
    # Note: This creates a black object; instead of this, I need the colors from the palette.
    for c in range(3):
        img_rgba[:,:,c] = ~img
    
    # For alpha just use the image again (makes background transparent)
    img_rgba[:,:,3] = img
    
    # Save image
    imsave('img.png', img_rgba) 
    

1 个答案:

答案 0 :(得分:1)

您可以使用reshapenp.unique的组合来从调色板图像中提取唯一的RGB值:

# Load the color palette
from skimage import io
palette = io.imread(os.path.join(os.getcwd(), 'color_palette.png'))

# Use `np.unique` following a reshape to get the RGB values
palette = palette.reshape(palette.shape[0]*palette.shape[1], palette.shape[2])
palette_colors = np.unique(palette, axis=0)

(请注意,axis的{​​{1}}参数已添加到numpy版本np.unique中,因此您可能需要升级numpy以使其正常工作。)

拥有1.13.0之后,您几乎可以使用已有的代码保存图片,但现在添加不同的RGB值而不是palette_colors的{​​{1}}副本到~img } array。

img_rgba

(请注意,您需要使用for p in range(palette_colors.shape[0]): # Create an MxNx4 array (RGBA) img_rgba = np.zeros((img.shape[0], img.shape[1], 4), dtype=np.uint8) # Fill R, G and B with appropriate colors for c in range(3): img_rgba[:,:,c] = img.astype(np.uint8) * palette_colors[p,c] # For alpha just use the image again (makes background transparent) img_rgba[:,:,3] = img.astype(np.uint8) * 255 # Save image imsave('img_col'+str(p)+'.png', img_rgba) 作为图像的数据类型,因为二进制图像显然不能代表不同的颜色。)