base opencv Contorno de 49 imágenes Característica de 02 momentos cv2.momentos ()-> (análisis de forma, detección de objetos, reconocimiento de imágenes, coincidencia)

Moments Features es un método de representación de características para el análisis de imágenes y el reconocimiento de patrones, que se utiliza para describir la forma, las características geométricas y la información estadística de las imágenes. Las funciones de momento se pueden utilizar para tareas como el reconocimiento de objetos en imágenes, la detección de formas y la clasificación de imágenes.

Las características de momento extraen características mediante el cálculo de momentos de orden superior de píxeles de imagen. Estos momentos pueden representar propiedades como el centro, la escala, la rotación y la forma de la imagen. Las siguientes son algunas características comunes del momento de la imagen:

  1. Momentos de orden cero : describe el brillo general o el área de una imagen, generalmente expresado como la cantidad de píxeles en una imagen.

  2. Momentos de primer orden : describe el centroide, la posición media y la distribución de una imagen. Se utilizan para calcular la posición central de la imagen.

  3. Momentos centrales : describe la distribución de las regiones de la imagen en relación con el centroide. Los momentos centrales capturan las propiedades de rotación y traslación de una imagen.

  4. Momentos normalizados : los momentos se normalizan para obtener invariancia de escala y rotación. Los momentos normalizados se pueden utilizar para emparejar e identificar.

  5. **Momentos Hu: **Construido en base a siete momentos básicos, con invariancia de rotación, traslación y escala. Los momentos invariantes de Hu se utilizan en la coincidencia de imágenes y el reconocimiento de patrones.

¿Cuál es el centroide de la imagen?

El centroide de una imagen es un concepto que representa el centro geométrico de una imagen. En un plano bidimensional, el centroide de una imagen se refiere a la posición promedio de todos los píxeles de la imagen, es decir, el centro de gravedad o centro geométrico de la imagen.

Para imágenes binarias (imágenes en blanco y negro), el centroide se puede calcular mediante:

Trata cada píxel de la imagen como un punto con coordenadas (x, y). Para cada píxel, calcule la suma de sus coordenadas x y la suma de sus coordenadas y.
Divida la suma por el número total de píxeles en la imagen para obtener el promedio de las coordenadas x e y, que es la coordenada del centroide.
Las coordenadas del centroide representan la posición promedio de la imagen en las direcciones horizontal y vertical. En aplicaciones prácticas, el centroide generalmente se usa para describir la información de ubicación de la imagen, como la ubicación del objeto, el centro de la forma, etc. Para imágenes en color multicanal, el centroide de cada canal se puede calcular por separado.

Escenarios de aplicación de características de momento

Las características de momento tienen muchos escenarios de aplicación en el campo del procesamiento de imágenes y el reconocimiento de patrones, y se pueden utilizar para describir la forma, las propiedades geométricas y la distribución de las imágenes. Los siguientes son algunos escenarios comunes de aplicación de características de momentos:

  1. Reconocimiento y clasificación de objetos : las características de momento se pueden utilizar para extraer la forma y las características geométricas de los objetos en imágenes para el reconocimiento y la clasificación de objetos. Al comparar las características de los momentos, es posible juzgar si un objeto pertenece a una determinada categoría.

  2. Detección de objetos : en la visión por computadora, la detección de objetos se refiere a encontrar la ubicación de un objeto específico en una imagen. Las funciones de momento se pueden utilizar para detectar la forma y el contorno de un objeto, lo que ayuda a determinar la ubicación del objeto.

  3. Coincidencia de imágenes : las características de momento se pueden utilizar para la coincidencia y alineación de imágenes. Al comparar las características de momento de dos imágenes, se puede encontrar la relación de similitud y transformación entre ellas.

  4. Compresión y codificación de imágenes : las características de momento se pueden utilizar para la compresión y codificación de imágenes, y el espacio de almacenamiento de datos de imágenes se puede reducir extrayendo la información geométrica principal de la imagen.

  5. Segmentación de imágenes : la segmentación de imágenes consiste en dividir la imagen en diferentes regiones, y la función de momento se puede usar para describir la forma y las propiedades geométricas de diferentes regiones, lo que ayuda a segmentar la imagen.

  6. Análisis de imágenes médicas : en el campo médico, las características de momento se pueden utilizar para analizar tejidos, órganos y lesiones en imágenes médicas para extraer formas y características geométricas.

  7. Reconocimiento de huellas dactilares : las características de momento se pueden utilizar para el reconocimiento de huellas dactilares, extrayendo las características geométricas de las imágenes de huellas dactilares para realizar el reconocimiento y la comparación de huellas dactilares.

  8. Análisis de imágenes de teledetección : en las imágenes de teledetección, las características de momento se pueden utilizar para extraer la forma y distribución de los objetos terrestres, realizando así aplicaciones como el uso de la tierra y el monitoreo ambiental.

