【问题标题】:Bilinearly interpolating overlapping image patches双线性内插重叠图像块
【发布时间】:2020-11-19 21:43:03
【问题描述】:

我得到一个 576x576 像素的图像,它被分成 64x64 像素的块,水平和垂直方向的步长为 32 像素,允许在两个维度上重叠一半。例如,在 128x64 像素的图像中,我将有 3 个补丁,就像在第一个附加图像中一样。

这些 64x64 图像块被输入到神经网络模型中,该模型经过训练以一定的概率(评估分数)将这些块分类为脏块或干净块。使用 128x64 像素图像示例,在通过模型输入 3 个补丁后,我将有一个

  • 补丁 (0, 0), (64, 64) 的评估分数为 0.61
  • 补丁 (32, 0), (96, 64) 的评估分数为 0.52
  • 补丁 (64, 0), (128, 64) 的评估分数为 0.43

其中 (x1, y1), (x2, y2) 分别表示补丁的左上角和右下角坐标。

我现在想在原始图像上显示一个热图,通过在补丁之间进行双线性插值,显示每个像素的评估分数,如第二张附加图像所示。

我现在遇到的问题是我只有整个 64x64 图像块的评估分数,而我想要一个像素评估分数。 我现在的假设是补丁的评估分数对应于它的中心像素之一,例如第一个patch的中心像素在(32, 32),取值为0.61,第二个patch的中心像素在(64, 32),取值为0.52。

我现在的问题是:如果我只有评估分数,如何将其转化为插值问题以获得未知像素的评估分数,例如像素 (0, 0) 或像素 (48, 32)对于像素 (32, 32)、(64, 32) 和 (96, 32),由第一张附加图像中的红色方块表示。

[1] 重叠的补丁

[2] 评估分数热图

【问题讨论】:

  • 那么对于前 3 个补丁,您只有 Patch 0 的前半部分和 Patch 2 的后半部分的正确值吗?您想从实际的第一部分(您不知道)和Patch 0 的第二部分的总和中恢复Patch 1 的前半部分?
  • 不,我有补丁 0、1 和 2 的中心像素的值,并希望使用这些值来获取每个像素的评估分数来构建您可以在我编辑的答案中看到的热图。
  • 我认为您应该编辑您的问题并更详细地解释您的问题。根据您的问题和此评论,我仍然不知道您要实现什么目标。
  • 我已经编辑了我的帖子,希望这可以解决问题。如果还有什么不清楚的地方请告诉我。

标签: python image-processing


【解决方案1】:

您可以使用scipy.interpolate.griddata。线性插值模式将在已知点之间插入值,并用提供的值或 nan 填充边缘处的值。

我正在为比您的示例稍大的示例提供代码,因为您的示例在 y 维度上没有任何“中间”点,并且线性插值模式会引发错误(尽管“最近”模式会工作)。

import numpy as np
from scipy.interpolate import griddata

# create a meshgrid of the coordinates you want to interpolate onto
height = 96
width = 160
y = np.arange(height)
x = np.arange(width)
x,y = np.meshgrid(x,y)

# these are your known values for known points
points = np.array([[32,32], [32, 64], [32, 96], [32, 128], [64,32], [64, 64], [64, 96], [64, 128]])
values = np.array([0.61, 0.52, 0.43, 0.39, 0.53, 0.45, 0.66, 0.20])

# convert the grid coordinates to a list
coords_list = np.asarray([[y[i, j], x[i, j]] for i in range(len(y)) for j in range(len(x[0]))])

# interpolate the known points onto the list of grid points
predicted_values = griddata(points, values, coords_list, method='linear', fill_value=0)

# reshape the predicted values to fit your image shape
predicted_values_grid = predicted_values.reshape([height, width])

这就是predicted_values_grid 的样子:

提供的点之间的值被插值,而边缘的点被零填充。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2015-11-14
    • 2016-06-01
    相关资源
    最近更新 更多