2009-03-29 10 views
8

Si tengo una serie de píxeles, que van desde, por ejemplo, -500 hasta +1000, ¿cómo normalizaría todos los píxeles en el mismo degradado para que caigan dentro de un rango específico, digamos 0 y 255?¿Cómo normalizo una imagen?

Respuesta

25

Algunos pseudocódigo como éste escalaría linealmente los valores de una gama a otra

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 
} 
1

Algunos pseudo código puede ayudar:

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 

Ese es el código Python por cierto.

+5

Ese no es el código Python –

+0

Correcto, debería ser "para pixel_value en pixel_values:". Para mucho .NET ese día ... – jsapara

3

En primer lugar hacer que todo positivo. Si el mínimo es -500, agregue 500 a todos los valores. A continuación, el mínimo sería 0 y el máximo sería 1500.

entonces es sólo una regla de tres y lo tienes:

[value in 0,255] = 255*(Pixel/1500) 
6

Su pregunta no es muy clara, así que voy Supongamos que está realizando algún tipo de procesamiento de imágenes y los resultados que obtiene son valores de -500 a 1000 y ahora debe guardar el color en un archivo donde cada valor debe estar entre 0 y 255.

Cómo se hace esto es realmente muy dependiente en la aplicación, cuál es realmente el significado de los resultados y qué es exactamente lo que quiere hacer. Las dos opciones principales son:

  • abrazadera de los valores - nada debajo de 0 se reemplace por 0 y nada por encima de 255 se reemplaza por 255. Usted querrá hacer esto, por ejemplo, si el procesamiento de imágenes es una especie de interpolación que realmente no debería alcanzar estos valores
  • Normalización lineal - linealmente puede su valor mínimo a 0 y su valor máximo a 255. Por supuesto, primero tendrá que encontrar el mínimo y el máximo. Lo haces:

    v = (origv - min)/(max - min) * 255.0 
    

Lo que esto hace primero es el mapa de los valores a [0,1] y luego estirar de nuevo a [0,255].

Una tercera opción es mezclar y combinar estas dos opciones. Su aplicación puede exigir que trate los valores negativos como valores innecesarios y los fije en 0 y valores positivos para mapear linealmente a [0,255].

0

Crea dos variables, MinInputValue y MaxInputValue. Inicialice MinInputValue en un número positivo muy grande (más alto que el valor de píxel más grande que jamás haya visto) y MaxInputValue en un número negativo muy grande (menor que el valor de píxel más bajo que jamás haya visto).

Haz un bucle sobre cada píxel de la imagen. Para cada píxel, si el valor de píxel PixelValue es inferior a MinInputValue, configure MinInputValue en PixelValue. Si el valor del píxel es superior a MaxInputValue, configure MaxInputValue en PixelValue.

Crea una nueva variable, InputValueRange, y configúrala en MaxInputValue - MinInputValue.

Una vez hecho esto, vuelva a pasar cada píxel de la imagen.Para cada píxel PixelValue, calcule el valor de píxel de salida como 255.0 * (PixelValue - MinInputValue)/InputValueRange. Puede asignar este nuevo valor al original PixelValue, o puede establecer el píxel correspondiente en una imagen de salida del mismo tamaño.