Detección de puntos blancos y negros usando OpenCV | Python

El procesamiento de imágenes con Python es uno de los temas más candentes en el mundo actual. Pero el procesamiento de imágenes es un poco complejo y los principiantes se aburren en su primer acercamiento. Entonces, en este artículo, tenemos un programa Python de procesamiento de imágenes muy básico para contar puntos negros en la superficie blanca y puntos blancos en la superficie negra usando funciones OpenCV ( cv2.imread, cv2.threshold, cv2.findContours, cv2.contourArea).

Contar puntos negros en una superficie blanca –

Primero necesitamos importar la biblioteca OpenCV. Todas las funciones relacionadas con el procesamiento de imágenes residen en esta biblioteca. Para almacenar la ruta de la imagen que vamos a procesar en una ruta variable.

import cv2
# path ="C:/Users/Personal/Downloads/black dot.jpg"
path ="black dot.jpg"

Imagen de entrada –

Cargando una imagen en modo escala de grises. En el modo de escala de grises, la imagen se convierte en una imagen en blanco y negro compuesta por tonos de gris.

gray = cv2.imread(path, 0)

La función cv2.threshold funciona así, si el valor del píxel es mayor que un valor de umbral, se le asigna un valor (puede ser blanco), de lo contrario, se le asigna otro valor (puede ser negro). El primer argumento es la imagen de origen, que debe ser una imagen en escala de grises (hecha anteriormente). El segundo argumento es el valor de umbral que se utiliza para clasificar los valores de píxel. Para el valor de umbral, simplemente pase cero. Luego, el algoritmo encuentra el valor de umbral óptimo y lo devuelve como la segunda salida, th. Si no se usa el umbral de Otsu, es el mismo que el valor de umbral que usó.

# threshold
th, threshed = cv2.threshold(gray, 100, 255,
       cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)

Los contornos se pueden explicar simplemente como una curva que une todos los puntos continuos (a lo largo del límite), que tienen el mismo color o intensidad. Los contornos son una herramienta útil para el análisis de formas y la detección y reconocimiento de objetos. Los contornos brindan una mayor precisión al usar imágenes binarias. Hay tres argumentos en cv2.findContours()función, el primero es la imagen de origen, el segundo es el modo de recuperación de contorno, el tercero es el método de aproximación de contorno. Emite los contornos y la jerarquía. Contornos es una lista de Python de todos los contornos de la imagen. Cada contorno individual es una array Numpy de coordenadas (x, y) de los puntos límite del objeto.

Principalmente conecta los puntos negros de la imagen para contar –

# findcontours
cnts = cv2.findContours(threshed, cv2.RETR_LIST,
                    cv2.CHAIN_APPROX_SIMPLE)[-2]

cv2.contourArea()puede calcular el área del contorno del objeto. Aquí el objeto son los puntos negros. cuando obtiene un punto negro, calculará el área y, si cumple la condición de área mínima para ser contada como un punto, empujará el valor de su área a la lista xcnts.

# filter by area
s1 = 3
s2 = 20
xcnts = []
for cnt in cnts:
    if s1<cv2.contourArea(cnt) <s2:
        xcnts.append(cnt)

Por fin, no necesitamos las áreas. Si se considera que es un punto, su área se incluye en la lista xcnts. Entonces obtendremos el número de puntos si calculamos la longitud de la lista.

print("\nDots number: {}".format(len(xcnts)))

Producción :

23

Contar puntos blancos sobre un fondo negro –

Ahora, para contar los puntos blancos, necesitamos cambiar un poco el umbral. tenemos que usar c v2.THRESH_BINARYen lugar de cv2.THRESH_BINARY_INVporque estamos contando valores blancos en la superficie negra. El otro proceso es el mismo. Podemos cambiar los valores s1 y s2 para buscar el mejor resultado.

Imagen de entrada:

import cv2
path ="white dot.png"
  
# reading the image in grayscale mode
gray = cv2.imread(path, 0)
  
# threshold
th, threshed = cv2.threshold(gray, 100, 255, 
          cv2.THRESH_BINARY|cv2.THRESH_OTSU)
  
# findcontours
cnts = cv2.findContours(threshed, cv2.RETR_LIST, 
                    cv2.CHAIN_APPROX_SIMPLE)[-2]
  
# filter by area
s1 = 3
s2 = 20
xcnts = []
  
for cnt in cnts:
    if s1<cv2.contourArea(cnt) <s2:
        xcnts.append(cnt)
  
# printing output
print("\nDots number: {}".format(len(xcnts)))

Producción :

583

Referencias:
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html
https://docs.opencv.org/3.1.0/d4/d73/tutorial_py_contours_begin.html

Publicación traducida automáticamente

Artículo escrito por towsifahmedlabib y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *