如何使 `cv2.imshow` 输出与 `plt.imshow` 输出相同?

How can I make the `cv2.imshow` output the same as the `plt.imshow` output?

如何使 cv2.imshow 输出与 plt.imshow 输出相同?

# loading image
img0 = cv2.imread("image.png")
# converting to gray scale
gray = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)

# remove noise
img = cv2.GaussianBlur(gray, (3, 3), 0)

# convolute with proper kernels
laplacian = cv2.Laplacian(img, cv2.CV_64F)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)  # x
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)  # y
imgboth = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)

plt.imshow(imgboth, cmap='gray')
plt.show()

cv2.imshow("img", cv2.resize(imgboth, (960, 540)))
cv2.waitKey(0)
cv2.destroyAllWindows()
       

原图

plt.output

cv2.imshow

# ...
canvas = imgboth.astype(np.float32)
canvas /= np.abs(imgboth).max()
canvas += 0.5
cv.namedWindow("canvas", cv.WINDOW_NORMAL)
cv.imshow("canvas", canvas)
cv.waitKey()
cv.destroyWindow("canvas")

只是看起来不同,因为您发布的是缩略图,而不是原始尺寸的图片。

当你给出 imshow 浮点值时,你这样做是因为 laplaciansobelx 是浮点数,然后它假定范围为 0.0 .. 1.0 为黑色..白色.

matplotlib 自动缩放数据。 OpenCV 的 imshow 没有。两种行为各有利弊。