将一个单通道的骨架图像叠加到一个三通道的RGB图像上

3

我想在一个三通道的RGB图像上添加一个带有骨架像素值为255(白色)的黑白骨架图像。我并不倾向于使用OpenCV,但是当我使用加法函数时,我收到了形状不兼容的错误提示。

如何实现这个功能呢?

import cv2
skl_img = cv2.imread("sample_skeleton_image/579366_2_train2017_skel.png", 0) 
print(skl_img.shape)
plt.imshow(skl_img)

224x400

enter image description here

obj_img = cv2.imread("/content/drive/Shareddrives/Wish 2021/Code/sample_skeleton_image/579366_2_train2017.jpg", cv2.IMREAD_COLOR)
plt.imshow(obj_img)

obj_img 的形状为 224x400x3

enter image description here

final_img = cv2.add(obj_img,skl_img)
plt.imshow(final_img)

error                                     Traceback (most recent call last)
<ipython-input-27-7de7a4136982> in <module>()
----> 1 final_img = cv2.add(obj_img,skl_img)
      2 plt.imshow(final_img)

error: OpenCV(4.1.2) /io/opencv/modules/core/src/arithm.cpp:663: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function 'arithm_op'

基本上,我对最终呈现如下所示的图像感兴趣: enter image description here


3
你可以先将骨架图像转换为RGB格式,然后再进行添加。 - beaker
2个回答

5
以下是在Python中将掩模应用到图像的其他几种方法。
输入: enter image description here 掩模: enter image description here
import cv2
import numpy as np

# read image
img = cv2.imread('elephant_trunk.png')

# read mask as grayscale
mask = cv2.imread('elephant_trunk_skeleton.png', cv2.IMREAD_GRAYSCALE)

# Method 1: Numpy masking
result1 = img.copy()
result1[mask!=0] = (255,255,255)

# Method 2: Merge mask to 3 channels
mask2 = cv2.merge([mask,mask,mask])
result2 = cv2.add(img, mask2)

# Method 3: Convert mask to BGR
mask3 = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
result3 = cv2.add(img, mask3)

# save result
cv2.imwrite("elephant_trunk_masked.png", result1)

# show result
cv2.imshow("RESULT1", result1)
cv2.imshow("RESULT2", result2)
cv2.imshow("RESULT3", result3)
cv2.waitKey(0)

结果:

这里输入图片描述


3

读取1通道骨架图像并将它们堆叠在一起以创建3通道的骨架图像,并使用cv2中的加法函数。

skl_img = cv2.imread("sample_skeleton_image/579366_2_train2017_skel.png", 0) 

obj_img = cv2.imread("/content/drive/Shareddrives/Wish 2021/Code/sample_skeleton_image/579366_2_train2017.jpg", cv2.IMREAD_COLOR)

c3_skel = np.zeros_like(obj_img)
c3_skel[:,:,0] = skl_img
c3_skel[:,:,1] = skl_img
c3_skel[:,:,2] = skl_img
plt.imshow(c3_skel)

enter image description here

final_img = cv2.add(obj_img, c3_skel)
plt.imshow(final_img)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接