【问题标题】:Copy cut out of an image to a new image using Numpy or OpenCV使用 Numpy 或 OpenCV 将图像的剪切复制到新图像
【发布时间】:2021-04-22 17:14:31
【问题描述】:

是否可以在 python 中使用 OpenCV 或 Numpy 从图像中仅复制特定区域并将其粘贴到另一个图像?

假设我有一个 RGB 图像和一个图像的灰度蒙版。 (两者大小相同)

是否可以仅将蒙版的像素与新图像的特定部分重叠的位置复制船?

这是我试过的代码。

image1 = cv2.imread("boat.png")
mask = cv2.imread("boat_mask.png")
image2 = cv2.imread("sea.png")
width, height = image1.shape
image2[y:y+height,x:x+width] = image1[mask==255]

这不起作用,因为 image1[mask==255] 不再具有 2d 形状。

解决方案:

image2_cutout = image2[y:y+height,x:x+width]
image2_cutout[mask==255] = image1[mask==255]
image2[y:y+height,x:x+width] = image2_cutout

【问题讨论】:

  • 没错,image1[mask==255] 会生成一个平面数组,但只要它与复制到的视图具有相同数量的单元格,它应该可以工作。但它只会以 C 顺序将单元格写入视图。我建议您先获取一个视图,然后使用 image2_view[mask==255] = image1[mask255] 之类的掩码对其进行索引。这将同步位置
  • 好主意!如果我同步位置,它会起作用。谢谢!
  • 如果您对透明度感兴趣,而不是简单的蒙版:github.com/opencv/opencv/issues/20780

标签: python numpy opencv


【解决方案1】:

这里是:

import cv2


image1 = cv2.imread("data/boat.png")
_, mask = cv2.threshold(cv2.cvtColor(cv2.imread("data/masked_boat.png"), cv2.COLOR_BGR2GRAY), 120, 255, cv2.THRESH_BINARY)
image2 = cv2.imread("data/sea.jpg")
width, height, _ = image1.shape
y = 300
x = 300

masked_normalized = cv2.bitwise_and(image1, image1, mask=mask)

cut_from_bg = image2[x:x+width, y:y+height]
img1_bg = cv2.bitwise_and(cut_from_bg, cut_from_bg, mask=cv2.bitwise_not(mask))

dst = cv2.add(img1_bg, masked_normalized)

image2[x:width + x, y:height + y] = dst
cv2.imshow("sea_with_boat", image2)

cv2.waitKey(0)
cv2.destroyAllWindows()

我在这里做的第一件事是拍摄mask 的船,并使用cv2.bitwise_and 得到船的真实蒙版图像。然后我在我想放置船的地方切出一部分海,并在此处切出船的形状。然后我使用cv2.add将蒙面的船图像和切割的海图像结合起来,然后我将这部分图像放在海的原始图像上。

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多