проблемы с низким контрастом изображения (контрастное растяжение) в matplotlib

При чтении низкоконтрастного изображения автоматически берется такой пример:

In [1]: from PIL import Image
In [2]: import numpy as np
In [3]: import matplotlib.pyplot as plt
In [4]: img = Image.open('images/map.jpg')
In [5]: arr = np.asarray(img)
In [6]: plt.gray()
In [7]: plt.imshow(arr)
Out[7]: <matplotlib.image.AxesImage at 0x7f9c7e88f490>
In [8]: plt.show()

Вход

inputбольшой

График (без изменений, это автоматически с помощью matplotlib.)

plotбольшой

Потому что этот ввод отличается от графика без каких-либо изменений.

Мне нужно низкоконтрастное изображение для реализации алгоритма контрастного растяжения

Чтение книги amazon Digital Image Processing (Рафаэль С. Гонсалес, Ричард Э. Вудс)

PS: matplotlib конвертирует автоматически. Мне не нужно.


person neiesc    schedule 16.09.2013    source источник
comment
Вы знаете, как реализовать алгоритм, чтобы найти лучший контраст?   -  person Saullo G. P. Castro    schedule 17.09.2013
comment
Подождите, проблема в том, что вам нужно настроить вывод matplotlib или что вы действительно хотите реализовать алгоритм для этого? Если последнее выравнивание гистограммы Google   -  person YXD    schedule 17.09.2013
comment
В matplotlib автоматический мне не нужен. Я сам хочу реализовать алгоритм   -  person neiesc    schedule 17.09.2013
comment
Это здорово... но какой у тебя вопрос? Где ты застрял?   -  person YXD    schedule 17.09.2013
comment
matplotlib преобразует автоматически. Мне не нужно. Невозможно реализовать, потому что он преобразует автоматически (matplotlib).   -  person neiesc    schedule 17.09.2013


Ответы (1)


Если вам не нужно автоматическое масштабирование палитры, вы можете использовать vmin и vmax, чтобы установить предпочтительный диапазон, например:

plt.imshow(arr, vmin=0, vmax=255)

При отображении пустого массива matplotlib может автоматически знать только диапазон фактических входных данных (а не диапазон, из которого они были взяты), поэтому он берет полный диапазон input и сопоставляет его с полным выходной диапазон. Но если вам известен другой диапазон входных данных, вы можете указать его с помощью vmin и vmax.

person tom10    schedule 16.09.2013
comment
Хорошо. Уже смотрю код, который его использовал, но не обратил внимания. Откуда мне знать, какие vmax и vmax (представьте, что у меня их несколько разных типов). с этим? arr.min(), arr.max() (144, 225) Предположим, что vmin всегда равно 0? - person neiesc; 17.09.2013
comment
Я не совсем понимаю ваши комментарии, но для изображения обычно бывает так, что vmin=0. - person tom10; 17.09.2013
comment
@neiesc imshow по умолчанию использует vmin=min(arr) и vmax=max(arr). Обычно вы что-то знаете о входном значении, например, о максимальном и минимальном возможных значениях. Если ваши входные данные — это единица8, то минимум равен 0, а максимум — 255. - person tacaswell; 17.09.2013