python - 从 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)的数组。但我想在这里一步一步地走。
任何帮助或提示或建议或有用资源的链接将不胜感激。
解决方案
推荐阅读
- php - 如何显示和分组帖子?
- ios - 将 UIVisualEffectView 添加到 UIView 大小未知的部分
- jsp - javax.el.ELException:无法解析表达式 [${not empty short}]
- python - 在函数中将网格网格与矩阵乘法相结合的最佳方法
- git - 如何修改 Vivado 2018.3 生成的 tcl 脚本进行版本控制
- android - Sqlite,如何检查字符串是否包含在数据库中的任何值中
- jquery - 复选框的 CSS 函数问题
- java - AdMob ID inst 加载广告,而测试 ID 有效
- javascript - 了解从 lon., lat. 的无证转换。地球表面坐标到图像的 x, y 坐标
- javascript - 在具有许多子组件的组件上改进 updateState - Reactjs