将透明徽标添加到2D 16bit图像阵列python openCV2

时间:2019-02-19 14:32:58

标签: python-3.x opencv cv2

我正在尝试将透明徽标添加到现有图像阵列。它工作正常,但我失去了透明度,并被替换为黑色。我认为在调整图像大小时会发生这种情况。这是我的代码:

import cv2
import numpy as np

def add_logo(array):

    logo = cv2.imread("resources/logo/logo.png", 0)
    logo = np.array(logo, dtype=np.uint16)
    logo *= 256
    scale_percent = 
    width = int(logo.shape[1] * scale_percent / 100)
    height = int(logo.shape[0] * scale_percent / 100)
    dim = (width, height)
    logo = cv2.resize(logo, dim, interpolation = cv2.INTER_AREA)
    #cv2.imwrite('02.png',logo)
    print(array.shape, logo.shape)
    x_offset = y_offset = 50
    array[y_offset:y_offset+logo.shape[0],
                x_offset:x_offset+logo.shape[1]] = logo

    return array


imgs = get_images_from_xxxx()
edited = add_logo(imgs[0])
cv2.imwrite('01.png',edited)

我也尝试过此solution,但是我不适用于我的上下文,因为除了添加徽标之外,不要更改原始数组的形状或数据非常重要。

这是我得到的图像的一部分:但是我不需要黑色背景,因为原始徽标是透明的。抱歉,必须裁剪徽标!

output

如果有帮助,这是传递给add_logo的数组的打印件,它是一个numpy数组:

[[3505 3514 3606 ... 4622 4781    0]
 [3566 3507 3503 ... 4587 4386    0]
 [3522 3503 3453 ... 4584 4434    0]
 ...
 [3435 3428 3428 ... 3721 3779    0]
 [3451 3418 3455 ... 3829 3877    0]
 [   0    0    0 ...    0    0    0]]

print(array.shape, logo.shape)的输出:

(1721, 912) (378, 304)

任何想法都会受到赞赏。 :)

1 个答案:

答案 0 :(得分:1)

您的问题有点棘手,因为您还需要加载透明度,并且希望以灰度为单位,但这并不困难。

首先将图像加载为带有Alpha色的图像

logo = cv2.imread("resources/logo/logo.png", cv2.IMREAD_UNCHANGED)

然后转换为灰色并使用Alpha作为蒙版(任何透明值为0否则为255)

logoGrey = cv2.cvtColor(logo[:,:,0:3], cv2.COLOR_BGR2GRAY)
mask = logo[:,:,3]
# here goes your changes to logoGrey which is equivalent logo in your code

现在,您同时拥有这两个副本:

maskIdx = (mask != 0)
array[y_offset:y_offset+logo.shape[0],
            x_offset:x_offset+logo.shape[1]][maskIdx] = logoGrey[maskIdx] 

这只能复制蒙版中固定的像素(或基本上不是0的任何像素)

由于我在另一台计算机上,所以我无法测试它,所以我希望我不会错过任何东西。如果您有任何疑问,请给我留言