Как мне нормализовать изображение?
Если у меня есть серия пикселей, которые варьируются от -500 до +1000, как бы я нормализовал все пиксели с одинаковым градиентом, чтобы они попадали между определенным диапазоном, скажем, 0 и 255?
5 ответов
Такой псевдокод, как этот, будет линейно масштабировать значения из одного диапазона в другой.
oldmin=-500
oldmax=1000
oldrange=oldmax-oldmin;
newmin=0
newmax=255;
newrange=newmax-newmin;
foreach(oldvalue)
{
//where in the old scale is this value (0...1)
scale=(oldvalue-oldmin)/oldrange;
//place this scale in the new range
newvalue=(newrange*scale)+newmin
}
Ваш вопрос не очень ясен, поэтому я собираюсь предположить, что вы выполняете какую-то обработку изображения, и в результате вы получаете значения от -500 до 1000, и теперь вам нужно сохранить цвет в файл, где каждое значение должно быть между 0 и 255.
То, как вы это делаете, зависит от приложения, каков смысл результатов и что именно вы хотите сделать. Два основных варианта:
- Зафиксируйте значения - все, что ниже 0, вы заменяете на 0, а все, что выше 255, вы заменяете на 255. Вы можете сделать это, например, если ваша обработка изображений представляет собой какую-то интерполяцию, которая на самом деле не должна достигать этих значений
Линейная нормализация - линейно может ваше минимальное значение равно 0, а максимальное - 255. Конечно, сначала вам нужно найти минимальное и максимальное значения. Ты сделаешь:
v = (origv - min)/(max - min) * 255.0
Что это делает, это сначала сопоставить значения [0,1]
а затем растянуть их обратно [0,255]
,
Третий вариант - смешивать и сочетать эти два варианта. Ваше приложение может потребовать, чтобы вы рассматривали отрицательные значения как ненужные и привязывали их к 0, а положительные значения для линейного отображения [0,255]
,
Сначала сделайте все это позитивным. Если минимум -500, то добавьте 500 ко всем значениям. Тогда минимум будет 0, а максимум будет 1500.
Тогда это просто правило трех, и у вас есть это:
[value in 0,255] = 255*(Pixel/1500)
Некоторый псевдокод может помочь:
foreach( pixel_value in pixel_values): # between -500 and 1000
position = (pixel_value + 500) / 1500 # gives you a 0 to 1 decimal
new_value = int(postion * 255) # or instead of casting, you could round it off
Это код Python, кстати.
Создайте две переменные, MinInputValue
а также MaxInputValue
, инициализировать MinInputValue
на очень большое положительное число (больше, чем наибольшее значение пикселя, которое вы когда-либо ожидали увидеть) и MaxInputValue
очень большое отрицательное число (ниже, чем самое низкое значение пикселя, которое вы когда-либо ожидали увидеть).
Обведите все пиксели изображения. Для каждого пикселя, если значение пикселя PixelValue
ниже чем MinInputValue
, задавать MinInputValue
в PixelValue
, Если значение пикселя выше, чем MaxInputValue
, задавать MaxInputValue
в PixelValue
,
Создать новую переменную, InputValueRange
и установите его в MaxInputValue - MinInputValue
,
Как только это будет сделано, снова обведите все пиксели изображения. За каждый пиксель PixelValue
рассчитать значение выходного пикселя как 255.0 * (PixelValue - MinInputValue) / InputValueRange
, Вы можете присвоить это новое значение обратно оригиналу PixelValue
или вы можете установить соответствующий пиксель в выходном изображении того же размера.