Pregunta

He calculado el histograma (un simple conjunto 1d) para una escala de grises de imágenes 3D. Ahora me gustaría para calcular el gradiente para el este histograma en cada punto. Así que esto realmente significa que tenga que calcular el gradiente de una función 1D en ciertos puntos. Sin embargo no tengo una función. Entonces, ¿cómo puedo calcular con x e y valores concretos?

En aras de la simplicidad que probablemente podría explicar esto a mí en un ejemplo de histograma - por ejemplo, con los siguientes valores (x es la intensidad y la frecuencia y la intensidad de esta):

x1 = 1; y1 = 3

x2 = 2; y2 = 6

x3 = 3; y3 = 8

x4 = 4; y4 = 5

x5 = 5; y5 = 9

x6 = 6; Y6 = 12

x7 = 7; y7 = 5

x8 = 8; y8 = 3

x9 = 9; y9 = 5

x10 = 10; Y10 = 2

Sé que esto también es un problema de matemáticas, pero ya que necesito para resolverlo en C ++ que aunque se podía ayudarme aquí.

Gracias por su consejo Marc

¿Fue útil?

Solución

creo que se puede calcular el gradiente usando el mismo método utilizado en la detección de imagen Frontera (que es un cálculo del gradiente). Si el histograma está en un vector se puede calcular una aproximación del gradiente como *:

for each point in the histogram compute 
     gradient[x] = (hist[x+1] - hist[x])

Esta es una forma muy sencilla de hacerlo, pero no estoy seguro de si es la más exacta.

  • aproximación porque se está trabajando con datos discretos en lugar de continua

Editado

Otros operadores pueden hacer hincapié en las pequeñas diferencias (pequeños gradientes se hizo más hincapié en). Roberts deriva algoritmo de cálculo derivado:

lim delta -> 0 = f(x + delta) - f(x) / delta

delta tiende infinitamente a 0 (a fin de evitar 0 división), pero nunca es cero. Al igual que en la memoria del ordenador es imposible, el más pequeño que podemos obtener de Delta es 1 (ya que 1 es la distancia más pequeña entre los puntos en una imagen (o histograma)).

Sustituyendo

lim delta -> 0 to lim delta -> 1

obtenemos

f(x + 1) - f(x) / 1 = f(x + 1) - f(x) => vet[x+1] - vet[x]

Otros consejos

Dos generalmente se acerca aquí:

  1. una aproximación discreta a la derivada
  2. tomar el verdadero derivada de una función equipada

primer caso Proveedores:

g = (y_(i+1) - y_(i-1))/2*dx

en todos los puntos excepto los extremos, o uno de

g_left-end  = (y_(i+1) - y_i)/dx
g_right-end = (y_i - y_(i-1))/dx

donde dx es el espaciamiento entre los puntos X. (A diferencia de la definición igualmente correcta Andrés sugirió , éste es simétrica. Tanto si se importa o no depende de que utilice caso.)

En el segundo caso , ajuste un spline a sus datos [*], y solicitar a la biblioteca spline la derivada en el punto que desee.

[*] El uso de una biblioteca! No aplicar este mismo a menos que este es un proyecto de aprendizaje. Me usar RAÍZ porque ya tengo en mi máquina, pero es un paquete pesado bastante sólo para obtener una spline ...


Por último, si los datos no es claro, Må desea suavizar antes de hacer la detección pendiente. Eso fue persiguiendo a evitar el ruido, y sólo mira a cuestas a gran escala.

  1. Tome un poco de papel cuadrado y dibujar en ella el histograma. Dibuje también ejes vertical y horizontal a través del punto de su histograma 0,0.

  2. Tome una regla y, en cada punto que le interesa, gire el borde recto hasta que concuerda con su idea de lo que el gradiente en ese punto es. Es muy importante que usted hace esto, su definición de gradiente es el que usted desea.

  3. Una vez que el marcador está sobre el ángulo que desee dibujar una línea en ese ángulo.

  4. perpendiculares gota de cualquiera de los 2 puntos en la línea que acaba de dibujar. Será más fácil tomar el siguiente paso si la distancia horizontal entre los 2 puntos a los que decide es aproximadamente un 25% o más de la anchura de su histograma. A partir de los mismos 2 puntos dibujan líneas horizontales para intersectar el eje vertical del histograma.

  5. Sus líneas ahora definir un x-distancia y una y-distancia, es decir la longitud de la horizontal / vertical (respectivamente) ejes marcado por sus intersecciones con las perpendiculares líneas / horizontales. El gradiente desea es la ordenada en la distancia dividida por la distancia X.

Ahora, a traducir esto en código es muy sencillo, aparte del paso 2. Usted tiene que definir cuáles son los criterios para determinar lo que el gradiente en cualquier punto en el histograma es. opciones simples incluyen:

a) en cada punto, establecer su borde recto para pasar por el punto y el siguiente a su derecha;

b) en cada punto, establecer su borde recto para pasar por el punto y el siguiente a su izquierda;

c) en cada punto, dejó su borde recto para pasar a través del punto a la izquierda y el punto a la derecha.

Es posible que desee para investigar opciones más complejas tales como ajuste de una curva (tal como un polinomio de orden superior cuadrática o) a través de una serie de puntos en su histograma y usando el derivado de que para representar el gradiente.

Hasta que no entiende la pregunta sobre el papel evitar la codificación en C ++ o cualquier otra cosa. Una vez hecho entenderlo, la codificación debe ser trivial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top