У меня есть изображение в оттенках серого в формате массива numpy (стандартный формат OpenCV). Обычное изображение, uint8, все значения от 0 до 255. Когда я запускаю:
import cv2
cv2.imshow('', image)
Я получил:
Но когда я бегу:
from matplotlib import pyplot
pyplot.imshow(image, cmap = "gray")
pyplot.show()
Я получил:
И что действительно странно, так это то, что если я изменяю размер окна изображения pyplot, эти линейные артефакты меняются по ширине. Что случилось с этим? Я понятия не имею, что он показывает эти артефакты.
Это похоже на псевдоним. Я предполагаю, что изображение больше, чем пиксели экрана: github.com/matplotlib/matplotlib/pull/13724. Вы, вероятно, можете избавиться от большей части этого с помощью imshow(image, interpolation='hanning')
Не могли бы вы дать ссылку на исходное изображение?
@JodyKlymak да, похоже, проблема в этом! «Ханнинг» исправил это. Не могли бы вы поместить это в ответ, чтобы я мог принять это?






Чтобы удалить эффекты сглаживания, вы можете добавить фильтр сглаживания:
from matplotlib import pyplot
pyplot.imshow(image, cmap = "gray", interpolation='hanning')
pyplot.show()
В данном случае это не интерполяция, а сглаживание исходных данных.
Обратите внимание, что если вы хотите отображать изображения в оттенках серого с помощью matplotlib, вы должны правильно указать диапазон значений. В вашем примере значение самого яркого пикселя равно 233, которое будет сопоставлено с 255, если вы не укажете vmin и vmax. Это приведет к тому, что изображение будет выглядеть ярче, чем оно есть на самом деле.
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()
Это указано в документах здесь
насколько я могу судить, эти линии на изображении, даже когда они показаны с помощью opencv, немного тусклее.