拼接子图像重建原始图像

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期

Python PDF/图像表重建选项

基于滤波反投影的图像重建算法matlab仿真,R-L滤波和S-L滤波

基于小波和插值的超分辨率图像重建算法