作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我得到了一个形状为 388x388x1 的 1 channel numpy 数组,其值范围为 1-150,作为 ML 推理的输出。我需要使用最近邻插值将数组大小调整为 5000x4000x1。
目前我正在使用 PIL 调整大小。它可以工作,但感觉过于复杂,必须为此导入 PIL。
output = np.random.randint(150, size=(388, 388))
width, height = 4000, 5000
pilImage = Image.fromarray(pred.astype(np.uint8))
pilImageResized = pilImage.resize((width, height), Image.NEAREST)
resizedOutput = np.array(pilImageResized).astype(np.uint8)
是否有更简单的方法可以在 numpy 中实现我想要的目标?(不使用cv2.resize
、scipy.interpolate
或PIL
)
最佳答案
通过构建将每个输出位置映射到输入中的源的索引数组,您可以非常简单地进行神经网络插值。您必须定义/假设一些事情才能有意义地做到这一点。例如,我假设您希望将每个输出行的左边缘与输入行的左边缘匹配,将像素视为表面元素,而不是点源。在后一种情况下,我会将中心匹配起来,导致边缘区域显得稍微被截断。
一种简单的方法是引入一个坐标系,其中整数位置指向输入像素的中心。这意味着图像实际上在每个轴上从 -0.5px 到 (N - 0.5)px。这也意味着舍入输出像素的中心会自动将它们映射到最近的输入像素:
这将为每个输入像素在输出中提供近似相等的表示,直至舍入:
in_img = np.random.randint(150, size=(388, 388, 1), dtype=np.uint8) + 1
in_height, in_width, *_ = in_img.shape
out_width, out_height = 4000, 5000
ratio_width = in_width / out_width
ratio_height = in_height / out_height
rows = np.round(np.linspace(0.5 * (ratio_height - 1), in_height - 0.5 * (ratio_height + 1), num=out_height)).astype(int)[:, None]
cols = np.round(np.linspace(0.5 * (ratio_width - 1), in_width - 0.5 * (ratio_width + 1), num=out_width)).astype(int)
out_img = in_img[rows, cols]
就是这样。不需要复杂的函数,并且输出保证保留输入的类型,因为它只是一个奇特的索引操作。
您可以简化代码并将其打包以供将来重用:
def nn_resample(img, shape):
def per_axis(in_sz, out_sz):
ratio = 0.5 * in_sz / out_sz
return np.round(np.linspace(ratio - 0.5, in_sz - ratio - 0.5, num=out_sz)).astype(int)
return img[per_axis(img.shape[0], shape[0])[:, None],
per_axis(img.shape[1], shape[1])]
关于python - 使用最近邻插值调整 1 channel numpy(图像)数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69728373/
我是一名优秀的程序员,十分优秀!