【问题标题】:Create a padded image in python在 python 中创建填充图像
【发布时间】:2021-02-21 08:24:14
【问题描述】:

我有一个灰度图像(称为输入),我正在尝试在图像周围添加 1px 填充(仅由 0 组成)以应用过滤器:

padded = np.zeros((input.shape[0]+2, input.shape[1]+2), dtype=int)
padded[1:-1, 1:-1] = input[:,:]

但结果的对比度不如原始结果。为什么? 这是原图:

这是带边框的图像:

如果我不使用 zeros 函数,而是使用 once 函数并将矩阵乘以 255,我会得到一个甚至不同的图像。我不明白为什么我只是将一张图片复制到另一张图片中。

【问题讨论】:

  • 你是用plt.imshow 或. . . ?

标签: python matplotlib sobel


【解决方案1】:

来自plt.imshow docs:

X:类数组或 PIL 图像

图像数据。支持的数组形状有:

  • (M, N):带有标量数据的图像。使用 normalization 和颜色图将值映射到颜色。 . . .

归一化意味着颜色被“散开”,使得最小值为黑色,最大值为白色。所以那些np.zeros 正在制作最低限度的0(以及黑色边框)并让其他所有东西更轻以进行补偿。这应该可以解决它(我认为)

padded = np.pad(input, 
                pad_width = 1, 
                mode = 'minimum') # or mode = "maximum' for a white border

如果你绝对需要0的边框,你可以这样做:

padded = np.pad(input - input.min(), 
                pad_width = 1, 
                mode = 'constant') 

这会更改原始图片的范围以开始0,因此标准化应该是相同的。

【讨论】:

  • 在这种情况下,我使用 pylab.imshow。问题是我需要一个由 0 组成的边框来应用 Sobel 过滤器。使用 np.pad 我添加了一个值大于 0 的填充,然后计算没有正确执行。
  • 检查我的编辑,您也可以移动到图像数据,因此最小值为0,这样您就可以保持边缘0,而归一化应该保持相同的范围。
  • 最终我发现我需要的是 mode = 'edge'。非常感谢你让我发现这个功能!
猜你喜欢
  • 2020-12-07
  • 1970-01-01
  • 2015-12-14
  • 2017-01-03
  • 1970-01-01
  • 2014-06-29
  • 2017-10-18
  • 1970-01-01
  • 2011-09-29
相关资源
最近更新 更多