图像处理应用-利用二值化图像

利用掩膜(mask)给原图像添加彩色水印

Posted by MakeSail on November 20, 2019

利用掩膜(mask)给原图像添加彩色水印

最近在做深度学习的毕业设计,遇到了利用掩膜给原图像添加彩色透明水印的需求。

利用百度、google搜索半天,效果与自己想要基本都不同,无奈还是自己写了一个轮子。

仅供大家参考,如果有更好的实现方法,请告诉一下小弟。

要做的是什么?

先说自己的需求是什么。

在做皮肤镜病变属性识别时,输入一张病变图像,会得到6张对应的识别结果。

下图为输入图像。

输入该图像会得到以下类似五种对应图像的mask

而我们的目标就是利用这六张图片生成下面这张图。

如何做的

一开始我也考虑使用Image.blend、这一系列API,但是这有一个问题。所有API都会逐像素处理。而我们关心的地方只有mask图像中的白色部分。

故自己写了如下函数。



attr_colors = {
    'pigment_network': (0, 107, 176),
    'negative_network': (239, 169, 13),
    'streaks': (29, 24, 21),
    'milia_like_cyst': (5, 147, 65),
    'globules': (220, 47, 31)
}

def put_predict_image(origin_image_np, test_mask, attr, alpha):
    '''
    将predict图片以apha透明度覆盖到origin图片中
    :param origin_image:
    :param predict_image:
    :param RGB:
    :param alpha:
    :return:
    '''
    test_mask_RGB = Image.fromarray(test_mask.astype('uint8')).convert("RGB") # 将原始二值化图像转换成RGB

    test_mask_np = np.asarray(test_mask_RGB,dtype=np.int) # 将二值化图像转换成三维数组
    height, width, channels = test_mask_np.shape  # 获得图片的三个纬度
    # 转换预测图像的颜色
    origin_image_np.flags.writeable=True
    test_mask_np.flags.writeable = True
    for row in range(height):
        for col in range(width):
            # 上色,这里将mask图像中白色部分转换为我们想要的颜色,
            if test_mask_np[row, col, 0] == 255 and test_mask_np[row, col, 1] == 255 and test_mask_np[row, col, 2] == 255:
                test_mask_np[row, col, 0] = attr_colors[attr][0]
                test_mask_np[row, col, 1] = attr_colors[attr][1]
                test_mask_np[row, col, 2] = attr_colors[attr][2]
            # 这里对我们关心的白色区域,将这一步分像素按照比例相加。
            if test_mask_np[row, col, 0] != 0 or test_mask_np[row,col, 1] != 0 or test_mask_np[row, col, 2] != 0:
                origin_image_np[row,col,0] = alpha*origin_image_np[row,col,0] + (1-alpha)*test_mask_np[row, col, 0]
                origin_image_np[row,col,1] = alpha*origin_image_np[row,col,1] + (1-alpha)*test_mask_np[row, col, 1]
                origin_image_np[row,col,2] = alpha*origin_image_np[row,col,2] + (1-alpha)*test_mask_np[row, col, 2]
    return origin_image_np