Преобразование всех не черных пикселей в один цвет не дает ожидаемого результата - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь выбрать не черный пиксель, а затем окрасить их в черный, а черные - в белый. Я использовал решение , предоставленное в Stack Overflow, но пока оно не работает для меня.

import numpy as np
import matplotlib.pyplot as plt


image = plt.imread('Perforated_carbon/faltu.png')
plt.imshow(image)
plt.show()

enter image description here

image_copy = image.copy()

black_pixels_mask = np.all(image == [0, 0, 0], axis=-1)

non_black_pixels_mask = ~black_pixels_mask
# or non_black_pixels_mask = np.any(image != [0, 0, 0], axis=-1)  

image_copy[black_pixels_mask] = [255, 255, 255]
image_copy[non_black_pixels_mask] = [0, 0, 0]

plt.imshow(image_copy)
plt.show()

Это изображение, которое я получаю в настоящее время

enter image description here

В идеале мне бы хотелось, чтобы это было

enter image description here

Дополнительная информация:

>>> image.shape
(256, 192, 3)
>>> image.dtype
dtype('float32')
>>> import matplotlib; print(matplotlib.__version__)
2.0.0

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Проблема в том, что в версиях matplotlib <2.2.0 не было <a href="https://github.com/Zac-HD/matplotlib/blob/7f976981913b3266ae91ccc901c3ed63a2a93e8d/lib/matplotlib/image.py#L629-L640" rel="nofollow noreferrer"> нормализации и каких-либо предупреждений при передаче массива в imshow, который содержал данные вне ожидаемого диапазона. Таким образом, вы можете получить некоторые неожиданные результаты, например, здесь: Поведение Bizzare matplotlib при отображении изображений с плавающей точкой

Если вы обновите свой файл matplotlib до версии> = 2.2.0, при запуске кода в вопросе вы увидите следующее предупреждение:

Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).

и полученное изображение будет тем, которое вы хотели бы получить. Итак, мой совет для вас, чтобы заменить

image_copy[black_pixels_mask] = [255, 255, 255]

от

image_copy[black_pixels_mask] = [1, 1, 1]

и было бы также желательно обновить matplotlib.

Вот связанная проблема на GitHub: imshow не нормализует диапазон цветов в изображениях RGB и запрос на извлечение: Обрезает данные RGB в допустимый диапазон для imshow.

0 голосов
/ 16 января 2019

Как насчет изменения

black_pixels_mask = np.all(image == [0, 0, 0], axis=-1); 

до

black_pixels_mask = np.all(image == [0, 0, 0], axis=2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...