首页 > 解决方案 > 从 4D 数组中减去 2D 数组

问题描述

我有一个灰度图像,由一个二维整数数组表示,形状为 (1000, 1000)。

然后,我使用sklearn.feature_extraction.image.extract_patches_2d()从该图像生成一个 3x3“补丁”数组,生成一个形状数组 (1000000, 3, 3),因为原始图像中的每个像素值都有 100 万个 3x3 数组。

我将其重塑为 (1000, 1000, 3, 3),这是一个 1000x1000 的 3x3 数组,原始图像中的每个像素都有一个 3x3 数组。

我现在想有效地从 4D 数组中减去 2D 数组。我已经找到了一种方法来做到这一点,但我想用矢量化来做一个。

我目前遍历每个像素并从同一索引处的 3x3 数组中减去那里的值。这有点慢。

这是当前加载图像,预先格式化数组,然后执行此减法的内容。

from PIL import Image, ImageOps
from skimage import io
from sklearn.feature_extraction import image
import numpy

jitter = 1
patchsize = (jitter*2)+1

#load image as greyscale image using PIL
original = load_image_greyscale(filename)

#create a padded version of the image so that 1000x1000 patches are made
#instead of 998x998
padded = numpy.asarray(ImageOps.expand(original,jitter))

#extract these 3x3 patches using sklearn
patches = image.extract_patches_2d(padded,(patchsize,patchsize))

#convert image to numpy array
pixel_array = numpy.asarray(original)

#then reshape the array of patches so it matches array_image
patch_array = numpy.reshape(patches, (pixel_array.shape[0],pixel_array.shape[1],patchsize,patchsize))
#create a copy for results
patch_array_copy = numpy.copy(patch_array)

#iterate over each 3x3 array in the patch array and subtract the pixel value
#at the same index in the pixel array
for x in range(pixel_array.shape[0]):
    for y in range(pixel_array.shape[1]):
        patch_array_copy[x,y] = patch_array[x,y] - pixel_array[x,y]

我想要一种使用矩阵运算执行 for 循环中最后一步的方法。

我还想在某些时候扩展它以处理 RGB 图像,有效地使其从形状为(1000,1000,3,3,3)的数组中减去形状为(1000,1000,3)的数组。但我想在这里一步一步地走。

任何帮助或提示或建议或有用资源的链接将不胜感激。

标签: pythonnumpyimage-processing

解决方案


推荐阅读