使用skimage view_as_windows制作图像补丁和重建补丁

Kyr*_*Kyr 4 python opencv scikit-image

我想从 512x512 彩色图像中提取彩色图像块,并将它们作为单独的图像块保存在文件夹中。如何从这些图像补丁中重建原始图像?我已经阅读并查看了一些类似的问题,但它们并没有解决我的问题。

我已经阅读了一些内容,并决定使用 SKimage 中的 view_as_windows 函数来执行图像修补。我还设法将补丁保存为 png 文件。

patch_img = view_as_windows(input_img, (128, 128, 3), step=64)目前,在显示输出数组的详细信息时,使用 SKimage view_as_window 从大小为 512x512 的彩色图像中提取补丁,我注意到patch_img它的形状为 (7, 7, 1, 128, 128, 3) ,数据类型为 unint8。要将每个补丁保存为单独的图像,我使用以下代码。

    for i in range(0, len(patch_img)):    #range should be 0 to 6
        for x in range(0, len(patch_img)):
            fname= 'IMG_test_{}_{}.png'.format(i, x)
            #cv2.imwrite(fname, crop_img[i,x,0,:,:,:])
Run Code Online (Sandbox Code Playgroud)

当使用 CV2 加载包含已保存图像的整个文件夹时,我无法取回相同的形状和 dtype patch_img,而是得到一个形状 (49, 128, 128, 3)。我怎样才能解决这个问题。

编辑:使用固定形状savedimg = savedimg.reshape(7,7,128 128, 3)

另外,如何使用保存的图像补丁来重建原始图像?

mra*_*acz 5

假设我们首先正在做一些更简单的事情。假设我们想要分割一个 2D 数字数组,而不是 2D RGB 数组,如下所示:

>>> image_arr = np.array(list(range(1, 26))).reshape((5,5))
>>> image_arr
array([[ 1.,  2.,  3.,  4.,  5.],
       [ 6.,  7.,  8.,  9., 10.],
       [11., 12., 13., 14., 15.],
       [16., 17., 18., 19., 20.],
       [21., 22., 23., 24., 25.]])
Run Code Online (Sandbox Code Playgroud)

现在,假设我们想将其拆分为2x2窗口:

>>> patch_arr = view_as_windows(image_arr, (2,2))
Run Code Online (Sandbox Code Playgroud)

让我们比较一下两个数组的形状:

>>> image_arr.shape
(5, 5)
>>> patch_arr.shape
(4, 4, 2, 2)
Run Code Online (Sandbox Code Playgroud)

现在,(如果我理解正确的话)你问我们如何image_arr使用patch_arr

我们处理它的方法是创建一个空的 np.array,然后我们将获取每个“补丁”并将它们粘贴到图像上。由于它们是重叠的,这意味着我们将多次向大多数单元格写入相同的值,但这当然不是问题。

您也可以尝试优化这种方法,只向每个单元写入一次,但我不确定在这种情况下是否值得。

  1. 让我们创建空数组
>>> patch_arr = view_as_windows(image_arr, (2,2))
Run Code Online (Sandbox Code Playgroud)
  1. 我们现在将迭代补丁并将它们粘贴到reconstructed_arr
>>> image_arr.shape
(5, 5)
>>> patch_arr.shape
(4, 4, 2, 2)
Run Code Online (Sandbox Code Playgroud)
  1. 就是这样
>>> reconstructed_arr = np.zeros(shape=(5,5))
>>> reconstructed_arr
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
Run Code Online (Sandbox Code Playgroud)

类似的方法需要应用于您的数据(这次使用另一个轴表示 RGB 值):

  1. 生成随机 input_img 数组
for x in range(patch_arr.shape[0]):
    for y in range(patch_arr.shape[1]):
        reconstructed_arr[x:x + 2, y:y + 2] = patch_arr[x,y]
Run Code Online (Sandbox Code Playgroud)
  1. 让我们像您一样创建补丁:
>>> reconstructed_arr
array([[ 1.,  2.,  3.,  4.,  5.],
       [ 6.,  7.,  8.,  9., 10.],
       [11., 12., 13., 14., 15.],
       [16., 17., 18., 19., 20.],
       [21., 22., 23., 24., 25.]])
Run Code Online (Sandbox Code Playgroud)
  1. 用于重建的空数组:
>>> reconstructed_arr = np.zeros((512, 512, 3))
Run Code Online (Sandbox Code Playgroud)
  1. 重建 for 循环需要一些小的调整,因为您使用了step=64.
input_img = np.random.rand(512, 512, 3)
Run Code Online (Sandbox Code Playgroud)