从python中的补丁/磁贴重建图像

时间:2017-12-29 10:54:00

标签: python numpy image-processing cv2

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

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))

尺寸还可以。但是,由于图块Reconstruction

的顺序,结果看起来像这样

我还试图压平瓷砖并重塑它们。有没有人正确的索引解决方案?非常感谢您提前

使用@Paul Panzer的解决方案

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

我得到: enter image description here

1 个答案:

答案 0 :(得分:2)

事实证明需要两种成分。

1)几何:

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

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

2)正常化。

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