На ваш вопрос есть два ответа:
- Сугубо технический (тот, на который @DonQuiKong пытается ответить), относящийся к тому, как сделать растяжение, на которое вы ссылаетесь, проще или правильнее.
- Другой неявный и пытается ответить вам на актуальную проблему растяжения изображения.
Я сосредотачиваюсь на втором случае здесь. Судя по предоставленному образцу изображения, вы не используете правильный подход. Давайте рассмотрим предоставленные вами образцы, которые действительно имеют все значения интенсивности в диапазоне от 0 до 100 (из-за захвата экрана на моем компьютере они не отображаются, но это зависит от степени экрана). Ваш метод кажется правильным и должен работать с небольшими ошибками.
1) Например, небольшая ошибка:
newimg = img
не делает то, что вы думаете, что делает. Это создает псевдоним исходной переменной. Использование:
newimg = img.copy()
вместо.
2) Если изображение с разными границами приходит к вам, ваш код нарушен. По какой-то причине он будет игнорировать некоторые пиксели, и это не то, что вы хотели.
3) Требуемое растяжение можно применить ко всему изображению в этом случае, используя что-то вроде:
newimg -= np.min(newimg)
newimg /= np.max(newimg)
, который просто растягивает вашу интенсивность до границы 0-255.
4) Судя по вашим образцам изображений, вам также необходимо более радикальное растяжение (которое приведет к потере части информации об изображении для увеличения контрастности изображения). Вместо вышеперечисленного вы можете использовать нижний предел:
newimg -= np.min(newimg)
newimg /= (np.max(newimg) * 0.5)
Это эффективно «прожигает» некоторые пиксели, но в вашем случае результат выглядит ближе к желаемому. Кроме того, вы можете применить нелинейное отображение (например, логарифмическое) старых интенсивностей к новым, и вы не получите никаких «прожженных» пикселей.
Образец со значением 0,5: