Conceptos básicos de Opencv 54 - Comparación de contornos utilizando algoritmos de escena de formas - cv2.createShapeContextDistanceExtractor()

注意:新版本的opencv 4 已经没有这个函数 cv2.createShapeContextDistanceExtractor()

Un algoritmo de escena de forma es un método para comparar contornos o formas. Este algoritmo se usa a menudo para calcular la similitud o la diferencia entre dos formas y para encontrar la mejor coincidencia.

Aquí hay un flujo de trabajo básico para comparar contornos, usando el algoritmo Shape Scene:

  1. Preparación de datos : primero, debe preparar los datos de contorno de dos formas. Los contornos se pueden expresar como una serie de coordenadas de puntos o representaciones más avanzadas, como curvas paramétricas, etc.

  2. Extracción de características : para cada forma, puede usar descriptores de forma o algoritmos de extracción de características para convertir los datos de contorno en un conjunto de características numéricas que caracterizan la forma. Estas características pueden ser la curvatura, la longitud, el ángulo, etc. de la forma.

  3. Medida de similitud : elija una medida de similitud para comparar las características de dos formas. Los métodos comunes incluyen la distancia euclidiana, la distancia de Manhattan, la similitud del coseno, etc. Estas métricas convierten las características de dos formas en una puntuación de similitud, donde las puntuaciones más altas indican formas más similares.

  4. Coincidencia y optimización : si desea encontrar la mejor coincidencia de forma, puede usar un algoritmo de optimización para ajustar una forma para que sea más similar a otra forma. Esto puede implicar transformaciones tales como escalado, rotación, traslación, etc. de la forma.

  5. Visualización e interpretación : finalmente, puede visualizar dos formas, mostrando en qué se parecen y qué ha cambiado durante el proceso de emparejamiento. Esto se puede hacer dibujando formas, mostrando transformaciones, etc.

Es importante tener en cuenta que la elección del algoritmo de escena de forma depende del problema específico y los datos con los que se está tratando. Diferentes algoritmos pueden funcionar mejor en diferentes escenarios. Algunos algoritmos de comparación de formas comúnmente utilizados incluyen métodos basados ​​en coincidencia de contornos (como la distancia de Frechet, la distancia de Hausdorff), métodos basados ​​en características (como descriptores de Fourier, vectorización de contornos, etc.), métodos basados ​​en estadísticas (como el análisis de Procrustes), etc.

Al final, elija el método que se adapte a las necesidades de su problema y ajuste y optimice de acuerdo con la situación real para obtener resultados precisos de comparación de formas.

Comparación de contornos y momentos Hu utilizando algoritmos de escena de forma

Los algoritmos de escena de formas y los momentos Hu son métodos para comparar contornos o formas, pero se basan en diferentes principios y representaciones de características.

Aquí están las diferencias entre ellos:

1. Principio y representación de características:

  • Algoritmo de escena de forma : el algoritmo de escena de forma se basa en la información de contorno de toda la forma, normalmente extrayendo las coordenadas de una serie de puntos característicos para representar el contorno y luego calculando la relación geométrica, la curvatura y otra información entre estos puntos característicos. . Estos algoritmos pueden comparar transformaciones como cambio de forma, escalado, rotación, etc. entre dos formas.

  • Momentos Hu : los momentos Hu son un conjunto de momentos invariantes relacionados con la forma que se utilizan para describir las características generales de la forma de un objeto. Se obtienen transformando y normalizando los momentos geométricos del contorno. El momento Hu es una forma compacta para representar formas, que puede mantener la invariancia de traslación, rotación y escala de las formas hasta cierto punto.

2. Inmutabilidad:

  • Algoritmos de escenas de formas : los algoritmos de escenas de formas suelen ser sensibles a las transformaciones geométricas de las formas, por lo que es posible que se requiera un procesamiento adicional para tener en cuenta transformaciones como la traslación, la rotación y la escala de las formas.

  • Momentos Hu : los momentos Hu están diseñados para preservar una cierta invariancia de forma, todos son invariantes a la traslación, rotación y escala hasta cierto punto. Esto hace que los momentos de Hu sean muy útiles en ciertas tareas de reconocimiento y coincidencia de formas.

3. Campos de aplicación:

  • Algoritmo de escena de forma : el algoritmo de escena de forma es adecuado para situaciones en las que es necesario considerar la transformación de forma y las características locales. Por ejemplo, se puede utilizar para comparar la estructura general y los cambios de curvatura de dos formas.

  • Momentos Hu : los momentos Hu son adecuados para escenarios que requieren invariancia de forma, como reconocimiento de objetos, recuperación de imágenes, etc. Hasta cierto punto, pueden explicar los efectos de la rotación, la traslación y los cambios de escala de las formas en las comparaciones.

OpenCV proporciona una métrica para la comparación de formas usando "distancia". Esto se debe a que el valor de la diferencia y la distancia entre las formas son similares, por ejemplo, ambas solo pueden ser cero o un número positivo y, por ejemplo, cuando dos formas son exactamente iguales, tanto el valor de la distancia como el valor de la diferencia son iguales a cero. .

OpenCV 提供了函数 cv2.createShapeContextDistanceExtractor(), utilizado para calcular la distancia de la escena de la forma.

El "algoritmo de contexto de forma" que utiliza adjunta un descriptor de "contexto de forma" a cada punto al calcular la distancia, de modo que cada punto pueda capturar las características de distribución de los puntos restantes en relación con él, proporcionando así una característica discriminante global.

El formato de sintaxis de la función cv2.createShapeContextDistanceExtractor() es:

retval = cv2.createShapeContextDistanceExtractor( [, nBinsAngular[,
nBinsRadial[, radioInterior[, RadioExterior[, iteraciones[, comparador[,
transformador]]]]]]] )

El valor devuelto en la fórmula es retval, que devuelve el resultado.
Este resultado se puede usar para calcular la distancia entre dos formas diferentes mediante la función cv2.ShapeDistanceExtractor.computeDistance(). La sintaxis de esta función es:

retval=cv2.ShapeDistanceExtractor.computeDistance(contorno1, contorno2)

donde coutour1 y coutour2 son contornos diferentes.

Los parámetros de la función cv2.createShapeContextDistanceExtractor() son parámetros opcionales:

  • nAngularBins: número de contenedores angulares establecidos para los descriptores de contexto de formas utilizados en la coincidencia de formas.
  • nRadialBins: el número de contenedores radiales establecidos para los descriptores de contexto de forma utilizados en la coincidencia de formas.
  • innerRadius: el radio interior del descriptor de contexto de forma.
  • outsideRadius: el radio exterior del descriptor de contexto de forma.
  • iteraciones: el número de iteraciones.
  • comparador: operador de extracción de costos de histograma. Esta función utiliza el funtor de extracción de costos del histograma, y
    ​​el operador del funtor de extracción de costos del histograma se puede usar directamente como parámetro.
  • transformador: parámetros de transformación de forma.

Ejemplo: Calcule la distancia de la escena de la forma usando la función cv2.createShapeContextDistanceExtractor().

import cv2
#-----------原始图像 o1 的边缘--------------------
o1 = cv2.imread('cs.bmp')
cv2.imshow("original1",o1)
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
ret, binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
contours1, hierarchy = cv2.findContours(binary1,
 cv2.RETR_LIST,
 cv2.CHAIN_APPROX_SIMPLE)

cnt1 = contours1[0]
#-----------原始图像 o2 的边缘--------------------
o2 = cv2.imread('cs3.bmp')
cv2.imshow("original2",o2)
gray2 = cv2.cvtColor(o2,cv2.COLOR_BGR2GRAY)
ret, binary2 = cv2.threshold(gray2,127,255,cv2.THRESH_BINARY)
contours2, hierarchy = cv2.findContours(binary2,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

cnt2 = contours2[0]
#-----------原始图像 o3 的边缘--------------------
o3 = cv2.imread('hand.bmp')
cv2.imshow("original3",o3)
gray3 = cv2.cvtColor(o3,cv2.COLOR_BGR2GRAY)
ret, binary3 = cv2.threshold(gray3,127,255,cv2.THRESH_BINARY)
contours3, hierarchy = cv2.findContours(binary3,
 cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
cnt3 = contours3[0]

#-----------构造距离提取算子--------------------
sd = cv2.createShapeContextDistanceExtractor()

#-----------计算距离--------------------
d1 = sd.matchShapes(cnt1,cnt1)
print("与自身的距离 d1=", d1)
d2 = sd.matchShapes(cnt1,cnt2)
print("与旋转缩放后的自身图像的距离 d2=", d2)
d3 = sd.matchShapes(cnt1,cnt3)
print("与不相似对象的距离 d3=", d3)

cv2.waitKey()
cv2.destroyAllWindows()





Error después de ejecutar:

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/hai411741962/article/details/132203735
Recomendado
Clasificación