python - 使用 numpy 逐像素矢量化 2 个窗口图像集之间的误差计算
问题描述
我正在尝试逐像素(每个图像)计算 2 个窗口图像集之间的误差。为此,我将编码后的 img 的值减去原始 img 的值。之后,我想计算每个像素到 0 的距离(使用 RGB 图像的 3 个维度)。我现在正在搜索的结果是一个与原始数据形状相同但只有一维(l2_matrix)的新矩阵。
我为此使用的代码是:
n_windows_max, n_imgs_window_max, x_max, y_max, n_dim = diff_matrix.shape
l2_matrix = np.zeros((n_windows_max,n_imgs_window_max,x_max, y_max, 1))
n_window = 0
n_img_window = 0
x_i = 0
y_i = 0
for n_window in range(n_windows_max): # read each window
for n_img_window in range(n_imgs_window_max): #read all the images of each window
for x_i in range(x_max):
for y_i in range(y_max):
a0 = diff_matrix[n_window, n_img_window, x_i, y_i, 0]
a1 = diff_matrix[n_window, n_img_window, x_i, y_i, 1]
a2 = diff_matrix[n_window, n_img_window, x_i, y_i, 2]
a = array([a0, a1, a2])
l2_matrix[n_window, n_img_window, x_i, y_i, 0] = norm(a)
如您所见,我有一个 5 维矩阵,其中形状为:(窗口数,每个窗口中的图像数,x 轴,y 轴,维度数)。上面的代码工作正常,但我想改进它。我试图对其进行矢量化,但我不知道如何正确地做到这一点(我已经阅读了一些帖子,其中包含如何做到这一点的示例,但这是为了更简单的目的而且我无法将其推断为这个问题)。
解决方案
您可以使用 定义要计算范数的轴np.linalg.norm
。
例如,这里第一个窗口的第一个图像的第一个三通道像素的范数:
np.linalg.norm(diff_matrix[:1, :1, :1, :1], axis=4)
所以你可以定义l2_matrix
为:
l2_matrix = np.linalg.norm(diff_matrix, axis=4)
其中作为 的一个维度n_windows_max, n_imgs_window_max, x_max, y_max
。
如果你最后需要那个额外的维度,你可以这样做:
l2_matrix.reshape(*l2_matrix.shape, 1)
推荐阅读
- javascript - 如何将对象替换为数组?
- php - 在 SQL 查询之后,我不知道结果来自哪里
- flutter - Flutter - 错误:没有为类定义 getter X
- r - CURL 中的多重身份验证
- ios - 如何在 UIViewController 的视图上嵌入 scrollView 并添加内部有内容的自定义 UIView?
- tfs - 如何查询从当前迭代移动到不同迭代的项目?
- python - 运行此代码时出现错误,提示未定义 str1,而我已经在 try 块中定义了它
- linux - 如何使用 AWS CLI 获取具有特定标签的 Amazon EC2 自动扩展组中的实例?
- image - Azure DevTestLabs 自定义映像错误“从市场映像创建虚拟机需要请求中的计划信息”
- visual-studio-code - 在 VS Code 中禁用“搜索换行”