cv2.imshow() 和 matplotlib.pyplot.show() 中的灰度图像不同

Hyu*_* Go 4 python opencv matplotlib imshow

import cv2 
import numpy as np 
import math
import sys
import matplotlib.pyplot as plt
import utils as ut

imgGray = cv2.imread(imgfile, cv2.IMREAD_GRAYSCALE)
plt.imshow(imgGray, cmap = 'gray')
plt.show() 


cv2.imshow("",imgGray)
cv2.waitKey(0)
cv2.destroyAllWindows()


sys.exit()
Run Code Online (Sandbox Code Playgroud)

plt.show() 结果

在此输入图像描述

cv2.imshow() 结果

在此输入图像描述

我以为他们两个都是一样的。但正如你所看到的,两张图片的灰度不同。似乎 plt.show() 比 cv2.imshow() 更黑

如何使 plt.show() 中的灰度与 cv2.imshow() 相同?

蟒蛇:3.9.6

opencv-python:4.5.3.56

数学图库:3.4.3

Chr*_*itz 7

这是 的行为matplotlib。它会找到图片的最小值和最大值,将其设为黑白,并缩放其间的所有内容。

这对于可能具有整数或浮点类型且值范围在 0.0 和 1.0 之间、或 0 .. 255 或其他任何值之间的任意数据很有用。

您可以使用vminvmax参数自行设置这些限制:

plt.imshow(imgGray, cmap='gray', vmin=0, vmax=255) # if your data ranges is uint8
Run Code Online (Sandbox Code Playgroud)

OpenCV 没有这样的自动缩放功能。它有固定的规则。如果是浮点数,0.0 是黑色,1.0 是白色。如果是 uint8,则范围是 0 .. 255。

要在 OpenCV 中获得此类自动调整范围,您必须在显示之前缩放数据:

normalized = cv.normalize(
    data, alpha=0.0, beta=1.0, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)
Run Code Online (Sandbox Code Playgroud)

  • `cv.normalize(src=数据,dst=无,alpha=0.0,beta=1.0,norm_type=cv.NORM_MINMAX,dtype=cv.CV_32F)` (3认同)
  • 很好的答案。您可能会考虑提及如何使用“cv2.normalize()”来让 **OpenCV** 像“matplotlib”一样工作。 (2认同)