拼接子图像重建原始图像
Posted
技术标签:
【中文标题】拼接子图像重建原始图像【英文标题】:Stitching sub images to reconstruct original image 【发布时间】:2022-01-01 17:19:47 【问题描述】:假设我们有一个图像被垂直分割成 4 个子图像。拆分后,我们将子图像打乱。如何从子图像中获取原始图像?或者,即使我们不知道顺序,我们如何正确排序子图像以获得原始图像?
(编辑)解决方案:首先要识别过渡点,您可以检查 X 轴上的像素差异。获得过渡点后,您可以将图像划分为子图像。现在,您可以比较和排序每个子图像的右像素和左像素。
【问题讨论】:
你真正想要达到什么目的?理想情况下,您会避免将它们改组,所以我认为您的问题中缺少某些方面。 我已经裁剪和打乱了子图像。我必须坚持他们才能得到原始的。 是的,我可以看到。我试图理解为什么如果你不想的话,你会洗牌。这可能会导致您了解 如何 和 what 您曾经将它们洗牌,这可能会导致重新组装它们的简单方法。 要找到正确的顺序,您可以检查子图像边界处的垂直边缘,并以每个可能的顺序/对进行测试。当从一个子图像平滑过渡到下一个子图像时,这样的边缘不应该有很多。 最简单的初始方法可能是取每张图像的左右边缘,并将边缘与其他边缘进行差分,找到总和绝对差最小的边缘对。 【参考方案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 如果您不知道顺序,这似乎是不可能的......您必须以某种方式匹配图像中的特征,也许为补丁添加重叠。以上是关于拼接子图像重建原始图像的主要内容,如果未能解决你的问题,请参考以下文章
图像重建基于matlab正则化图像去噪重建含Matlab源码 2358期
图像重建基于matlab L1范数自适应双边总变分超分辨率图像序列重建含Matlab源码 2209期
图像重建基于matlab L1范数自适应双边总变分超分辨率图像序列重建含Matlab源码 2209期