Cálculo de momentos: la función de momentos

OpenCV proporciona 函数 cv2.moments()una función de momentos para obtener imágenes. Normalmente, nos referimos a las características de contorno obtenidas usando la función cv2.moments() como "momentos de contorno". Los momentos de perfil describen las características importantes de un perfil, y los momentos de perfil se pueden usar para comparar dos perfiles convenientemente.

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

retval = cv2.moments( matriz[, imagenbinaria] )

  • matriz: puede ser un conjunto de puntos, una imagen en escala de grises o una imagen binaria. Cuando la matriz es un conjunto de puntos, la función tratará estos conjuntos de puntos como vértices en el contorno y tratará todo el conjunto de puntos como un contorno en lugar de tratarlos como puntos independientes.
  • binaryImage: cuando este parámetro es verdadero, todos los valores distintos de cero en la matriz se tratan como 1. Este parámetro solo es válido cuando la matriz de parámetros es una imagen.

La recuperación del valor de retorno de esta función es una función de momento, que incluye principalmente:

(1) Momento espacial

  • Momento cero: m00
  • Primeros momentos: m10, m01
  • Segundos momentos: m20, m11, m02
  • Momentos de tercer orden: m30, m21, m12, m03
    (2) Momentos centrales
  • Momentos centrales de segundo orden: mu20, mu11, mu02
  • Momento central de tercer orden: mu30, mu21, mu12, mu03
    (3) Momento central normalizado
  • Momentos Hu de segundo orden: nu20, nu11, nu02
  • Momentos Hu de tercer orden: nu30, nu21, nu12, nu03

Los momentos anteriores se calculan según la fórmula, y la mayoría de los momentos son relativamente abstractos. Pero está claro que dos contornos son consistentes si sus momentos son consistentes. Aunque la mayoría de los momentos son características abstractas calculadas mediante fórmulas matemáticas,
es más intuitivo el significado del momento de orden cero "m00", que representa el área de un contorno.

Los valores propios devueltos por la función de característica de momento cv2.moments() se pueden usar para comparar si dos contornos son similares. Por ejemplo, hay dos contornos, sin importar dónde aparezcan en la imagen, podemos usar el momento m00 de la función cv2.moments() para juzgar si sus áreas son consistentes.

Cuando cambia la posición, aunque las características como el área y el perímetro del contorno permanecen sin cambios, las características de orden superior cambiarán a medida que cambie la posición. En muchos casos, deseamos comparar la consistencia de dos objetos en diferentes lugares. La forma de resolver este problema es introducir el momento central. Los momentos centrales obtienen la invariancia de traducción al restar la media, lo que permite la comparación de dos objetos en diferentes ubicaciones para la concordancia. Obviamente, la invariancia de traslación del momento central le permite ignorar la relación posicional de dos objetos y nos ayuda a comparar la consistencia de dos objetos en diferentes posiciones.

Además de considerar la invariancia de traducción, también consideramos la consistencia de los objetos a escala que tienen un tamaño inconsistente. En otras palabras, esperamos que la imagen pueda tener un valor de característica estable antes y después del escalado. Es decir, que la imagen tenga los mismos valores propios antes y después del escalado. Obviamente, el momento central no tiene esta propiedad. Por ejemplo, dos objetos con la misma forma y diferentes tamaños tienen diferentes momentos centrales.

El momento central normalizado es invariante de escala al dividirlo por el tamaño total del objeto. Extrae el valor del atributo de momento central normalizado del objeto a través del cálculo anterior, y el valor del atributo no solo tiene invariancia de traducción, sino que también tiene invariancia de escala.

