Blog
Propiedades de los contornos
- Publicado por: Alberto Sosa-Costa
- Categoría: Blog OpenCV Procesamiento de Imagenes
Aprender a extraer de los objetos en la imagen, algunas propiedades de uso frecuente tales como: Solidez, Diámetro Equivalente, Máscara de imagen, Intensidad Media, etc. Otras características adicionales se pueden encontrar en la documentación de Matlab para regionprops.
Relación de aspecto
Es la razón entre el ancho y la altura del contorno del objeto.
x,y,w,h = cv2.boundingRect(cnt) aspect_ratio = float(w)/h
Extensión
La extensión es la razón entre el área del contorno y el área del rectángulo delimitador.
area = cv2.contourArea(cnt) x,y,w,h = cv2.boundingRect(cnt) rect_area = w*h extension = float(area)/rect_area
Solidez
La solidez es la razón entre el área del contorno y el área de su envoltura convexa.
area = cv2.contourArea(cnt) hull = cv2.convexHull(cnt) hull_area = cv2.contourArea(hull) solidez = float(area)/hull_area
Diámetro equivalente
Es el diámetro del círculo cuya área es igual que el área del contorno.
area = cv2.contourArea(cnt) equi_diametro = np.sqrt(4*area/np.pi)
Orientación
La orientación es el ángulo que forma el eje mayor de la elipse circunscrita al objeto, con la dirección horizontal. El siguiente método también da las longitudes del Eje Mayor y del Eje Menor de dicha elipse.
(x,y),(MA,ma),angle = cv2.fitEllipse(cnt)
Máscara y número de píxeles
En algunos casos es muy útil crear una máscara del objeto de interés. Adicionalmente, puede resultar útil conocer los puntos que conforman el objeto. Ambas operaciones se pueden hacer de la siguiente manera:
mask = np.zeros(imgray.shape,np.uint8) cv2.drawContours(mask,[cnt],0,255,-1) pixelpoints = np.transpose(np.nonzero(mask)) #pixelpoints = cv2.findNonZero(mask)
Ambos métodos mostrados conducen al mismo resultado. El primero utiliza funciones Numpy, mientras que el segundo utiliza la función OpenCV (última línea comentada). Auqnue los resultados de los dos métodos son iguales, existe una ligera diferencia entre ellos. Numpy da las coordenadas en formato (fila, columna), mientras que OpenCV da coordenadas en formato (x, y). Así que básicamente las respuestas serán intercambiadas. Tenga en cuenta que, row = x y column = y.
Valores mínimo y máximo y sus respectivas coordenadas
Estos valores pueden encontrarse utilizando una máscara de la imagen:
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray,mask = mask)
Color medio o Intensidad media
Aquí podemos encontrar el color medio de un objeto. O puede ser la intensidad media del objeto en modo de escala de grises. De nuevo usamos la misma máscara para hacerlo.
mean_val = cv2.mean(im,mask = mask)
Puntos extremos
Los puntos extremos son cuatro y se corresponden con: el punto superior, el inferior, el derecho y el izquierdo de la imagen.
izquierdo = tuple(cnt[cnt[:,:,0].argmin()][0]) derecho = tuple(cnt[cnt[:,:,0].argmax()][0]) superior = tuple(cnt[cnt[:,:,1].argmin()][0]) inferior = tuple(cnt[cnt[:,:,1].argmax()][0])
Estas propiedades serán algo que utilizaremos frecuentemente en el manejo de contornos.
Aprende mas de funciones y manejo de imagenes en nuestro curso Python de OpenCV:
[…] ➡ Propiedades de los contornos […]