sklearn.feature_extraction.image.extract_patches_2d
преобразует 2D-изображение в коллекцию перекрывающихся патчей. Чтобы разложить ваше изображение на непересекающиеся блоки, вы можете использовать skimage.util.view_as_blocks
.
Следующий фрагмент является возможной реализацией ваших пользовательских функций. Обратите внимание, что create_patches
избавляет от нижней и правой границ изображения, если размер изображения не является целым числом, кратным размеру патча. Я принял это решение, чтобы избежать изменения размера изображения (операция, которая может привести к появлению артефактов). Исходное изображение может быть восстановлено либо из файлов исправлений (не реализовано), либо напрямую из массива 4D, возвращаемого create_patches
.
import os
import numpy as np
from skimage import io, util
def create_patches(img, folder, patch_width, patch_height):
# Trim right and bottom borders if image size is not
# an integer multiple of patch size
nrows, ncols = patch_height, patch_width
trimmed = img[:img.shape[0]//nrows*nrows, :img.shape[1]//ncols*ncols]
# Create folder to store results if necessary
patch_dir = os.path.join(folder, 'Patched Image')
if not os.path.isdir(patch_dir):
os.mkdir(patch_dir)
# Generate patches and save them to disk
patches = util.view_as_blocks(trimmed, (nrows, ncols))
for i in range(patches.shape[0]):
for j in range(patches.shape[1]):
patch = patches[i, j, :, :]
patch_name = f'patch_{i:02}_{j:02}.png'
io.imsave(os.path.join(patch_dir, patch_name), patch)
return patches
def reconstruct_image(patches):
img_height = patches.shape[0]*patches.shape[2]
img_width = patches.shape[1]*patches.shape[3]
return patches.transpose(0, 2, 1, 3).reshape(img_height, img_width)
Демо
In [134]: import matplotlib.pyplot as plt
...:
...: folder = r'C:\Users\User\path-to-your-folder'
...: filename = 'sample_image.png'
...:
...: original = io.imread(os.path.join(folder, filename))
...: patches = create_patches(original, folder, 50, 50)
...: reconstructed = reconstruct_image(patches)
...:
...: fig, (ax0, ax1) = plt.subplots(1, 2)
...: ax0.imshow(original, cmap='gray')
...: ax0.set_title('Original')
...: ax1.imshow(reconstructed, cmap='gray')
...: ax1.set_title('Reconstructed')
...: plt.show(fig)
...:
...: for patch in os.listdir(os.path.join(folder, 'Patched Image')):
...: print(patch)
...:
patch_00_00.png
patch_00_01.png
patch_00_02.png
patch_00_03.png
...
patch_07_05.png
patch_07_06.png
patch_07_07.png
patch_07_08.png
patch_07_09.png
Изображение, использованное в приведенном выше примере, можно загрузить с здесь