Артефакты в PyPlot против OpenCV imshow

У меня есть изображение в оттенках серого в формате массива numpy (стандартный формат OpenCV). Обычное изображение, uint8, все значения от 0 до 255. Когда я запускаю:

import cv2
cv2.imshow('', image)

Я получил:

Артефакты в PyPlot против OpenCV imshow

Но когда я бегу:

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

Я получил:

Артефакты в PyPlot против OpenCV imshow

И что действительно странно, так это то, что если я изменяю размер окна изображения pyplot, эти линейные артефакты меняются по ширине. Что случилось с этим? Я понятия не имею, что он показывает эти артефакты.

насколько я могу судить, эти линии на изображении, даже когда они показаны с помощью opencv, немного тусклее.

Quang Hoang 26.04.2019 06:00

Это похоже на псевдоним. Я предполагаю, что изображение больше, чем пиксели экрана: github.com/matplotlib/matplotlib/pull/13724. Вы, вероятно, можете избавиться от большей части этого с помощью imshow(image, interpolation='hanning')

Jody Klymak 26.04.2019 06:18

Не могли бы вы дать ссылку на исходное изображение?

Cris Luengo 26.04.2019 07:42

@JodyKlymak да, похоже, проблема в этом! «Ханнинг» исправил это. Не могли бы вы поместить это в ответ, чтобы я мог принять это?

Jordan 26.04.2019 20:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
4
335
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы удалить эффекты сглаживания, вы можете добавить фильтр сглаживания:

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()

Это указано в документах здесь

Другие вопросы по теме