从 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 比我更了解这一点。
我有一个任务,我使用代码平铺输入图像:
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 比我更了解这一点。