2010-11-19 10 views
5

Escribí un código que debe optimizarse. Solo me apetecía consultar con la comunidad para ver si ese código es realmente óptimo. Llena el acumulador para la transformada Hough. De hecho, copié la mayoría del código de la biblioteca de OpenCV. ¡Gracias!llenado del acumulador para la transformada Hough


int i,j,n,index; 
for (i = 0;i<numrows;i++) 
{ 
    for (j = 0;j<numcols;j++) 
    { 
      if (img[i*numcols + j] == 100) 
     { 
      for (n = 300;n<600;n++) 
      { 
       index = cvRound(j*tabCos[n] + i * tabSin[n]) + (numrho-1)/2; 
       accum[(n+1) * (numrho+2) + index+1]++; 
      } 
     } 
    } 
} 
+0

¿tiene un ejemplo real de datos sobre los que aplicar este código? Parece que hay varias optimizaciones posibles, algunas son independientes de los datos, pero otras dependerán de la distribución real de datos en img y del tamaño de imag. – kriss

+0

un ejemplo de los datos que tengo está en http: // stackoverflow.com/questions/4372259/hough-transform-error-in-matlab-and-opencv me doy cuenta de que solo hay 3 puntos por columna (así es como creé esas imágenes), así que debería haber alguna manera de acelerarlo, pero la parte de tiempo consumido está llenando el acumulador y no pasando por la imagen – Denis

Respuesta

1

, no lo es. Reemplace la mayor cantidad posible de los usos de [] con aritmética de puntero simple para iterar las matrices en cuestión. Resume expresiones invariantes en variables locales.

Sin embargo, la primera pregunta es, ¿su perfil muestra que este código es un cuello de botella en el contexto de toda su aplicación. Si no, ¿por qué molestarse micro-optimizando esto?

EDIT: bucle micro-optimización - prefieren la segunda ya que no requiere la indexación de matrices (mult frente añadir)

int ints[100]; 
int i; 
int *pi; 

for (i = 0; i < 100; ++i) 
{ 
    printf("%d", ints[i]); 
} 

for (pi = ints; pi < ints + 100; ++pi) 
{ 
    printf("%d", *pi); 
} 
+0

pensé [] y la aritmética simple del puntero sería equivalente desde el punto de vista del compilador, (* (accum + (n + 1) * (numrho + 2) + índice + 1)) ++; sería entonces equivalente a accum [(n + 1) * (numrho + 2) + index + 1] ++; ¿no? esta parte definitivamente es el cuello de botella en mi procesamiento, el resto del programa es muy simple. – Denis

+0

@denis - si eso es todo lo que hace, entonces sí, pero vea editar para un ejemplo –

+0

Lo siento, soy algo nuevo en este foro, ¿a qué edición se está refiriendo? – Denis

2

Hay una gran y repetitivo transformada de Hough en un trozo de código que estoy vagamente adjunto demasiado . El responsable de esa parte del código ha estado experimentando con matrices dispersas (en realidad, un C++ std::map introducido en el índice de la celda si entendí bien su presentación) para el acumulador con cierto éxito.

Supongo que la velocidad se relaciona con problemas de localidad de caché, y ciertamente depende de que los datos sean escasos.


Actualización: El software que se hace referencia anteriormente está destinado a servir para muchos experimentos de física de partículas, pero se utilizó originalmente en un proyecto de banco de pruebas (es decir, a pequeña escala). Como nos tomamos en serio la tarea de hacer proyectos más grandes y comenzamos a hacer Monte Carlo para ellos, la transformada Hough ha vuelto a ser una especie de cuello de botella incluso con la matriz dispersa.

Todavía no tenemos una solución, pero uno de los colegas encontró Gandalf que incluye "fast hough transform", que parece evaluar la transformación en forma de árbol cuádruple (en 2D, presumiblemente se usa un octárbol en 3D) para reducir el orden del trabajo. Probablemente vamos a experimentar con esto.

Otra actualización: Un colega finalmente implementó una transformación Hough progresiva y probabilística en nuestro código que actualmente parece ser la versión más rápida que tenemos. Funciona mejor si no requiere que cada punto se asigne a una línea.

+1

¿tiene un enlace al documento que habla sobre este enfoque? mi matriz es bastante escasa así que cabría perfectamente. – Denis

+0

@Denis: No. Este trabajo todavía está en curso, y como es el código de análisis para un experimento de física de partículas, es poco probable que haya un documento sobre el código en sí, aunque sospecho que entrará en la disertación del estudiante. – dmckee

+0

@Denis No conozco el enfoque reportado por dmckee pero el documento citado en Gandalf es: LI, Hungwen; LAVIN, Mark A .; LE MASTER, Ronald J. ** Transformación Fast Hough: un enfoque jerárquico. ** _Computer Vision, Graphics, and Image Processing_, 1986, 36.2: 139-161. –

0

Dependiendo de su aplicación, hay numerosas formas de optimizar la Transformación de Hough y es posible que el último código sea de bajo nivel. Comenzaría con HT aleatorizado o HT multirresolución, seguido de la fusión de aproximaciones híbridas. Creo que es mejor optimizar el algoritmo primero. El último paso sería utilizar la optimización del hardware como la memoria CAD.

Cuestiones relacionadas