繁体   English   中英

如何将多个图像叠加到特定坐标上的基本图像上?

[英]How to overlay multiple images onto a base image on certain coordinates?

【现在解决了。 我已经在我的问题底部发布了我更新的代码以供参考]。

我正在尝试在 Python 中创建一个程序,以自动将小图像叠加到大图像上以获得坐标列表。 我可以让它在一个小图像上的单个示例上工作到一个更大的图像上,但当我尝试多次重复时就不行了。 如果有人能指出我代码中的错误,我将不胜感激(我希望可能是非常基本的,我对 Python 没有信心)。

代码的目的是找到图像中最亮的点(在这种情况下是星域的图像),使用阈值、侵蚀、膨胀过程来隔离最亮/最大的恒星。 然后使用 findContours 函数,并在每个轮廓周围绘制一个矩形。 每个矩形的中心坐标被视为该星的像素坐标。 我试图然后使用这些坐标将较小的图像叠加到检测到明亮恒星的每个位置的基础图像上。 出于某种原因,它不起作用,我将非常感谢您的帮助,谢谢。

不幸的是,我尝试过的谷歌搜索和堆栈搜索都没有找到一些我可以模仿的代码,而且我自己也无法成功地编写代码。

这是我用来将单个图像叠加到基本图像上的代码,它可以正常工作:

import cv2
import numpy as np

fg_img = cv2.imread("image_small.png")
bg_img = cv2.imread("image_big.png")

cv2.imshow('small',fg_img)
cv2.imshow('big',bg_img)

h1, w1 = fg_img.shape[:2]
print (h1, w1)

pip_h = 10
pip_w = 10

bg_img[pip_h:pip_h+h1,pip_w:pip_w+w1] = fg_img

cv2.imshow('overlaid', bg_img)
cv2.waitKey(0)

这是我试图开始工作的代码:

import imutils
import cv2

fg_img = cv2.imread("image_small.png")
bg_img = cv2.imread("image_big.png")

graybg = cv2.cvtColor(bg_img, cv2.COLOR_BGR2GRAY)

h1, w1 = fg_img.shape[:2]
##print(h1, w1)

thresh = cv2.threshold(graybg, 225, 255, cv2.THRESH_BINARY)[1]
mask = thresh.copy()
mask = cv2.erode(mask, None, iterations=1)
mask2 = mask.copy()
mask2 = cv2.dilate(mask2, None, iterations = 2)
h2, w2 = mask2.shape[:2]
print(h2, w2)

cnts = cv2.findContours(mask2.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
output = mask2.copy()

for c in cnts:
        x,y,w,h = cv2.boundingRect(c)
        print(x,y)
        pip_h = y 
        pip_w = x 
        mask2[pip_h:pip_h+h1,pip_w:pip_w+w1] = fg_img
        cv2.imshow("Contours", output)

cv2.waitKey(0)

我在运行上面复制的第二个程序时收到的错误消息是:“ValueError:无法将输入数组从形状 (82,70,3) 广播到形状 (11,70)”。 作为参考,82x70 是较小图像的分辨率,大图像的分辨率实际上是 1920x1080...

再次感谢您的阅读,我希望错误很容易解决。 谢谢

更正的代码:

import imutils
import cv2

fg_img = cv2.imread("image_small.png")
bg_img = cv2.imread("image_big.png")

graybg = cv2.cvtColor(bg_img, cv2.COLOR_BGR2GRAY)

h1, w1 = fg_img.shape[:2]
print(h1, w1)

thresh = cv2.threshold(graybg, 225, 255, cv2.THRESH_BINARY)[1]
mask = thresh.copy()
mask = cv2.erode(mask, None, iterations=1)
mask2 = mask.copy()
mask2 = cv2.dilate(mask2, None, iterations = 2)
h2, w2 = mask2.shape[:2]
print(h2, w2)

cnts = cv2.findContours(mask2.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)

for c in cnts:
        x,y,w,h = cv2.boundingRect(c)
        pip_h = y 
        pip_w = x
        print(pip_h, pip_w)

        if h2 - pip_h > h1 + 1 and w2 - pip_w > w1 + 1:
                bg_img[pip_h:pip_h+h1,pip_w:pip_w+w1] = fg_img

        cv2.imshow("Contours", bg_img)

cv2.waitKey(0)

您的代码的问题在于,在 for 循环内:

x,y,w,h = cv2.boundingRect(c)

如果pip_h=y接近原图高度h2 ,则切片操作

mask2[pip_h:pip_h+h1]

只会给你h2 - pip_h行。 作为一个极端,想想当pip_h=h2时会发生什么。

总之,克隆操作

mask2[pip_h:pip_h+h1,pip_w:pip_w+w1] = fg_img

由于上述原因,当h2 - pip_h < h1w2 - pip_w < w1时失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM