Coincidencia de plantilla Halcon: plantilla de forma de escala isotrópica (explicación súper detallada)

necesitar

Considere la siguiente imagen, que tiene tres patrones de la misma forma pero de diferentes tamaños. La observación puede encontrar que los tres patrones tienen una relación de escala isotrópica. ¿Qué pasa si queremos probar la coincidencia de plantillas para identificar estos tres patrones? Halcon proporciona el operador create_scaled_shape_model() para abordar este escenario.
inserte la descripción de la imagen aquí

prototipo de función de operador

create_scaled_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

Descripción de parámetros

Plantilla : tipo de imagen, imagen de entrada cuyo dominio se utilizará para crear el modelo.

NumLevels : el número máximo de niveles de pirámide.
El número de niveles de la pirámide está determinado por el parámetro NumLevels. Los objetos deben elegirse lo más grandes posible, ya que el tiempo necesario para encontrarlos se reducirá considerablemente. Por otro lado, la elección de numlevel debe garantizar que el modelo siga siendo identificable y contenga un número suficiente de puntos (al menos 4) en el nivel más alto de la pirámide. Esto se puede verificar usando la salida de inspect_shape_model. Si no se generan suficientes puntos de modelo, el número de niveles de pirámide se reduce internamente hasta que se encuentran suficientes puntos de modelo en el nivel de pirámide más alto. Si este proceso da como resultado un modelo sin niveles de pirámide, es decir, si el número de puntos del modelo en el nivel de pirámide más bajo ya es demasiado bajo, create_scaled_shape_model devolverá un mensaje de error. Si NumLevels se establece en 'auto' (o 0 para compatibilidad con versiones anteriores), create_scaled_shape_model determina automáticamente el número de niveles de la pirámide. El número de niveles de pirámide calculado automáticamente se puede consultar utilizando get_shape_model_params. En casos excepcionales, puede ocurrir que el valor de create_scaled_shape_model que determina el número de niveles de la pirámide sea demasiado grande o demasiado pequeño. Si la cantidad de capas en la pirámide es demasiado grande, es posible que el modelo no se reconozca en la imagen o que sea necesario seleccionar parámetros muy bajos para MinScore o Greediness en find_scaled_shape_model para encontrar el modelo. Si se eligen muy pocos niveles de pirámide, el tiempo requerido para encontrar el modelo en find_scaled_shape_model puede aumentar. En estos casos, la salida de inspect_shape_model debe usarse para elegir el número de niveles de la pirámide.

AngleStart : El ángulo de rotación mínimo del patrón.
AngleExtent : la extensión del ángulo de rotación.
AngleStep : El tamaño de paso para cada rotación del ángulo.
Los parámetros AngleStart y AngleExtent determinan el rango de rotación posible dentro del cual el modelo puede aparecer en la imagen. Tenga en cuenta que el modelo solo se puede encontrar dentro de este rango de ángulo a través de find_scaled_shape_model. El parámetro AngleStep determina el tamaño del paso dentro del rango de ángulo seleccionado. Por lo tanto, si no se especifica la precisión de subpíxeles en find_scaled_shape_model, este parámetro especifica la precisión alcanzable de los ángulos en find_scaled_shape_model. AngleStep debe elegirse en función del tamaño del objeto. Los modelos más pequeños no tienen muchas rotaciones discretas diferentes en la imagen, por lo que se debe elegir un AngleStep más grande para los modelos más pequeños. Si AngleExtent no es un múltiplo entero de AngleStep, modifique AngleStep en consecuencia. Para garantizar que find_scaled_shape_model no devuelva instancias de modelo con un valor de ángulo de rotación de exactamente 0,0, el rango de rotación posible se modifica de la siguiente manera: Si no hay un entero positivo n tal que AngleStart más n veces AngleStep sea exactamente 0,0, AngleStart se reduce hasta AngleStep y AngleExtent agregado a AngleStep.

ScaleMin : La escala mínima del patrón.
ScaleMax : La escala máxima del patrón.
ScaleStep : el tamaño de paso por el que se escala el patrón cada vez.
Los parámetros ScaleMin y ScaleMax determinan el rango de posibles escalas (dimensiones) del modelo. Una escala de 1 corresponde al tamaño original del modelo. El parámetro ScaleStep determina el tamaño del paso en el rango seleccionado. Por lo tanto, si no se especifica la precisión de subpíxeles en find_scaled_shape_model, este parámetro especifica la precisión alcanzable por la escala en find_scaled_shape_model. Al igual que AngleStep, ScaleStep debe elegirse en función del tamaño del objeto. Si el rango de escalas no es un múltiplo entero de ScaleStep, ScaleStep se modificará en consecuencia. Para garantizar que el valor de escala devuelto por find_scaled_shape_model no sea una instancia de modelo que sea exactamente 1,0, el rango de escala posible se modifica de la siguiente manera: Si no hay un entero positivo n tal que ScaleMin más n veces ScaleStep sea exactamente 1,0, entonces ScaleMin disminuirá a ScaleStep y ScaleMax aumentará, por lo que ScaleStep aumentará el rango posible.

Optimización : un método de optimización opcional al generar el modelo.
Para modelos particularmente grandes, puede ser útil reducir la cantidad de puntos del modelo configurando Optimización en un valor que no sea "ninguno". Si Optimización = 'ninguno', almacene todos los puntos del modelo. En todos los demás casos, el número de puntos se reducirá de acuerdo con el valor de la Optimización. Si el número de puntos disminuye, es posible que deba establecer el parámetro Greediness en find_scaled_shape_model en un valor más pequeño, por ejemplo, 0,7 o 0,8. Para modelos pequeños, la reducción en el número de puntos del modelo no da como resultado una búsqueda más rápida, ya que en este caso normalmente es necesario examinar más instancias potenciales del modelo. Si la Optimización se establece en 'auto', create_scaled_shape_model determina automáticamente la reducción en el número de puntos del modelo.

Métrica : el parámetro Métrica determina qué barras reconocerá el modelo en la imagen
Si Metric = 'use_polarity', el objeto y el modelo en la imagen deben tener el mismo contraste. Por ejemplo, si el modelo es un objeto brillante sobre un fondo negro, solo se descubrirá si ese objeto también es más brillante que el fondo. Si Metric = 'ignore_global_polarity', el objeto también se encontrará en la imagen si el contraste se invierte globalmente. En el ejemplo anterior, el objeto también se encontrará si el color del objeto es más oscuro que el fondo. En este caso, el tiempo de ejecución de find_scaled_shape_model aumenta ligeramente. Si Metric = 'ignore_local_polarity', el modelo se encontrará incluso si el contraste cambia localmente. Este modo se puede utilizar, por ejemplo, si el objeto consta de una parte con valores de gris medio, con subobjetos más oscuros o más claros. Debido a que el tiempo de ejecución de find_scaled_shape_model aumenta significativamente en este caso, generalmente es mejor crear varios modelos para reflejar los posibles cambios de contraste del objeto create_scaled_shape_model y combinarlos con find_scaled_shape_model al mismo tiempo. Las tres métricas anteriores solo se pueden aplicar a imágenes de un solo canal. Si usa una imagen multicanal como imagen modelo o imagen de búsqueda, solo se usa el primer canal (y no se devuelve ningún mensaje de error). Si Metric = 'ignore_color_polarity', el modelo se encontrará incluso si el contraste de color cambia localmente. Por ejemplo, si partes de objetos pueden cambiar su color, por ejemplo, de rojo a verde. En particular, este modo es útil si no sabe de antemano en qué canales será visible el objeto. El tiempo de ejecución de find_scaled_shape_model también aumenta significativamente en este modo. La métrica 'ignore_color_polarity' se puede utilizar para cualquier número de imágenes de canal. Tiene el mismo efecto que 'ignore_local_polarity' si se usa para imágenes de un solo canal. Tenga en cuenta que para Métrica = ' ignore_color_polarity', la cantidad de canales puede ser diferente entre los modelos creados con create_scaled_shape_model y buscados con find_scaled_shape_model. Esto se puede usar, por ejemplo, para crear modelos a partir de imágenes de un solo canal generadas sintéticamente. Además, debe tenerse en cuenta que los canales no necesitan contener subdivisiones espectrales de luz (como en una imagen RGB). Por ejemplo, un canal también puede contener imágenes del mismo objeto obtenidas al iluminar el objeto desde diferentes direcciones.

