【问题标题】:Stitching sub images to reconstruct original image拼接子图像重建原始图像
【发布时间】:2022-01-01 17:19:47
【问题描述】:

假设我们有一个图像被垂直分割成 4 个子图像。拆分后,我们将子图像打乱。如何从子图像中获取原始图像?或者,即使我们不知道顺序,我们如何正确排序子图像以获得原始图像?

(编辑)解决方案:首先要识别过渡点,您可以检查 X 轴上的像素差异。获得过渡点后,您可以将图像划分为子图像。现在,您可以比较和排序每个子图像的右像素和左像素。

【问题讨论】:

  • 你真正想要达到什么目的?理想情况下,您会避免将它们改组,所以我认为您的问题中缺少某些方面。
  • 我已经裁剪和打乱了子图像。我必须坚持他们才能得到原始的。
  • 是的,我可以看到。我试图理解为什么如果你不想的话,你会洗牌。这可能会导致您了解 如何what 您曾经将它们洗牌,这可能会导致重新组装它们的简单方法。
  • 要找到正确的顺序,您可以检查子图像边界处的垂直边缘,并以每个可能的顺序/对进行测试。当从一个子图像平滑过渡到下一个子图像时,这样的边缘不应该有很多。
  • 最简单的初始方法可能是取每张图像的左右边缘,并将边缘与其他边缘进行差分,找到总和绝对差最小的边缘对。

标签: python opencv image-processing python-imaging-library scikit-image


【解决方案1】:

假设您知道图像拆分的顺序,您可以使用 hconcat() 将它们重新连接

# horizontally concatenates images
# of same height 
im_h = cv2.hconcat([imgA, imgB])    

# show the output image
cv2.imshow('man_image.jpeg', im_h)

【讨论】:

  • 我的意思是我们如何才能正确地对这些拆分进行排序?我不是在询问连接子图像
【解决方案2】:

根据您拆分图像的方式,一种解决方案是将原始索引/位置与图像一起保存在元组中。一旦他们被洗牌,你就可以根据这个索引对图像列表进行排序,恢复原始顺序。然后使用hconcat 将它们拼接在一起。

import cv2
img = cv2.imread('img.png')
img_list = []
# split image in half
img_B = img_list.append((1, img[:, img.shape[1]//2:]))
img_A = img_list.append((0, img[:, :img.shape[1]//2]))
# img_list is in order 1, 0
sorted_list = sorted(img_list, key=lambda x: x[0])
# sorted to correct order of 0, 1

result = cv2.hconcat([sorted_list[0][1], sorted_list[1][1]])  

【讨论】:

  • 假设你不知道顺序。
  • @dasmehdix 如果您不知道顺序,这似乎是不可能的......您必须以某种方式匹配图像中的特征,也许为补丁添加重叠。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2019-01-07
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多