首页 > 解决方案 > 如何使 `cv2.imshow` 输出与 `plt.imshow` 输出相同?

问题描述

如何使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

在此处输入图像描述

标签: imageopencvmatplotlib

解决方案


# ...
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.01.0黑色 .. 白色。

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


推荐阅读