Contraste : Umbral o umbral de histéresis para el contraste y, opcionalmente, el tamaño mínimo de los objetos coincidentes en la imagen de la plantilla.
El parámetro contraste determina el contraste que deben tener los puntos del modelo. El contraste es una medida de la diferencia en los valores de gris locales entre un objeto y el fondo y entre diferentes partes de un objeto. Los contrastes deben elegirse de modo que solo las características importantes de la plantilla se utilicen para el modelo. El contraste también puede contener tuplas con dos valores. En este caso, el modelo se segmenta mediante un método similar al método de umbral de histéresis utilizado en edge_image. Aquí, el primer elemento de la tupla determina el umbral inferior, mientras que el segundo elemento determina el umbral superior. Consulte hysteresis_threshold para obtener más información sobre el método de umbral de histéresis. El contraste contiene opcionalmente el tercer valor como el último elemento de la tupla. Este valor determina el umbral para seleccionar componentes de modelo importantes en función de su tamaño, es decir, se suprimirán los componentes con puntos más pequeños que el tamaño mínimo especificado. Para cada nivel de pirámide sucesivo, el umbral de tamaño mínimo se divide por 2. Los umbrales de histéresis no se deben implementar si se deben suprimir los componentes del modelo pequeño, pero se deben especificar tres valores en la comparación. En este caso, los dos primeros valores simplemente se pueden establecer en el mismo valor. El efecto de este parámetro se puede inspeccionar de antemano usando inspect_shape_model. Si el contraste se establece en 'automático', create_scaled_shape_model determina automáticamente los tres valores descritos anteriormente. Alternativamente, solo el contraste ('auto_contrast'), el umbral de histéresis ('auto_contrast_hyst') o el tamaño mínimo ('auto_min_size') pueden determinarse automáticamente. Los valores restantes que no se determinan automáticamente también se pueden pasar como tuplas. También se permiten varias combinaciones: por ejemplo, si se pasa ['auto_contrast', 'auto_min_size'], tanto el contraste como el tamaño mínimo se determinan automáticamente. Si pasa ['auto_min_size', 20, 30], el tamaño mínimo se determina automáticamente, mientras que los umbrales de histéresis se establecen en 20 y 30, y así sucesivamente. En algunos casos, la determinación automática del umbral de contraste puede resultar insatisfactoria. Por ejemplo, si ciertos componentes del modelo deben incluirse o suprimirse por razones específicas de la aplicación, o si el objeto contiene varios contrastes diferentes, entonces se debe preferir la configuración manual de estos parámetros. Por lo tanto, el umbral de contraste debe determinarse automáticamente usando determine_shape_model_params y validado usando inspect_shape_model antes de llamar a create_scaled_shape_model.

MinContrast : el contraste mínimo de los objetos coincidentes en la imagen que se va a buscar.
Usando MinContrast, es posible determinar al menos qué contraste debe tener el modelo en el reconocimiento realizado por find_scaled_shape_model. En otras palabras, este parámetro separa el modelo del ruido en la imagen. Por lo tanto, una buena opción es el rango de cambios de valores de gris en la imagen causados ​​por el ruido. Por ejemplo, si el valor de gris fluctúa dentro de 10 niveles de gris, MinContrast debe establecerse en 10. Si el modelo y las imágenes de búsqueda utilizan imágenes multicanal, y el parámetro Métrica está establecido en 'ignorar_color_polaridad' (ver arriba), el ruido en un canal debe multiplicarse por la raíz cuadrada del número de canales para determinar el contraste mínimo. Por ejemplo, si en un canal los valores de gris fluctúan dentro de 10 niveles de gris y la imagen es una imagen de tres canales, MinContrast debe establecerse en 17. Obviamente, MinContrast debe ser menor que Contrast. Si el modelo se va a reconocer en imágenes de muy bajo contraste, el contraste mínimo debe establecerse en un valor correspondientemente pequeño. Para garantizar que find_scaled_shape_model pueda extraer la posición y la rotación del modelo de manera sólida y precisa, y para identificar el modelo en el caso de una oclusión severa, MinContrast debe ser ligeramente mayor que el rango de fluctuación del valor de gris causado por el ruido. Si el contraste mínimo se establece en "automático", el contraste mínimo se determina automáticamente en función del ruido en la imagen del modelo. Por lo tanto, el juicio automático solo tiene sentido cuando el ruido de la imagen en el proceso de reconocimiento es similar al ruido en la imagen del modelo. Además, en algunos casos puede ser deseable aumentar el valor determinado automáticamente para aumentar la robustez a la oclusión (ver arriba). El contraste mínimo calculado automáticamente se puede consultar utilizando get_shape_model_params.

ModelID : ModelID es el identificador de este modelo, se usa en llamadas posteriores a find_scaled_shape_model

Opcionalmente, se puede pasar un segundo valor en Optimización. Este valor determina si el modelo está completamente pregenerado. Para esto, el segundo valor de Optimización debe establecerse en 'pregeneración' o 'no_pregeneración'. Si no se usa el segundo valor (es decir, si solo se pasa un valor), se usa el modo establecido por set_system('pregenerate_shape_models', ...). Con el valor predeterminado ('pregenerate_shape_models' = 'false'), los modelos no se generan completamente previamente. La pregeneración completa del modelo generalmente da como resultado un tiempo de ejecución ligeramente más bajo porque no es necesario transformar el modelo en el tiempo de ejecución. Sin embargo, en este caso, los requisitos de memoria y el tiempo necesario para crear el modelo son mucho mayores. También se debe tener en cuenta que no se puede esperar que los dos modos devuelvan exactamente los mismos resultados, ya que convertir el modelo en tiempo de ejecución necesariamente hará que los datos internos del modelo convertido difieran de los datos internos del modelo convertido generado previamente. Por ejemplo, si el modelo no está completamente pregenerado, find_scaled_shape_model generalmente devolverá una puntuación ligeramente más baja, lo que puede requerir establecer MinScore en un valor ligeramente más bajo que un modelo completamente pregenerado. Además, la pose obtenida por interpolación puede ser ligeramente diferente en las dos modalidades. Si se requiere la máxima precisión, la pose del modelo debe determinarse mediante un ajuste de mínimos cuadrados.
Si se selecciona la generación previa del modelo completo, el modelo se genera previamente y se almacena en la memoria para el ángulo y el rango de escala seleccionados. La memoria requerida para almacenar el modelo es proporcional al orden angular, el orden de escala y el número de puntos en el modelo. Por lo tanto, si AngleStep o ScaleStep es demasiado pequeño, o si la extensión de AngleExtent o la escala es demasiado grande, puede ocurrir que el modelo ya no quepa en la memoria (virtual). En este caso, AngleStep o ScaleStep deben ampliarse, o AngleExtent o el rango de zoom deben reducirse. En cualquier caso, es deseable que el modelo encaje perfectamente en la memoria principal, ya que esto evita la paginación por parte del SO, por lo que el tiempo para encontrar el objeto será mucho menor. Dado que los ángulos se pueden determinar con una resolución de subpíxeles a través de find_scaled_shape_model, AngleStep >= 1° y ScaleStep >= 0.02 se pueden seleccionar para modelos con diámetros inferiores a 200 píxeles. Si se selecciona AngleStep = 'auto' o ScaleStep = 'auto' (o 0 para compatibilidad con versiones anteriores en ambos casos), create_scaled_shape_model determina automáticamente el ángulo o el paso de escala apropiado, respectivamente, en función del tamaño del modelo. Los ángulos calculados automáticamente y los pasos de escala se pueden consultar mediante get_shape_model_params.
Si no se selecciona la generación previa de un modelo completo, el modelo solo se crea en la pose de referencia en cada nivel de pirámide. En este caso, el modelo debe convertirse a diferentes ángulos y escalas en find_scaled_shape_model en tiempo de ejecución. Por lo tanto, puede llevar un poco más de tiempo identificar el modelo.
Tenga en cuenta que los modelos de forma generados previamente se personalizan para un tamaño de imagen específico. Por razones de tiempo de ejecución, no se admite el uso de imágenes de diferentes tamaños en paralelo durante el proceso de búsqueda del mismo modelo. En este caso, se debe usar una copia del mismo modelo, de lo contrario, ¡el programa puede bloquearse!

