OpenCV copyMakeBorder изменяет значение оттенков серого

#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. Да, действительно! Я неправильно истолковал проблему 🙂