matplotlib 如何有效地创建图像的补丁,补丁对象包含原始图像中该补丁的坐标

llycmphe  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(166)

我有一个图像,我正在加载到python中,我需要将图像分割成重叠的补丁,我可以用sklearn和skimage来完成。然而,这个函数只输出补丁,但不存储原始图像中补丁的坐标位置。
我没有使用这个来重新组合图像,因为我知道可以使用另一个函数来完成。
目标:

from matplotlib import image
from matplotlib import pyplot

# load image as pixel array
img = image.imread('kolala.jpeg') #img.shape = (2000,1000)

# Outputs a stacked numpy array of patches
patches = sklearn.feature_extraction.image.extract_patches_2d(img, patch_dim=(40,30))

# Ideally want something like

patches , coords = get_patches_and_coords_function(img, patch_dim=(40,30)

print(coords)

[{x_top: 0, y_top:1000, w:30, h:40},{},...]
pgky5nke

pgky5nke1#

extract_patches_2d为图像上从左上角开始的每个位置生成补丁-如果可以在图像上裁剪patch_size的补丁。
下面是一个小(无意义)图像的可视化示例。输入图像:

from sklearn.datasets import load_sample_image

img = load_sample_image("flower.jpg")[:15, :20, 0]
plt.imshow(img)

生成的修补程序:

from sklearn.feature_extraction import image

patches = image.extract_patches_2d(img, patch_size=(10, 10))

fig, axs = plt.subplots(6, 11, figsize=(11, 6), tight_layout=True)
for i, ax in enumerate(axs.reshape(-1)):
    ax.imshow(patches[i], vmin=img.min(), vmax=img.max())
    ax.axis("off")

因此,可以用以下公式计算贴片的位置:

import numpy as np

im_H, im_W = img.shape[:2]
p_H, p_W = patch_size

y = np.arange(0, im_H - (p_H - 1))
x = np.arange(0, im_W - (p_W - 1))

X, Y = np.meshgrid(x, y)
positions = np.dstack((X, Y)).reshape(-1, 2)

这是图像上的位置

plt.imshow(img)
plt.scatter(*positions.T, s=10, c="red")

相关问题