<jupyter_start><jupyter_text>Computer Vision – Operaciones Morfológicas Las operaciones morfológicas se usan comúnmente como pasos de preprocesamiento para soluciones de visión de computadora más potentes, como OCR, reconocimiento automático de matrículas (ANPR) y detección de códigos de barras.Las operaciones morfológicas son transformaciones simples aplicadas a imágenes binarias o en escala de grises. Más específicamente, aplicamos operaciones morfológicas a formas y estructuras dentro de las imágenes. Podemos usar operaciones morfológicas para aumentar el tamaño de los objetos en las imágenes y también para disminuirlos. También podemos utilizar operaciones morfológicas para cerrar las brechas entre los objetos y abrirlos. Las operaciones morfológicas “sondean” una imagen con un elemento estructurante. Este elemento estructurante define el vecindario que se examinará alrededor de cada píxel. Y en función de la operación dada y el tamaño del elemento estructurante, podemos ajustar nuestra imagen de salida.  Setup<jupyter_code>import cv2

image = cv2.imread("C:/Users/algonzalez/source/repos/Computer_Vision/1_Basics_of_Computer_Vision/images/file.jpeg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Original", image)
cv2.waitKey(0)
cv2.destroyAllWindows()<jupyter_output><empty_output><jupyter_text>Erosion Una erosión en una imagen "erosiona" el objeto del primer plano o foreground y lo hace más pequeño. En pocas palabras, los píxeles cerca del límite de un objeto en una imagen se descartarán, "erosionándolos".La erosión funciona definiendo un elemento de estructuración y luego deslizando este elemento de estructuración de izquierda a derecha y de arriba a abajo a través de la imagen de entrada. Un píxel del foreground en la imagen de entrada se mantendrá solo si TODOS los píxeles dentro del elemento estructurante son > 0. De lo contrario, los píxeles se establecen en 0 (es decir, en el fondo). La erosión es útil para eliminar pequeñas manchas en una imagen o desconectar dos objetos conectados.<jupyter_code># Aplicar una serie de valores para la Erosion
for i in range(0, 3):
    eroded = cv2.erode(gray.copy(), None, iterations=i + 1)
    cv2.imshow("Eroded {} times".format(i + 1), eroded)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
cv2.imshow("Original", image)
cv2.waitKey(0)
cv2.destroyAllWindows()<jupyter_output><empty_output><jupyter_text>Dilation Lo contrario de una erosión es una dilatación. Al igual que una erosión arrasará con los píxeles del foreground, una dilatación aumentará los píxeles del foreground. Las dilataciones aumentan el tamaño del objeto de foreground y son especialmente útiles para unir partes rotas de una imagen. Las dilataciones, al igual que una erosión, también utilizan elementos de estructuración: un píxel central p del elemento de estructuración se establece en blanco si CUALQUIER píxel en el elemento de estructuración es > 0.<jupyter_code>for i in range(0, 3):
    dilated = cv2.dilate(gray.copy(), None, iterations=i + 1)
    cv2.imshow("Dilated {} times".format(i + 1), dilated)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
cv2.imshow("Original", image)
cv2.waitKey(0)
cv2.destroyAllWindows()<jupyter_output><empty_output><jupyter_text>Opening Un "Opening", es una erosión seguida de una dilatación. Realizar una operación de "Opening" nos permite eliminar pequeñas manchas de una imagen: primero se aplica una erosión para eliminar las pequeñas manchas, luego se aplica una dilatación para volver a crecer el tamaño del objeto original.<jupyter_code>kernelSizes = [(3, 3), (5, 5), (7, 7)]

# loop sobre los kernels y aplicar una operación de "Opening" a la imagen
for kernelSize in kernelSizes:
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernelSize)
    opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)
    cv2.imshow("Opening: ({}, {})".format(kernelSize[0], kernelSize[1]), opening)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
cv2.imshow("Original", image)
cv2.waitKey(0)
cv2.destroyAllWindows()<jupyter_output><empty_output><jupyter_text>Closing El opuesto exacto a una apertura sería un cierre. Un cierre es una dilatación seguida de una erosión. Como su nombre indica, se utiliza un cierre para cerrar los agujeros dentro de los objetos o para conectar componentes entre sí.<jupyter_code># loop sobre los kernels y aplicar una operación de "Closing" a la imagen
for kernelSize in kernelSizes:
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernelSize)
    closing = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
    cv2.imshow("Closing: ({}, {})".format(kernelSize[0], kernelSize[1]), closing)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
cv2.imshow("Original", image)
cv2.waitKey(0)
cv2.destroyAllWindows()<jupyter_output><empty_output><jupyter_text>Morphlogical Gradient Un gradiente morfológico es la diferencia entre la dilatación y la erosión. Es útil para determinar el contorno de un objeto particular de una imagen.<jupyter_code># loop sobre los kernels y aplicar una operación de "Morphlogical Gradien" a la imagen
for kernelSize in kernelSizes:
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernelSize)
    gradient = cv2.morphologyEx(gray, cv2.MORPH_GRADIENT, kernel)
    cv2.imshow("Gradient: ({}, {})".format(kernelSize[0], kernelSize[1]), gradient)
    cv2.waitKey(0)
    cv2.destroyAllWindows()<jupyter_output><empty_output><jupyter_text>Top Hat & Black Hat La operación morfológica de un top hat (también conocido como sombrero blanco) es la diferencia entre la imagen de entrada original y la apertura. Una operación de top hat se usa para revelar regiones brillantes de una imagen sobre fondos oscuros.<jupyter_code># construir un kernel y aplicar una operación blackhat que
# nos permita encontrar regiones oscuras sobre un fondo claro
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))
blackhat = cv2.morphologyEx(gray, cv2.MORPH_BLACKHAT, rectKernel)

# de manera similar, una operación de tophat (también llamada "whitehat") habilitará
# para encontrar regiones claras sobre un fondo oscuro
tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel)

cv2.imshow("Original", image)
cv2.imshow("Blackhat", blackhat)
cv2.imshow("Tophat", tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()<jupyter_output><empty_output>
StarcoderdataJupyterStructuredCleanDedup