Ejemplo de explicación

1. Lee la imagen

read_image (Image, 'green-dot')

2. Análisis de blobs para generar el ROI que creará la plantilla

*二值化
threshold (Image, Region, 0, 128)
*连通域分割
connection (Region, ConnectedRegions)
*处于面积过滤
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10000, 20000)
*填补区域
fill_up (SelectedRegions, RegionFillUp)
*膨胀
dilation_circle (RegionFillUp, RegionDilation, 5.5)
*ROi区域裁剪
reduce_domain (Image, RegionDilation, ImageReduced)

3. Crea una plantilla

create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 'auto', 0.8, 1.0, 'auto', 'none', 'ignore_global_polarity', 40, 10, ModelID)

4. Obtenga el esquema XLD de la plantilla

get_shape_model_contours (Model, ModelID, 1)

5. Normaliza el perfil XLD

*获取ROI的重心和角度
area_center (RegionFillUp, Area, RowRef, ColumnRef)
*计算仿射变换矩阵
vector_angle_to_rigid (0, 0, 0, RowRef, ColumnRef, 0, HomMat2D)
*对XLD轮廓仿射变换。
affine_trans_contour_xld (Model, ModelTrans, HomMat2D)

6. Vuelva a leer la nueva imagen para hacer coincidir la plantilla

read_image (ImageSearch, 'green-dots')
find_scaled_shape_model (ImageSearch, ModelID, rad(-45), rad(90), 0.8, 1.0, 0.5, 0, 0.5, 'least_squares', 5, 0.8, Row, Column, Angle, Scale, Score)

7. Realice una transformación afín en todos los contornos XLD buscados que cumplan las condiciones

for I := 0 to |Score| - 1 by 1
    hom_mat2d_identity (HomMat2DIdentity)
    hom_mat2d_translate (HomMat2DIdentity, Row[I], Column[I], HomMat2DTranslate)
    hom_mat2d_rotate (HomMat2DTranslate, Angle[I], Row[I], Column[I], HomMat2DRotate)
    hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], Row[I], Column[I], HomMat2DScale)
    affine_trans_contour_xld (Model, ModelTrans, HomMat2DScale)
    dev_display (ModelTrans)
endfor

8. Limpia el mango del modelo .

clear_shape_model (ModelID)

Efecto:

inserte la descripción de la imagen aquí

Código completo:

read_image (Image, 'green-dot')
threshold (Image, Region, 0, 128)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10000, 20000)
fill_up (SelectedRegions, RegionFillUp)
dilation_circle (RegionFillUp, RegionDilation, 5.5)
reduce_domain (Image, RegionDilation, ImageReduced)
create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 'auto', 0.8, 1.0, 'auto', 'none', 'ignore_global_polarity', 40, 10, ModelID)
get_shape_model_contours (Model, ModelID, 1)
area_center (RegionFillUp, Area, RowRef, ColumnRef)
vector_angle_to_rigid (0, 0, 0, RowRef, ColumnRef, 0, HomMat2D)
affine_trans_contour_xld (Model, ModelTrans, HomMat2D)
read_image (ImageSearch, 'green-dots')
find_scaled_shape_model (ImageSearch, ModelID, rad(-45), rad(90), 0.8, 1.0, 0.5, 0, 0.5, 'least_squares', 5, 0.8, Row, Column, Angle, Scale, Score)
for I := 0 to |Score| - 1 by 1
    hom_mat2d_identity (HomMat2DIdentity)
    hom_mat2d_translate (HomMat2DIdentity, Row[I], Column[I], HomMat2DTranslate)
    hom_mat2d_rotate (HomMat2DTranslate, Angle[I], Row[I], Column[I], HomMat2DRotate)
    hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], Row[I], Column[I], HomMat2DScale)
    affine_trans_contour_xld (Model, ModelTrans, HomMat2DScale)
    dev_display (ModelTrans)
endfor
clear_shape_model (ModelID)```


Supongo que te gusta

Origin blog.csdn.net/weixin_44901043/article/details/123544462
Recomendado
Clasificación