为二维16位图像数组添加透明标识python openCV2
Add transparent logo to 2D 16bit image array python openCV2
我正在尝试将透明徽标添加到现有图像阵列。它工作正常,只是我失去了透明度并且它被替换为黑色。我认为调整图像大小时会发生这种情况。这是我的代码:
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,但我不适用于我的上下文,因为除了添加徽标外,原始数组形状或数据没有改变非常重要。
这是我得到的图像的一部分:但我不需要黑色背景,因为原始徽标是透明的。抱歉不得不剪掉徽标!
如果有帮助,这里是传递给 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)
非常感谢任何想法。 :)
您的问题有点棘手,因为您还需要加载透明度并且希望它是灰度的,但这并不难。
首先将图像加载为带 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 的任何像素)
我无法测试它,因为我在另一台电脑上,所以我希望我没有遗漏任何东西。如果您有任何疑问,请给我留言
我正在尝试将透明徽标添加到现有图像阵列。它工作正常,只是我失去了透明度并且它被替换为黑色。我认为调整图像大小时会发生这种情况。这是我的代码:
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,但我不适用于我的上下文,因为除了添加徽标外,原始数组形状或数据没有改变非常重要。
这是我得到的图像的一部分:但我不需要黑色背景,因为原始徽标是透明的。抱歉不得不剪掉徽标!
如果有帮助,这里是传递给 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)
非常感谢任何想法。 :)
您的问题有点棘手,因为您还需要加载透明度并且希望它是灰度的,但这并不难。
首先将图像加载为带 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 的任何像素)
我无法测试它,因为我在另一台电脑上,所以我希望我没有遗漏任何东西。如果您有任何疑问,请给我留言