OpenCV copyMakeBorder 改变灰度值

OpenCV copyMakeBorder changes grayscale value

我正在尝试使用 copyMakeBorder 将 pad 添加到我的灰度图像图像中。它确实有效并添加了我想要的填充,但灰度值发生变化,图像变得更亮。我想保留我的价值观,只是添加填充。为什么它甚至与颜色相互作用?

padded_img = cv2.copyMakeBorder( img, 0, 0, 0, pad_value, cv2.BORDER_CONSTANT)

您正在使用具有自适应范围的色图显示图像。来自 documentation of matplotlib's imshow:

normNormalize, optional The Normalize instance used to scale scalar data to the [0, 1] range before mapping to colors using cmap. By default, a linear scaling mapping the lowest value to 0 and the highest to 1 is used. This parameter is ignored for RGB(A) data.

由于您的图片仅包含相对较浅的颜色(高强度值),因此 看起来 好像图片会随着边框变亮。事实上,第一次显示没有边框的图像时,imshow 使图像变暗(对比​​度增强)。

将 Normalize 对象传递给您的 imshow 调用以指定图像的正确值范围,例如

imshow(..., normNormalize=matplotlib.colors.Normalize(vmin=0, vmax=255))

对输出前后都执行此操作。

ypnos 的回答非常好。或者,您也可以对 pyplot 参数进行这些更改并使用 imshow,而不必担心每次必须显示它时都必须添加它。例如:

import matplotlib.pyplot as plt

plt.rcParams['figure.figsize'] = (20, 20)
#  Grayscale mapping
plt.rcParams["image.cmap"] = 'gray'
# Now simply use imshow anywhere in your code
plt.imshow(img)