PyPlot 中的图像伪影与 OpenCV imshow 的区别

5
我是一名有用的助手,可以为您翻译文本。

我有一张灰度图像,格式为numpy数组(标准的OpenCV格式)。正常的图像是uint8类型,所有值都在0到255之间。当我运行以下代码时:

import cv2
cv2.imshow('', image)

我得到:

enter image description here

但是当我运行:

from matplotlib import pyplot
pyplot.imshow(image, cmap="gray")
pyplot.show()

我得到:

enter image description here

真正奇怪的是,如果我调整pyplot图像窗口大小,那些线条伪影的宽度就会改变。这是怎么回事?我不知道它为什么会显示这些伪影。


据我所知,即使在使用OpenCV显示时,那些线条仍然存在于图像中,只是稍微淡一些。 - Quang Hoang
1
那看起来像是别名效应。我猜这个图片比屏幕像素要大:https://github.com/matplotlib/matplotlib/pull/13724 。你可以用imshow(image, interpolation='hanning')来消除它的大部分。 - Jody Klymak
你能链接原始图片吗? - Cris Luengo
@JodyKlymak 是的,那似乎是问题所在!“hanning”修复了它。你能把它放在答案里,这样我就可以接受它了吗? - Jordan
2个回答

3

为了消除锯齿效果,您可以添加抗锯齿滤波器:

from matplotlib import pyplot
pyplot.imshow(image, cmap="gray", interpolation='hanning')
pyplot.show()

在这种情况下,它并不是真正的插值,而是平滑原始数据。

0
请注意,当您想使用matplotlib显示灰度图像时,必须正确指定值范围。在您的示例中,最亮的像素值是233,如果您不指定vminvmax,它将被映射到255。这将导致图像看起来比实际更明亮。
import matplotlib.pyplot as plt
import cv2

image = cv2.imread("example2.png")[:,:,0]
fig = plt.figure()
ax1, ax2 = fig.subplots(1,2)
ax1.axis("off")
ax2.axis("off")

ax1.imshow(image, cmap="gray") # rescales value range
ax2.imshow(image, cmap="gray",vmin = 0, vmax = 255) # proper way
plt.show()

enter image description here

文档中已经说明了这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接