En OpenCV, la función cv2.moments() calculará simultáneamente el momento espacial anterior, el momento central y la distancia central normalizada.

Ejemplo: use la función cv2.moments() para extraer características de una imagen.

el código se muestra a continuación:


import cv2
import numpy as np
o = cv2.imread('moments.bmp')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,
 cv2.RETR_LIST,
 cv2.CHAIN_APPROX_SIMPLE)
n=len(contours)
contoursImg=[]
for i in range(n):
 temp=np.zeros(o.shape,np.uint8)
 contoursImg.append(temp)
 contoursImg[i]=cv2.drawContours(contoursImg[i],contours,i,255,3)
 cv2.imshow("contours[" + str(i)+"]",contoursImg[i])
print("观察各个轮廓的矩(moments):")
for i in range(n):
 print("轮廓"+str(i)+"的矩:\n",cv2.moments(contours[i]))
print("观察各个轮廓的面积:")
for i in range(n):
 print("轮廓"+str(i)+"的面积:%d" %cv2.moments(contours[i])['m00'])
cv2.waitKey()
cv2.destroyAllWindows()

En este ejemplo, primero use la función cv2.moments() para extraer las características de cada contorno, luego use la instrucción
cv2.moments(contours[i])['m00']) para extraer la información del área de cada momento del contorno. .

El resultado de la operación es el siguiente:

观察各个轮廓的矩(moments):
轮廓0的矩:
 {'m00': 14900.0, 'm10': 1996600.0, 'm01': 7800150.0, 'm20': 279961066.6666666, 'm11': 1045220100.0, 'm02': 4110944766.6666665, 'm30': 40842449600.0, 'm21': 146559618400.0, 'm12': 550866598733.3334, 'm03': 2180941440375.0, 'mu20': 12416666.666666627, 'mu11': 0.0, 'mu02': 27566241.666666508, 'mu30': 1.52587890625e-05, 'mu21': 2.09808349609375e-05, 'mu12': 6.198883056640625e-05, 'mu03': 0.000244140625, 'nu20': 0.05592841163310942, 'nu11': 0.0, 'nu02': 0.12416666666666591, 'nu30': 5.630596400372416e-16, 'nu21': 7.742070050512072e-16, 'nu12': 2.2874297876512943e-15, 'nu03': 9.008954240595866e-15}
轮廓1的矩:
 {'m00': 34314.0, 'm10': 13313832.0, 'm01': 9728019.0, 'm20': 5356106574.0, 'm11': 3774471372.0, 'm02': 2808475082.0, 'm30': 2225873002920.0, 'm21': 1518456213729.0, 'm12': 1089688331816.0, 'm03': 824882507095.5, 'mu20': 190339758.0, 'mu11': 0.0, 'mu02': 50581695.5, 'mu30': 0.0, 'mu21': 0.0, 'mu12': 0.0, 'mu03': 0.0, 'nu20': 0.16165413533834588, 'nu11': 0.0, 'nu02': 0.042958656330749356, 'nu30': 0.0, 'nu21': 0.0, 'nu12': 0.0, 'nu03': 0.0}
轮廓2的矩:
 {'m00': 3900.0, 'm10': 2696850.0, 'm01': 273000.0, 'm20': 1866699900.0, 'm11': 188779500.0, 'm02': 19988800.0, 'm30': 1293351277725.0, 'm21': 130668993000.0, 'm12': 13822255200.0, 'm03': 1522248000.0, 'mu20': 1828125.0, 'mu11': 0.0, 'mu02': 878800.0, 'mu30': 0.0, 'mu21': 0.0, 'mu12': 0.0, 'mu03': 0.0, 'nu20': 0.1201923076923077, 'nu11': 0.0, 'nu02': 0.05777777777777778, 'nu30': 0.0, 'nu21': 0.0, 'nu12': 0.0, 'nu03': 0.0}
观察各个轮廓的面积:
轮廓0的面积:14900
轮廓1的面积:34314
轮廓2的面积:3900

inserte la descripción de la imagen aquí

Calcular el área del contorno: función contourArea

También hay una función para calcular el área del contorno por separado en opencvcontourArea函数

La función cv2.contourArea() se utiliza para calcular el área del contorno. La sintaxis de esta función es:

