Python OpenCV copyMakeBorder更改灰度值

Python OpenCV copyMakeBorder更改灰度值,python,image,opencv,image-processing,opencv-python,Python,Image,Opencv,Image Processing,Opencv Python,我正在尝试将pad添加到我的图像中,这是一个使用copyMakeBorder的灰度图像。它确实有效,并添加了我想要的填充,但灰度值会改变,图像会变得更亮。我想保留我的值,只是添加填充。为什么它甚至与颜色相互作用 padded_img = cv2.copyMakeBorder( img, 0, 0, 0, pad_value, cv2.BORDER_CONSTANT) 您正在使用具有自适应范围的彩色贴图显示图像。从: 规范化,可选 在使用cmap映射到颜色之前,用于将标量数据缩放到[0,1]范围

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

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

您正在使用具有自适应范围的彩色贴图显示图像。从:

规范化,可选 在使用cmap映射到颜色之前,用于将标量数据缩放到[0,1]范围的Normalize实例。默认情况下,使用线性缩放,将最低值映射为0,最高值映射为1。对于RGB(A)数据,忽略此参数

由于图像仅包含相对较浅的颜色(高强度值),因此在您看来,图像似乎会随着边框变亮。事实上,没有边框的图像的第一次显示是由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)

如何显示图像?看起来您正在使用具有自适应范围的颜色贴图。由于边框较暗,值的范围会发生变化,这使得可视化效果有所不同。是灰色cmap中的图像。我正在使用matplotlib的imshow函数来显示图像。感谢这一点,所以我可以假设这只是imshow中的情况,或者我应该使用cv来规范我的图像,比如
img=cv2。normalize(img,img,alpha=0,beta=255,norm_type=cv2.norm_MINMAX)
?这个问题完全基于imshow的行为。您的图像数据不需要标准化。您也可以使用不改变强度的
cv2.imshow
。好的,谢谢。我之所以使用matplotlib的imshow,是因为我现在正在google colab上工作。我不能在colab上使用cv的imshow。使用“灰色”cmap不会影响imshow的规范化行为。是的!我误解了这个问题:)