Измененный массив изображений при построении с помощью imshow pyplot - PullRequest
0 голосов
/ 05 августа 2020

Итак, я заметил для себя и нескольких моих коллег, что когда мы отображаем двоичный массив с помощью функции imshow matplotlib.pyplot, края отображаемого изображения кажутся измененными. Некоторое время я думал, что это просто визуальный артефакт, но сегодня столкнулся с новыми проблемами.

Кстати, я использую matplotlib: 3.2.2 и numpy: 1.19.1

Если я создам небольшой двоичный массив и нанесу его на график, вы увидите небольшой «ореол» двоичного блока на изображении. Это не очень очевидно, но оно есть:

import matplotlib.pyplot as plt
import numpy as np

img=np.zeros((100,100))
img[25:60,25:60]=50
plt.imshow(img)

enter image description here

It will become more apparent if i change the cmap for the plot.

my_cmap = plt.cm.get_cmap('prism')
my_cmap.set_under('black')
plt.imshow(img,cmap=my_cmap, vmin=1)

enter image description here

The displayed array should only have 0's as background and 1's in the box, but the box is displayed as a green box with a red/yellow border.

With previous versions of pyplot i have not had this issue and it does become a problem when i do object detection and i want to display them and my other wise binary objects end up like this:

введите описание изображения здесь

Надеюсь, вы поможете мне с этим

1 Ответ

2 голосов
/ 05 августа 2020

imshow не знает, что ваши данные являются дискретными или даже двоичными. По умолчанию добавляет некоторую интерполяцию. Вы можете подавить плавную интерполяцию, используя imshow(...., interpolation='none') (или interpolation='nearest').

Обратите внимание, что режим по умолчанию - 'antialiased', для которого эффект различается в зависимости от количества пикселей экрана, занимаемых пикселем изображения. . См. официальную документацию matplotlib для получения более подробной информации.

Вот тестовый код, сравнивающий режим интерполяции по умолчанию и 'none' для разных размеров изображения:

from matplotlib import pyplot as plt
import numpy as np

x = np.round(10 + np.random.uniform(-.1, .1, (100, 100)).cumsum(axis=0).cumsum(axis=1))
x[x % 2 == 0] = x.max() + 1
fig, axes = plt.subplots(2, 6, figsize=(14, 5))
for i, axrow in enumerate(axes):
    for j, ax in enumerate(axrow):
        k = 10 * (j + 5)
        ax.imshow(x[-k:, -k:], cmap='Dark2', interpolation=None if i == 0 else 'none')
        ax.set_title("size={}\ninterpolation={}".format(k, 'None' if i == 0 else "'none'"))
plt.tight_layout()
plt.show()

comparison

Here is another example, using the 'seismic' colormap and only two data values. This colormap has dark blue and red at the extremes and white near the center, which shows the interpolation much more pronunciated:

два значения данных, сейсм. c cmap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...