retval =cv2.contourArea(contorno [, orientado] ))

El valor de retorno recuperado en la fórmula es el valor del área.

Hay dos parámetros en la fórmula:

  • contorno es el contorno.
  • oriented es un valor booleano. Cuando es True, el valor devuelto contiene un signo más/menos para indicar si el contorno es en sentido horario o antihorario. El valor predeterminado de este parámetro es False, lo que significa que el retval devuelto es un valor absoluto.

Ejemplo de código: utilice la función cv2.contourArea() para calcular el área de cada contorno.


import cv2
import numpy as np
o = cv2.imread('moments.bmp')
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,
 cv2.RETR_LIST,
 cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow("original",o)
n=len(contours)
contoursImg=[]
for i in range(n):
 print("moments["+str(i)+"]面积=",cv2.contourArea(contours[i]))
 temp=np.zeros(o.shape,np.uint8)
 contoursImg.append(temp)
 contoursImg[i]=cv2.drawContours(contoursImg[i],
 contours,i,(255,255,255),3)
 cv2.imshow("moments[" + str(i)+"]",contoursImg[i])
cv2.waitKey()
cv2.destroyAllWindows()

resultado de la operación:

moments[0]面积= 14900.0
moments[1]面积= 34314.0
moments[2]面积= 3900.0

Se puede ver que es el mismo que el obtenido por m00 arriba, y la visualización gráfica también es la misma
inserte la descripción de la imagen aquí

Ejemplo de código: según lo anterior, filtre los contornos cuya área sea mayor que 15,000.

el código se muestra a continuación:

import cv2
import numpy as np
o = cv2.imread('moments.bmp')
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,
 cv2.RETR_LIST,
 cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow("original",o)
n=len(contours)
contoursImg=[]
for i in range(n):

 temp=np.zeros(o.shape,np.uint8)
 contoursImg.append(temp)
 contoursImg[i]=cv2.drawContours(contoursImg[i],
 contours,i,(255,255,255),3)
 if cv2.contourArea(contours[i]) > 15000:
  print("moments[" + str(i) + "]面积=", cv2.contourArea(contours[i]))
  cv2.imshow("moments[" + str(i)+"]",contoursImg[i])
cv2.waitKey()
cv2.destroyAllWindows()

Use la declaración "if cv2.contourArea(contours[i])>15000:" para filtrar el valor del área y luego use la declaración "cv2.imshow("contours[" + str(i)+ "]", contoursImg[ i])".

resultado de la operación:

moments[1]面积= 34314.0

inserte la descripción de la imagen aquí

Calcular la longitud (perímetro) del contorno: función arcLength

La función cv2.arcLength() se utiliza para calcular la longitud del contorno y su formato de sintaxis es:

retval = cv2.arcLength(curva, cerrada)

El valor de retorno retval en la fórmula es la longitud (perímetro) del contorno.

Hay dos parámetros en la fórmula anterior:

  • la curva es el contorno.
  • cerrado es un valor booleano que indica si el contorno está cerrado. Cuando el valor es True, significa que el contorno está cerrado.

Ejemplo: Mostrar los contornos en una imagen cuya longitud es mayor que el promedio.

import cv2
import numpy as np
#--------------读取及显示原始图像--------------------
o = cv2.imread('moments.bmp')

#--------------获取轮廓--------------------
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,
 cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
#--------------计算各轮廓的长度之和、平均长度--------------------
n=len(contours) # 获取轮廓的个数
cntLen=[] # 存储各轮廓的长度
for i in range(n):
 cntLen.append(cv2.arcLength(contours[i],True))
 print("第"+str(i)+"个轮廓的长度:%d"%cntLen[i])
cntLenSum=np.sum(cntLen) # 各轮廓的长度之和
cntLenAvr=cntLenSum/n # 轮廓长度的平均值
print("轮廓的总长度为:%d"%cntLenSum)
print("轮廓的平均长度为:%d"%cntLenAvr)

resultado de la operación:

第0个轮廓的长度:498
第1个轮廓的长度:782
第2个轮廓的长度:254
轮廓的总长度为:1534
轮廓的平均长度为:511

Imagen original de ejemplo de código

inserte la descripción de la imagen aquí

Supongo que te gusta

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