加载输入图像:
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_img
或source_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