从 python 中的 patches/tiles 重建图像

Reconstruct Image from patches/tiles in python

我有一个任务,我使用代码平铺输入图像:

def tileImage(img,numrows,numcols,show = False):
    height = int(img.shape[0] / numrows)
    width = int(img.shape[1] / numcols)
    tiles = []
    for row in range(numrows):
        for col in range(numcols):
            y0 = row * height
            y1 = y0 + height
            x0 = col * width
            x1 = x0 + width
            tiles.append(img[y0:y1, x0:x1])
            if show:
                cv2.imshow("tile",img[y0:y1, x0:x1])
                cv2.rectangle(img,(x0,y0),(x1,y1),(255),1)
                cv2.imshow("Tile",img)
                cv2.waitKey(0)
                cv2.destroyAllWindows
    return tiles

之后我计算了所有图块的总和并按升序对它们进行排序。 我将 sum.sorted[-20] 作为阈值并将低于该阈值的所有图块设置为 0 以忽略背景。到目前为止一切正常。

现在我需要使用图块重建图像。我试过了 np.reshape.

shutOffTiles = np.reshape(thresholded,(height*numrows,width*numcols,1))

尺寸没问题。但是,由于图块的顺序

,结果看起来像这样

我也试着把瓷砖弄平并重新塑形。有人有适当的索引解决方案吗?提前非常感谢

使用@Paul Panzer

的解决方案
thresholded.reshape(numrows, numcols, height, width).swapaxes(1, 2).reshape(height*numrows, width*numcols, 1)

我得到:

事实证明需要两种成分。

1)几何:

由于嵌入到原始图像中的图块在内存中不是连续的(例如,在左上角图块的第一行到达下一个图块的第一行之后),简单的重塑将不起作用。相反,我们必须首先将第零轴(枚举图块的轴)拆分为行和列。然后我们必须将两个水平轴和两个垂直轴彼此相邻移动,在每种情况下,图块尺寸必须排在最后。最后,我们可以将两对组合成一个轴,并在右侧添加一个新轴。

thresholded.reshape(numrows, numcols, height, width).swapaxes(1, 2).reshape(height*numrows, width*numcols, 1)

2) 归一化。

显然,处理和可视化之间存在不匹配,可以通过规范化来解决 - OP 比我更了解这一点。