【问题标题】:Possible solutions to process two images into one [closed]将两个图像处理为一张的可能解决方案[关闭]
【发布时间】:2022-08-24 02:48:13
【问题描述】:

嗨,我是计算视觉的新手,我目前遇到了这个问题。我有 2 个组件(一个是 RGB 分类,另一个是 IR),我希望它们与小不透明度重叠。问题是镜头的尺寸不同,缩放/角度略有不同,因此对较小的镜头进行简单调整不会将组件放在正确的位置。我可以使用 Inkscape 之类的程序来实现它,但我希望它是自动的,因为有更多的图片和集合也可能来自不同的角度。 这是图片和我想要实现的目标: RGB shotIR shotfinal merged。我会很感激这个问题的可能解决方案,因为我是新手,我很难选择要走的路,而且我不确定是否有任何程序可以解决红外镜头质量差的问题。感谢您提供可能的帮助。

  • 如果您使用 OpenCV,请搜索 cv2.addWeighted()。您可以确定需要合并的图像的不透明度。但是由于尺寸不同,您必须弄清楚重叠图像的位置
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如它目前所写的那样,很难准确地说出你在问什么。
  • @JeruLuke 是的,很抱歉用词不当。这正是我正在寻找的答案或可能的解决方案。我不确定哪些技术能够在两张图片中实现该组件将被对齐。或者至少我认为这将是最困难的部分,调整图片大小不会有那么大的问题,但我可能错了。
  • 单纯的构图是这一切中最微不足道的部分。您仍然需要至少调整大小来缩放图像。然后你需要估计(摆弄)位置和比例等参数。如果您不想根据结果的样子来调整数字,您可以应用特征匹配,但在不同的模态(颜色与 IR)之间,这些特征匹配得非常差。

标签: python opencv computer-vision


【解决方案1】:

正如耶鲁路加所说

您将不得不弄清楚重叠图像的位置 到不同大小

#!/usr/bin/env python3.9.2
#OpenCV 4.5.5, Raspberry pi3B/+, 4b/4g/8g 
#Date: 26th April, 2022

import cv2
import numpy as np

img1 = cv2.imread('shot.png')
overlay_img1 = np.ones(img1.shape,np.uint8)*255

img2 = cv2.imread('shot1.png')
rows,cols,channels = img2.shape
overlay_img1[450:rows+450, 450:cols+450 ] = img2

img2gray = cv2.cvtColor(overlay_img1,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray,220,55,cv2.THRESH_BINARY_INV)
mask_inv = cv2.bitwise_not(mask)
temp1 = cv2.bitwise_and(img1,img1,mask = mask_inv)
temp2 = cv2.bitwise_and(overlay_img1,overlay_img1, mask = mask)

result = cv2.add(temp1,temp2)
cv2.imshow("Result",result)
cv2.imwrite("Result.jpg",result)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:您在 shot1 叠加层中看到的内容越来越小。

【讨论】:

    【解决方案2】:

    编辑:我不明白你的问题。好的。我无法进一步解决,因为您是从智能手机拍摄的。所以没有叠加。所以这里是源代码:

    #!/usr/bin/env python3.9.2
    #OpenCV 4.5.5, Raspberry pi3B/+, 4b/4g/8g 
    #Date: 29th April, 2022
    
    
    import cv2
    import numpy as np
    
    img1 = cv2.imread('RGB_shot.png')
    img2 = cv2.imread('IR_shot.png')
    
    # I want to put logo on top-left corner, So I create a ROI
    rows,cols,channels = img2.shape
    
    roi = img1[0:rows, 0:cols]
    
    # Now create a mask of logo and create its inverse mask also
    img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
    mask_inv = cv2.bitwise_not(mask)
    
    # Now black-out the area of logo in ROI
    img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
    
    # Take only region of logo from logo image.
    img2_fg = cv2.bitwise_and(img2, img2, mask=mask)
    
    # Put logo in ROI and modify the main image
    dst = cv2.add(img1_bg, img2_fg)
    img1[15:rows+15, 15:cols+15] = dst
    cv2.imwrite('photo.png', img1)
    cv2.imshow('res', img1)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    更宽的 IR_shot 的输出:

    这是输出结果:

    那是你想要的方式吗?

    【讨论】:

    • 谢谢,但问题实际上在于红外图像 HTML <img src="i.imgur.com/OdhgYWj.png"> 中只有这一部分是组件(我目前在手机上,所以无法更好地标记它)
    • 你想覆盖面包板而不是覆盖层吗?
    • 我想实现 IR 镜头将位于 RGB 单一(或其他方式)之上,并且您可以清楚地看到哪些部分过热(在 IR 镜头中,有一个东西在灯泡旁边散发热量,这是不应该的)和我想清楚地看到它在 RGB 上的位置......我在 Inkscape 中通过手工和眼睛实现了这一点,但我正在寻找一些解决方案,其中包含 2 个镜头(rgb,ir)并且它们在正确的位置重叠所以即使我换到不同的板子也可以看到它,而不必再次手动操作。
    • 您希望 IR 镜头位于 RGB(面包板)的顶部?正确的?
    • 我希望 IR 镜头的面包板位于 RGB 镜头的面包板之上
    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 2019-12-19
    • 2015-10-13
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多