#python #image #opencv #image-processing #opencv-python
#python #изображение #opencv #обработка изображений #opencv-python
Вопрос:
Я пытаюсь добавить pad к своему изображению, которое представляет собой изображение в оттенках серого, используя copyMakeBorder. Это работает и добавляет нужное мне дополнение, но значения оттенков серого меняются, изображение становится ярче. Я хочу сохранить свои значения и просто добавить отступы. Почему он вообще взаимодействует с цветами?
padded_img = cv2.copyMakeBorder( img, 0, 0, 0, pad_value, cv2.BORDER_CONSTANT)
Комментарии:
1. Как вы отображаете изображение? Похоже, вы используете цветовую карту с адаптивным диапазоном. Из-за темной границы диапазон значений изменяется, что делает визуализацию другой.
2. вот изображение в сером cmap. Я использую функцию imshow matplotlib для отображения изображения.
Ответ №1:
Изображение отображается с использованием цветовой карты с адаптивным диапазоном. Из документации imshow matplotlib:
Normalize, необязательно Экземпляр Normalize, используемый для масштабирования скалярных данных до диапазона [0, 1] перед отображением в цвета с помощью cmap. По умолчанию используется линейное масштабирование, сопоставляющее наименьшее значение с 0, а наибольшее — с 1. Этот параметр игнорируется для данных RGB (A).
Поскольку ваше изображение содержит только относительно светлые цвета (высокие значения интенсивности), вам кажется, что изображение станет светлее вместе с границей. Фактически, первое отображение вашего изображения без рамки было затемнено (улучшено контрастностью) imshow.
Передайте объект Normalize в ваш вызов imshow, чтобы указать правильный диапазон значений вашего изображения, например
imshow(..., normNormalize=matplotlib.colors.Normalize(vmin=0, vmax=255))
Сделайте это как для вывода до, так и после.
Комментарии:
1. спасибо, что сработало, поэтому я могу предположить, что это было только в imshow, или я должен нормализовать свое изображение с помощью cv like
img = cv2.normalize(img, img, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX)
?2. Эта проблема основана исключительно на поведении imshow. Ваши данные изображения не нуждаются в нормализации. Вы также можете использовать
cv2.imshow
, который не изменяет интенсивности.3. Хорошо, спасибо. Причина, по которой я использую imshow от matplotlib, заключается в том, что я сейчас работаю над Google colab. Я не могу использовать imshow cv в colab.
Ответ №2:
ответ ypnos в полном порядке. В качестве альтернативы вы также можете внести эти изменения в параметры pyplot и использовать imshow, не беспокоясь о необходимости добавлять его каждый раз, когда вам нужно его отобразить. Например:
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (20, 20)
# Grayscale mapping
plt.rcParams["image.cmap"] = 'gray'
# Now simply use imshow anywhere in your code
plt.imshow(img)
Комментарии:
1. Использование «серого» cmap не влияет на поведение imshow при нормализации.
2. Да, действительно! Я неправильно истолковал проблему 🙂