Как мне нормализовать изображение?

Если у меня есть серия пикселей, которые варьируются от -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или вы можете установить соответствующий пиксель в выходном изображении того же размера.

Другие вопросы по тегам