stringtranslate.com

Algoritmo de Hoshen-Kopelman

El algoritmo de Hoshen-Kopelman es un algoritmo simple y eficiente para etiquetar conglomerados en una cuadrícula, donde la cuadrícula es una red regular de celdas, con celdas ocupadas o desocupadas. Este algoritmo se basa en un conocido algoritmo de búsqueda de uniones . [1] El algoritmo fue descrito originalmente por Joseph Hoshen y Raoul Kopelman en su artículo de 1976 "Percolation and Cluster Distribution. I. Cluster Multiple Labeling Technique and Critical Concentration Algorithm". [2]

Teoría de la percolación

La teoría de la percolación es el estudio del comportamiento y las estadísticas de los cúmulos en redes . Supongamos que tenemos una gran red cuadrada donde cada celda puede estar ocupada con la probabilidad p y puede estar vacía con la probabilidad . Cada grupo de celdas vecinas ocupadas forma un cúmulo. Los vecinos se definen como celdas que tienen un lado común pero no aquellas que comparten solo una esquina, es decir, consideramos el vecindario 4-conectado que es superior, inferior, izquierdo y derecho. Cada celda ocupada es independiente del estado de su vecindario. El número de cúmulos, el tamaño de cada cúmulo y su distribución son temas importantes en la teoría de la percolación.1 – p

Algoritmo de Hoshen-Kopelman para la búsqueda de grupos

En este algoritmo, escaneamos una cuadrícula en busca de celdas ocupadas y las etiquetamos con etiquetas de grupo. El proceso de escaneo se denomina escaneo raster . El algoritmo comienza escaneando la cuadrícula celda por celda y verificando si la celda está ocupada o no. Si la celda está ocupada, entonces debe etiquetarse con una etiqueta de grupo. Esta etiqueta de grupo se asigna en función de los vecinos de esa celda. (Para esto, vamos a utilizar el algoritmo Union-Find que se explica en la siguiente sección). Si la celda no tiene ningún vecino ocupado, entonces se le asigna una nueva etiqueta. [3]

Algoritmo de unión-descubrimiento

Este algoritmo es un método simple para calcular clases de equivalencia . Al llamar a la función , union(x,y)se devuelve si los elementos xy yson miembros de la misma clase de equivalencia. Debido a que las relaciones de equivalencia son transitivas , todos los elementos equivalentes a xson equivalentes a todos los elementos equivalentes a y. Por lo tanto, para cualquier elemento x, hay un conjunto de elementos que son todos equivalentes a x(llamado la clase de equivalencia). Una segunda función find(x)devuelve un miembro representativo de la clase de equivalencia a la que xpertenece.

Pseudocódigo

Durante el escaneo de la cuadrícula, cada vez que se encuentra una celda ocupada, se escanean las celdas vecinas para verificar si alguna de ellas ya ha sido escaneada. Si encontramos celdas vecinas ya escaneadas, unionse realiza la operación para especificar que estas celdas vecinas son, de hecho, miembros de la misma clase de equivalencia. Luego, findse realiza la operación para encontrar un miembro representativo de esa clase de equivalencia con el que se etiquetará la celda actual.

Por otro lado, si la celda actual no tiene vecinas, se le asigna una nueva etiqueta que no se haya utilizado anteriormente. De esta manera se procesa toda la cuadrícula.

El siguiente pseudocódigo hace referencia a la implementación del mismo algoritmo por parte de Tobin Fricke. [3]

Escaneo de trama y etiquetado en la cuadrículaetiqueta_más_grande = 0;etiqueta = ceros[n_columnas, n_filas]etiquetas = [0:n_columnas*n_filas] /* Matriz que contiene números enteros desde 0 hasta el tamaño de la imagen. */para x en 0 a n_columnas { para y en 0 a n_filas { si está ocupado[x, y] entonces izquierda = etiqueta[x-1, y]; arriba = etiqueta[x, y-1]; si (izquierda == 0) y (arriba == 0) entonces /* Ni una etiqueta arriba ni a la izquierda. */ largest_label = largest_label + 1; /* Crea una nueva etiqueta de clúster aún no utilizada. */ etiqueta[x, y] = etiqueta_más_grande; de lo contrario si (izquierda != 0) y (arriba == 0) entonces /* Un vecino, a la izquierda. */ etiqueta[x, y] = buscar(izquierda); de lo contrario si (izquierda == 0) y (arriba != 0) entonces /* Un vecino, arriba. */ etiqueta[x, y] = buscar(arriba); else /* Vecinos TANTO a la izquierda como a arriba. */ union(left,above); /* Vincula los clústeres izquierdo y superior. */ etiqueta[x, y] = buscar(izquierda); }}Uniónanular unión(int x, int y) { etiquetas[find(x)] = find(y);}Encontrarint buscar(int x) { int y = x; mientras (etiquetas[y] != y) y = etiquetas[y]; mientras (etiquetas[x] != x) { int z = etiquetas[x]; etiquetas[x] = y; x = z; } devuelve y;}

Ejemplo

Considere el siguiente ejemplo. Las celdas oscuras en la cuadrícula figure (a)representan que están ocupadas y las blancas están vacías. Por lo tanto, al ejecutar el algoritmo H–K en esta entrada, obtendríamos el resultado que se muestra en figure (b)con todos los clústeres etiquetados.

El algoritmo procesa la cuadrícula de entrada, celda por celda, de la siguiente manera: Digamos que la cuadrícula es una matriz bidimensional.

Aplicaciones

Véase también

Referencias

  1. ^ https://www.cs.princeton.edu/~rs/AlgsDS07/01UnionFind.pdf [ URL básica PDF ]
  2. ^ Hoshen, J.; Kopelman, R. (15 de octubre de 1976). "Percolación y distribución de cúmulos. I. Técnica de etiquetado múltiple de cúmulos y algoritmo de concentración crítica". Phys. Rev. B . 14 (8): 3438–3445. Código Bibliográfico :1976PhRvB..14.3438H. doi :10.1103/PhysRevB.14.3438 – vía APS.
  3. ^ ab Fricke, Tobin (21 de abril de 2004). "El algoritmo Hoshen-Kopelman para la identificación de clústeres". ocf.berkeley.edu . Consultado el 17 de septiembre de 2016 .
  4. ^ Christian Joas. "Introducción al algoritmo Hoshen-Kopelman y su aplicación a las estadísticas del dominio nodal" (PDF) . Webhome.weizmann.ac.il . Consultado el 17 de septiembre de 2016 .
  5. ^ "Agrupamiento" (PDF) .
  6. ^ "Agrupamiento de c-medias difusas".