Повышение контрастности с использованием процентного кумулятивного счета в Matplolib - PullRequest
0 голосов
/ 28 февраля 2020

Я пишу небольшую программу для выравнивания изображений на основе выбранных вручную точек и отображаю оба изображения рядом друг с другом. Чтобы иметь одинаковые цвета для одинаковых растровых значений, я бы хотел растянуть цветовую полосу до одинаковых значений для обоих изображений. В QGIS есть возможность использовать кумулятивное сокращение отсчета, где вы можете вводить проценты для повышения контрастности растра. QGIS screenshot Я хотел бы найти соответствующие (2% и 98%) растровые значения в моем одноканальном растровом изображении, используя matplotlib. Тогда я бы использовал наименьшее значение 2% и наибольшее значение 98% в качестве vmin и vmax для моих изображений.

Я не могу найти функцию в matplotlib, так что у кого-нибудь есть предложение?

1 Ответ

1 голос
/ 28 февраля 2020

То, что вы ищете, это процентиль функция.

Вместо использования matplotlib вы можете использовать некоторую математику для получения желаемого результата.

Нижний и верхний процентили можно найти с помощью функции percentile и линейного растягивания диапазона пикселей между нижним и верхним процентилями.

Вот пример кода:

import cv2
import numpy as np

img = cv2.imread('chelsea.png', cv2.IMREAD_GRAYSCALE)  # Read input image for testing

min_percent = 2   # Low percentile
max_percent = 98  # High percentile
lo, hi = np.percentile(img, (min_percent, max_percent))

# Apply linear "stretch" - lo goes to 0, and hi goes to 1
res_img = (img.astype(float) - lo) / (hi-lo)

#Multiply by 255, clamp range to [0, 255] and convert to uint8
res_img = np.maximum(np.minimum(res_img*255, 255), 0).astype(np.uint8)

#Display images before and after linear "stretch":
cv2.imshow('img', img)
cv2.imshow('res_img', res_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Результат:

Исходное изображение:
enter image description here

Выходное изображение:
enter image description here

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