如何将透明区域引入Numpy图像阵列?

时间:2018-03-11 00:00:26

标签: python numpy transparency image-segmentation alpha-transparency

加载输入图像:

target_img = spi.imread(target_img, mode="RGB").astype(float)/256
source_img = spi.imread(source_img, mode="RGB").astype(float)/256
target_mask = spi.imread(target_mask, mode="RGB").astype(float)
source_mask = spi.imread(source_mask, mode="RGB").astype(float)

设置了一些变量:

target_mask_list = []
source_mask_list = []
mask_list = []
i = 0
matched_piece = None

我使用蒙版图像提取目标和源图像的蒙版区域:

for color in list(color_list):
    print(color)
    #Get Target Mask Regions
    target_color_mask = extract_mask(target_mask, color)
    masked_target = np.where(target_color_mask[...,None], target_img, 0)
    #imsave(output_name, image_mask)
    target_mask_list.append(masked_target)
    #Get Source Mask Regions
    source_color_mask = extract_mask(source_mask, color)
    masked_source = np.where(source_color_mask[...,None], source_img, 0)
    source_mask_list.append(masked_source)

目前"未选择"区域全部为黑色或全白色,具体取决于我使用0还是1 np.where。 "未选择"区域的不透明度为零,因此我无法正确地对这些图像进行分层。

然后我通过颜色传递函数运行蒙版:

    # Perform Color Transfer
    matched_mask = match_color(masked_target, masked_source, mode='pca', eps=1e-5)
    mask_list.append(matched_mask)
    if i == 0: 
        matched_piece = np.where(target_color_mask[...,None], matched_mask, 0)
    else: 
        matched_piece = matched_piece + np.where(target_color_mask[...,None], matched_mask, 0)
    i = i + 1  

生成的保存图像完全是黑色的:

masked = matched_piece
imsave(output_name, masked)

当我使用GIMP使target_imgsource_img具有透明部分时,我可以通过颜色传递功能成功运行这些图像,以便在非透明区域之间传输颜色。然后,我可以手动裁剪生成的先前透明部分,以便我有彩色输出图像。

如何使我的代码更像是手动GIMP步骤?

编辑:

extract_mask函数从以下位置返回一个布尔数组:

   def extract_mask(image, color_list):
       mask = None
       if color == 'green':
           mask = np.all(image == (0,255,0), axis=-1).astype(int)   
       elif color == 'black': 
           mask = np.all(image == (0,0,0), axis=-1).astype(int)
       elif color == 'white':
           mask = np.all(image == (255,255,255), axis=-1).astype(int)
       elif color == 'red':
           mask = np.all(image == (255,0,0), axis=-1).astype(int)
       elif color == 'blue':
           mask = np.all(image == (0,0,255), axis=-1).astype(int)
       elif color == 'yellow':
           mask = np.all(image == (255,255,0), axis=-1).astype(int)
       elif color == 'grey':
           mask = np.all(image == (128,128,128), axis=-1).astype(int)
       elif color == 'lightblue':
           mask = np.all(image == (0,255,255), axis=-1).astype(int)
       elif color == 'purple':
           mask = np.all(image == (255,0,255), axis=-1).astype(int)
       else: 
           print "Color not recognized"
       return mask 

0 个答案:

没有答案