Primeros pasos con Python OpenCV

Computer Vision es una de las técnicas a partir de las cuales podemos entender imágenes y vídeos y podemos extraer información de ellos. Es un subconjunto de la inteligencia artificial que recopila información de imágenes o videos digitales. 

Python OpenCV es la biblioteca de visión artificial más popular. Al usarlo, uno puede procesar imágenes y videos para identificar objetos, rostros o incluso la escritura a mano de un ser humano. Cuando se integra con varias bibliotecas, como NumPy, Python es capaz de procesar la estructura de array de OpenCV para su análisis.

Getting Started with Python OpenCV

En este artículo, discutiremos Python OpenCV en detalle junto con algunas operaciones comunes como cambiar el tamaño, recortar, leer, guardar imágenes, etc. con la ayuda de buenos ejemplos.

Instalación

Para instalar OpenCV, uno debe tener Python y PIP preinstalados en su sistema. Si Python no está presente, consulte ¿Cómo instalar Python en Linux? y siga las instrucciones proporcionadas. Si PIP no está presente, consulte ¿Cómo instalar PIP en Linux? y siga las instrucciones proporcionadas.

Después de instalar Python y PIP, escriba el siguiente comando en la terminal.

pip3 install opencv-python

Python opencv install

Imágenes de lectura

Para leer las imágenes se utiliza el método cv2.imread() . Este método carga una imagen del archivo especificado. Si la imagen no se puede leer (debido a la falta del archivo, permisos incorrectos, formato no compatible o no válido), este método devuelve una array vacía.

Imagen utilizada:

Read image opencv python

Ejemplo: Python OpenCV Leer imagen

Python3

# Python code to read image
import cv2
 
# To read image from disk, we use
# cv2.imread function, in below method,
img = cv2.imread("geeks.png", cv2.IMREAD_COLOR)
 
print(img)

Producción:

[[[ 87 157  14]
  [ 87 157  14]
  [ 87 157  14]
  ...
  [ 87 157  14]
  [ 87 157  14]
  [ 87 157  14]]

 [[ 87 157  14]
  [ 87 157  14]
  [ 87 157  14]
  ...
  [ 87 157  14]
  [ 87 157  14]
  [ 87 157  14]]

 [[ 87 157  14]
  [ 87 157  14]
  [ 87 157  14]
  ...
  [ 87 157  14]
  [ 87 157  14]
  [ 87 157  14]]

 ...

 [[ 72 133   9]
  [ 72 133   9]
  [ 72 133   9]
  ...
  [ 87 157  14]
  [ 87 157  14]
  [ 87 157  14]]

 [[ 72 133   9]
  [ 72 133   9]
  [ 72 133   9]
  ...
  [ 87 157  14]
  [ 87 157  14]
  [ 87 157  14]]

 [[ 72 133   9]
  [ 72 133   9]
  [ 72 133   9]
  ...
  [ 87 157  14]
  [ 87 157  14]
  [ 87 157  14]]]

Visualización de imágenes

El método cv2.imshow() se usa para mostrar una imagen en una ventana. La ventana se ajusta automáticamente al tamaño de la imagen.

Ejemplo: Imágenes de visualización de Python OpenCV

Python3

# Python code to read image
import cv2
 
# To read image from disk, we use
# cv2.imread function, in below method,
img = cv2.imread("geeks.png", cv2.IMREAD_COLOR)
 
# Creating GUI window to display an image on screen
# first Parameter is windows title (should be in string format)
# Second Parameter is image array
cv2.imshow("GeeksforGeeks", img)
 
# To hold the window on screen, we use cv2.waitKey method
# Once it detected the close input, it will release the control
# To the next line
# First Parameter is for holding screen for specified milliseconds
# It should be positive integer. If 0 pass an parameter, then it will
# hold the screen until user close it.
cv2.waitKey(0)
 
# It is for removing/deleting created GUI window from screen
# and memory
cv2.destroyAllWindows()

Producción:

display image using Python OpenCV

Guardar imágenes

El método cv2.imwrite() se utiliza para guardar una imagen en cualquier dispositivo de almacenamiento. Esto guardará la imagen según el formato especificado en el directorio de trabajo actual.

Ejemplo: Python OpenCV Guardar imágenes

Python3

# Python program to explain cv2.imwrite() method
 
# importing cv2
import cv2
 
image_path = 'geeks.png'
 
# Using cv2.imread() method
# to read the image
img = cv2.imread(image_path)
 
# Filename
filename = 'savedImage.jpg'
 
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, img)
 
# Reading and showing the saved image
img = cv2.imread(filename)
cv2.imshow("GeeksforGeeks", img)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

show image using Python Opencv

Imágenes giratorias

El método cv2.rotate() se usa para rotar una array 2D en múltiplos de 90 grados. La función cv::rotate rota la array de tres maneras diferentes.

Ejemplo: Python OpenCV Rotar imagen

Python3

# Python program to explain cv2.rotate() method
 
# importing cv2
import cv2
 
# path
path = 'geeks.png'
 
# Reading an image in default mode
src = cv2.imread(path)
 
# Window name in which image is displayed
window_name = 'Image'
 
# Using cv2.rotate() method
# Using cv2.ROTATE_90_CLOCKWISE rotate
# by 90 degrees clockwise
image = cv2.rotate(src, cv2.cv2.ROTATE_90_CLOCKWISE)
 
# Displaying the image
cv2.imshow(window_name, image)
cv2.waitKey(0)

Producción:

Python OpenCV Rotate Image

Las funciones anteriores nos restringen a rotar la imagen en el múltiplo de 90 grados solamente. También podemos rotar la imagen en cualquier ángulo definiendo la array de rotación que enumera el punto de rotación, el grado de rotación y el factor de escala.

Ejemplo: Python OpenCV Rotar imagen por cualquier ángulo

Python3

import cv2
import numpy as np
 
FILE_NAME = 'geeks.png'
 
# Read image from the disk.
img = cv2.imread(FILE_NAME)
 
# Shape of image in terms of pixels.
(rows, cols) = img.shape[:2]
 
# getRotationMatrix2D creates a matrix needed
# for transformation. We want matrix for rotation
# w.r.t center to 45 degree without scaling.
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1)
res = cv2.warpAffine(img, M, (cols, rows))
 
cv2.imshow("GeeksforGeeks", res)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

Python OpenCV Rotate Image

Cambiar el tamaño de la imagen

El cambio de tamaño de la imagen se refiere a la escala de las imágenes. Ayuda a reducir la cantidad de píxeles de una imagen y eso tiene varias ventajas, por ejemplo, puede reducir el tiempo de entrenamiento de una red neuronal cuanto mayor es la cantidad de píxeles en una imagen, mayor es la cantidad de Nodes de entrada que a su vez aumenta la complejidad del modelo. También ayuda a hacer zoom en las imágenes. Muchas veces necesitamos cambiar el tamaño de la imagen, es decir, reducirla o ampliarla para cumplir con los requisitos de tamaño.

OpenCV nos proporciona varios métodos de interpolación para cambiar el tamaño de una imagen. Elección del método de interpolación para cambiar el tamaño:

  • cv2.INTER_AREA: Esto se usa cuando necesitamos reducir una imagen.
  • cv2.INTER_CUBIC: Esto es lento pero más eficiente.
  • cv2.INTER_LINEAR: Esto se usa principalmente cuando se requiere hacer zoom. Esta es la técnica de interpolación predeterminada en OpenCV.

Ejemplo: cambio de tamaño de imagen de Python OpenCV

Python3

import cv2
import numpy as np
import matplotlib.pyplot as plt
 
image = cv2.imread("geeks.png", 1)
# Loading the image
 
half = cv2.resize(image, (0, 0), fx = 0.1, fy = 0.1)
bigger = cv2.resize(image, (1050, 1610))
 
stretch_near = cv2.resize(image, (780, 540),
            interpolation = cv2.INTER_NEAREST)
 
 
Titles =["Original", "Half", "Bigger", "Interpolation Nearest"]
images =[image, half, bigger, stretch_near]
count = 4
 
for i in range(count):
    plt.subplot(2, 3, i + 1)
    plt.title(Titles[i])
    plt.imshow(images[i])
 
plt.show()

Producción:

Python OpenCV Image Resizing

Espacios de color

Los espacios de color son una forma de representar los canales de color presentes en la imagen que le dan a la imagen ese tono particular. Hay varios espacios de color diferentes y cada uno tiene su propio significado. Algunos de los espacios de color populares son RGB (rojo, verde, azul), CMYK (cian, magenta, amarillo, negro), HSV (tono, saturación, valor), etc.

 El método cv2.cvtColor() se usa para convertir una imagen de un espacio de color a otro. Hay más de 150 métodos de conversión de espacio de color disponibles en OpenCV.

Ejemplo: espacios de color Python OpenCV

Python3

# Python program to explain cv2.cvtColor() method
 
# importing cv2
import cv2
 
# path
path = 'geeks.png'
 
# Reading an image in default mode
src = cv2.imread(path)
 
# Window name in which image is displayed
window_name = 'GeeksforGeeks'
 
# Using cv2.cvtColor() method
# Using cv2.COLOR_BGR2GRAY color space
# conversion code
image = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY )
 
# Displaying the image
cv2.imshow(window_name, image)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

python opencv color spaces

Operaciones aritmeticas

Las operaciones aritméticas como la suma, la resta y las operaciones bit a bit (Y, O, NO, XOR) se pueden aplicar a las imágenes de entrada. Estas operaciones pueden resultar útiles para mejorar las propiedades de las imágenes de entrada. La aritmética de imágenes es importante para analizar las propiedades de la imagen de entrada. Las imágenes operadas se pueden utilizar además como una imagen de entrada mejorada, y se pueden aplicar muchas más operaciones para aclarar, umbralizar, dilatar, etc. de la imagen.

Adición de imagen:

Podemos agregar dos imágenes usando la función cv2.add(). Esto suma directamente píxeles de imagen en las dos imágenes. Pero agregar los píxeles no es una situación ideal. Entonces, usamos cv2.addweighted(). Recuerde, ambas imágenes deben tener el mismo tamaño y profundidad.

Imagen de entrada 1:

Imagen de entrada2:

Python3

# Python program to illustrate
# arithmetic operation of
# addition of two images
     
# organizing imports
import cv2
import numpy as np
     
# path to input images are specified and
# images are loaded with imread command
image1 = cv2.imread('star.jpg')
image2 = cv2.imread('dot.jpg')
 
# cv2.addWeighted is applied over the
# image inputs with applied parameters
weightedSum = cv2.addWeighted(image1, 0.5, image2, 0.4, 0)
 
# the window showing output image
# with the weighted sum
cv2.imshow('Weighted Image', weightedSum)
 
# De-allocate any associated memory usage
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

Producción:

Addition of Image

Resta de Imagen:

Además, podemos restar los valores de píxeles en dos imágenes y fusionarlos con la ayuda de cv2.subtract(). Las imágenes deben ser del mismo tamaño y profundidad.

Python3

# Python program to illustrate
# arithmetic operation of
# subtraction of pixels of two images
 
# organizing imports
import cv2
import numpy as np
     
# path to input images are specified and
# images are loaded with imread command
image1 = cv2.imread('star.jpg')
image2 = cv2.imread('dot.jpg')
 
# cv2.subtract is applied over the
# image inputs with applied parameters
sub = cv2.subtract(image1, image2)
 
# the window showing output image
# with the subtracted image
cv2.imshow('Subtracted Image', sub)
 
# De-allocate any associated memory usage
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

Producción:

Subtraction of Image:

Operaciones bit a bit en imagen binaria

Las operaciones bit a bit se utilizan en la manipulación de imágenes y se utilizan para extraer partes esenciales de la imagen. Las operaciones bit a bit utilizadas son:

  • Y
  • O
  • XOR
  • NO

Operación AND bit a bit

Conjunción bit a bit de elementos de array de entrada. 

Imagen de entrada 1:

Imagen de entrada 2: 

Python3

# Python program to illustrate
# arithmetic operation of
# bitwise AND of two images
     
# organizing imports
import cv2
import numpy as np
     
# path to input images are specified and
# images are loaded with imread command
img1 = cv2.imread('input1.png')
img2 = cv2.imread('input2.png')
 
# cv2.bitwise_and is applied over the
# image inputs with applied parameters
dest_and = cv2.bitwise_and(img2, img1, mask = None)
 
# the window showing output image
# with the Bitwise AND operation
# on the input images
cv2.imshow('Bitwise And', dest_and)
 
# De-allocate any associated memory usage
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

Producción:

Python OpenCV bitwise and

Operación OR bit a bit

Disyunción bit a bit de elementos de array de entrada. 

Python3

# Python program to illustrate
# arithmetic operation of
# bitwise OR of two images
     
# organizing imports
import cv2
import numpy as np
     
# path to input images are specified and
# images are loaded with imread command
img1 = cv2.imread('input1.png')
img2 = cv2.imread('input2.png')
 
# cv2.bitwise_or is applied over the
# image inputs with applied parameters
dest_or = cv2.bitwise_or(img2, img1, mask = None)
 
# the window showing output image
# with the Bitwise OR operation
# on the input images
cv2.imshow('Bitwise OR', dest_or)
 
# De-allocate any associated memory usage
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

Producción:

Python OpenCV Bitwise OR

Operación XOR bit a bit

Operación OR exclusiva bit a bit en elementos de array de entrada. 

Python3

# Python program to illustrate
# arithmetic operation of
# bitwise XOR of two images
     
# organizing imports
import cv2
import numpy as np
     
# path to input images are specified and
# images are loaded with imread command
img1 = cv2.imread('input1.png')
img2 = cv2.imread('input2.png')
 
# cv2.bitwise_xor is applied over the
# image inputs with applied parameters
dest_xor = cv2.bitwise_xor(img1, img2, mask = None)
 
# the window showing output image
# with the Bitwise XOR operation
# on the input images
cv2.imshow('Bitwise XOR', dest_xor)
 
# De-allocate any associated memory usage
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

Producción:

Python OpenCV Bitwie XOR

Operación NOT bit a bit

Inversión de elementos de array de entrada. 

Python3

# Python program to illustrate
# arithmetic operation of
# bitwise NOT on input image
     
# organizing imports
import cv2
import numpy as np
     
# path to input images are specified and
# images are loaded with imread command
img1 = cv2.imread('input1.png')
img2 = cv2.imread('input2.png')
 
# cv2.bitwise_not is applied over the
# image input with applied parameters
dest_not1 = cv2.bitwise_not(img1, mask = None)
dest_not2 = cv2.bitwise_not(img2, mask = None)
 
# the windows showing output image
# with the Bitwise NOT operation
# on the 1st and 2nd input image
cv2.imshow('Bitwise NOT on image 1', dest_not1)
cv2.imshow('Bitwise NOT on image 2', dest_not2)
 
# De-allocate any associated memory usage
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

Producción:

Bitwise NO en la imagen 1 

Python OpenCV bitwise not

Bitwise NO en la imagen 2 

Python OpenCV bitwise not

Traducción de imágenes

La traducción se refiere al desplazamiento rectilíneo de un objeto, es decir, una imagen de un lugar a otro. Si conocemos la cantidad de cambio en la dirección horizontal y vertical, digamos (tx, ty), entonces podemos hacer una array de transformación. Ahora, podemos usar la función cv2.wrapAffine() para implementar las traducciones. Esta función requiere una array de 2×3. La array numpy debe ser de tipo flotante.

Ejemplo: Python OpenCV Image Translation

Python3

import cv2
import numpy as np
 
image = cv2.imread('geeks.png')
 
# Store height and width of the image
height, width = image.shape[:2]
 
quarter_height, quarter_width = height / 4, width / 4
 
T = np.float32([[1, 0, quarter_width], [0, 1, quarter_height]])
 
# We use warpAffine to transform
# the image using the matrix, T
img_translation = cv2.warpAffine(image, T, (width, height))
 
cv2.imshow('Translation', img_translation)
cv2.waitKey(0)
 
cv2.destroyAllWindows()

Producción:

Python OpenCV Image Translation

Detección de bordes

El proceso de detección de imágenes implica la detección de bordes afilados en la imagen. Esta detección de bordes es esencial en el contexto del reconocimiento de imágenes o la localización/detección de objetos. Existen varios algoritmos para la detección de bordes debido a su amplia aplicabilidad. Usaremos uno de esos algoritmos conocido como Canny Edge Detection

Ejemplo: Python OpenCV Canny Edge Detección

Python3

import cv2
 
FILE_NAME = 'geeks.png'
 
# Read image from disk.
img = cv2.imread(FILE_NAME)
 
# Canny edge detection.
edges = cv2.Canny(img, 100, 200)
 
# Write image back to disk.
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

Python OpenCV Canny Edge Detection

Umbral simple

La umbralización es una técnica en OpenCV, que es la asignación de valores de píxel en relación con el valor de umbral proporcionado. En la determinación de umbrales, cada valor de píxel se compara con el valor de umbral. Si el valor del píxel es menor que el umbral, se establece en 0; de lo contrario, se establece en un valor máximo (generalmente 255). La umbralización es una técnica de segmentación muy popular, utilizada para separar un objeto considerado como primer plano de su fondo. Un umbral es un valor que tiene dos regiones a cada lado, es decir, por debajo del umbral o por encima del umbral.

En Computer Vision, esta técnica de umbralización se realiza en imágenes en escala de grises. Entonces, inicialmente, la imagen debe convertirse en un espacio de color en escala de grises.

If f (x, y) < T
  then f (x, y) = 0
else
  f (x, y) = 255

where
f (x, y) = Coordinate Pixel Value
T = Threshold Value.

En OpenCV con Python, la función cv2.threshold se usa para el umbral.

La técnica básica de Umbralización es la Umbralización Binaria. Para cada píxel, se aplica el mismo valor de umbral. Si el valor del píxel es menor que el umbral, se establece en 0; de lo contrario, se establece en un valor máximo. Las diferentes Técnicas Simples de Umbralización son:

  • cv2.THRESH_BINARY: si la intensidad de píxeles es mayor que el umbral establecido, el valor se establece en 255; de lo contrario, se establece en 0 (negro).
  • cv2.THRESH_BINARY_INV: Caso invertido o opuesto de cv2.THRESH_BINARY.
  • cv.THRESH_TRUNC: si el valor de intensidad de píxel es mayor que el umbral, se trunca al umbral. Los valores de píxel se establecen para que sean los mismos que el umbral. Todos los demás valores siguen siendo los mismos.
  • cv.THRESH_TOZERO: la intensidad de píxeles se establece en 0, para todas las intensidades de píxeles, menos que el valor de umbral.
  • cv.THRESH_TOZERO_INV: Caso invertido o opuesto de cv2.THRESH_TOZERO.

Ejemplo: Umbral simple de Python OpenCV

Python3

# Python program to illustrate
# simple thresholding type on an image
 
# organizing imports
import cv2
import numpy as np
 
# path to input image is specified and
# image is loaded with imread command
image1 = cv2.imread('geeks.png')
 
# cv2.cvtColor is applied over the
# image input with applied parameters
# to convert the image in grayscale
img = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
 
# applying different thresholding
# techniques on the input image
# all pixels value above 120 will
# be set to 255
ret, thresh1 = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img, 120, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img, 120, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img, 120, 255, cv2.THRESH_TOZERO_INV)
 
# the window showing output images
# with the corresponding thresholding
# techniques applied to the input images
cv2.imshow('Binary Threshold', thresh1)
cv2.imshow('Binary Threshold Inverted', thresh2)
cv2.imshow('Truncated Threshold', thresh3)
cv2.imshow('Set to 0', thresh4)
cv2.imshow('Set to 0 Inverted', thresh5)
 
# De-allocate any associated memory usage
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

Producción:

Python OpenCV simple thresholding

Umbral adaptativo

El umbral adaptativo es el método en el que el valor del umbral se calcula para regiones más pequeñas. Esto conduce a diferentes valores de umbral para diferentes regiones con respecto al cambio de iluminación. Usamos cv2.adaptiveThreshold para esto.

Ejemplo: Umbral adaptable de Python OpenCV

Python3

# Python program to illustrate
# adaptive thresholding type on an image
 
# organizing imports
import cv2
import numpy as np
 
# path to input image is specified and
# image is loaded with imread command
image1 = cv2.imread('geeks.png')
 
# cv2.cvtColor is applied over the
# image input with applied parameters
# to convert the image in grayscale
img = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
 
# applying different thresholding
# techniques on the input image
thresh1 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
                                cv2.THRESH_BINARY, 199, 5)
 
thresh2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                cv2.THRESH_BINARY, 199, 5)
 
# the window showing output images
# with the corresponding thresholding
# techniques applied to the input image
cv2.imshow('Adaptive Mean', thresh1)
cv2.imshow('Adaptive Gaussian', thresh2)
 
 
# De-allocate any associated memory usage
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

Producción:

Python OpenCV Adaptive Thresholding

Umbral de Otsu

En Otsu Thresholding , no se elige un valor de umbral, sino que se determina automáticamente. Se considera una imagen bimodal (dos valores de imagen distintos). El histograma generado contiene dos picos. Por lo tanto, una condición genérica sería elegir un valor de umbral que se encuentre en el medio de los dos valores máximos del histograma. Usamos la función tradicional cv2.threshold y usamos cv2.THRESH_OTSU como un indicador adicional.

Ejemplo: Python OpenCV Otsu Umbral

Python3

# Python program to illustrate
# Otsu thresholding type on an image
 
# organizing imports
import cv2
import numpy as np
 
# path to input image is specified and
# image is loaded with imread command
image1 = cv2.imread('geeks.png')
 
# cv2.cvtColor is applied over the
# image input with applied parameters
# to convert the image in grayscale
img = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
 
# applying Otsu thresholding
# as an extra flag in binary
# thresholding
ret, thresh1 = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY +
                             cv2.THRESH_OTSU)
 
# the window showing output image
# with the corresponding thresholding
# techniques applied to the input image
cv2.imshow('Otsu Threshold', thresh1)
 
# De-allocate any associated memory usage
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

Producción:

Python OpenCV Otsu Thresholding

desenfoque de imagen

Imagen borrosa se refiere a hacer que la imagen sea menos clara o distinta. Se realiza con la ayuda de varios núcleos de filtro de paso bajo. Tipos importantes de desenfoque:

  • Desenfoque gaussiano : el desenfoque gaussiano es el resultado de desenfocar una imagen mediante una función gaussiana. Es un efecto ampliamente utilizado en el software de gráficos, normalmente para reducir el ruido de la imagen y reducir los detalles. También se utiliza como etapa de preprocesamiento antes de aplicar nuestros modelos de aprendizaje automático o aprendizaje profundo. Por ejemplo, de un núcleo gaussiano (3 × 3)
  • Desenfoque de mediana: el filtro de mediana es una técnica de filtrado digital no lineal, que a menudo se usa para eliminar el ruido de una imagen o señal. El filtrado de mediana se usa mucho en el procesamiento de imágenes digitales porque, bajo ciertas condiciones, conserva los bordes mientras elimina el ruido. Es uno de los mejores algoritmos para eliminar el ruido de sal y pimienta.
  • Desenfoque bilateral: un filtro bilateral es un filtro de suavizado no lineal, que conserva los bordes y reduce el ruido para las imágenes. Reemplaza la intensidad de cada píxel con un promedio ponderado de los valores de intensidad de los píxeles cercanos. Este peso se puede basar en una distribución gaussiana. Por lo tanto, los bordes afilados se conservan mientras se descartan los débiles.

Ejemplo: Python OpenCV Blur Image

Python3

# importing libraries
import cv2
import numpy as np
 
image = cv2.imread('geeks.png')
 
cv2.imshow('Original Image', image)
cv2.waitKey(0)
 
# Gaussian Blur
Gaussian = cv2.GaussianBlur(image, (7, 7), 0)
cv2.imshow('Gaussian Blurring', Gaussian)
cv2.waitKey(0)
 
# Median Blur
median = cv2.medianBlur(image, 5)
cv2.imshow('Median Blurring', median)
cv2.waitKey(0)
 
 
# Bilateral Blur
bilateral = cv2.bilateralFilter(image, 9, 75, 75)
cv2.imshow('Bilateral Blurring', bilateral)
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

Python OpenCV Blur Image

Filtrado Bilateral

Se utiliza un filtro bilateral para suavizar las imágenes y reducir el ruido mientras se conservan los bordes. Sin embargo, estas circunvoluciones a menudo dan como resultado una pérdida de información de borde importante, ya que borran todo, independientemente de que sea ruido o un borde. Para contrarrestar este problema, se introdujo el filtro bilateral no lineal. OpenCV tiene una función llamada bilateralFilter() con los siguientes argumentos:

  • d: Diámetro de cada vecindad de píxeles.
  • sigmaColor: Valor de  \sigma     en el espacio de color. Cuanto mayor sea el valor, los colores más alejados entre sí comenzarán a mezclarse.
  • sigmaColor: Valor de  \sigma     en el espacio de coordenadas. Cuanto mayor sea su valor, más píxeles adicionales se mezclarán, dado que sus colores se encuentran dentro del rango sigmaColor.

Ejemplo: imagen bilateral Python OpenCV

Python3

import cv2
 
# Read the image
img = cv2.imread('geeks.png')
 
# Apply bilateral filter with d = 30,
# sigmaColor = sigmaSpace = 100
bilateral = cv2.bilateralFilter(img, 15, 100, 100)
 
# Save the output
cv2.imshow('Bilateral', bilateral)
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

Python OpenCV Bilateral Image

Contornos de imagen

Los contornos se definen como la línea que une todos los puntos a lo largo del límite de una imagen que tienen la misma intensidad. Los contornos son útiles en el análisis de formas, en encontrar el tamaño del objeto de interés y en la detección de objetos. OpenCV tiene la función findContour() que ayuda a extraer los contornos de la imagen. Funciona mejor en imágenes binarias, por lo que primero debemos aplicar técnicas de umbralización, bordes de Sobel, etc.

Ejemplo: Contorno de imagen Python OpenCV

Python3

import cv2
import numpy as np
 
# Let's load a simple image with 3 black squares
image = cv2.imread('geeks.png')
cv2.waitKey(0)
 
# Grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 
# Find Canny edges
edged = cv2.Canny(gray, 30, 200)
cv2.waitKey(0)
 
# Finding Contours
# Use a copy of the image e.g. edged.copy()
# since findContours alters the image
contours, hierarchy = cv2.findContours(edged,
    cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
 
cv2.imshow('Canny Edges After Contouring', edged)
cv2.waitKey(0)
 
print("Number of Contours found = " + str(len(contours)))
 
# Draw all contours
# -1 signifies drawing all contours
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)
 
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

Python OpenCV Image Contour

Erosión y Dilatación

Las operaciones morfológicas más básicas son dos: Erosión y Dilatación .

Fundamentos de la erosión:

  • Erosiona los límites del objeto en primer plano
  • Se utiliza para disminuir las características de una imagen.

Trabajo de erosión: 

  • Un núcleo (una array de tamaño impar (3,5,7) se convoluciona con la imagen.
  • Un píxel en la imagen original (ya sea 1 o 0) se considerará 1 solo si todos los píxeles debajo del kernel son 1; de lo contrario, se erosiona (se vuelve a cero).
  • Por lo tanto, todos los píxeles cercanos al límite se descartarán según el tamaño del kernel.
  • Entonces, el grosor o el tamaño del objeto de primer plano disminuye o simplemente la región blanca disminuye en la imagen.

Fundamentos de la dilatación:

  • Aumenta el área del objeto.
  • Se utiliza para acentuar las características.

Trabajo de dilatación:

  • Un núcleo (una array de tamaño impar (3,5,7) se convoluciona con la imagen
  • Un elemento de píxel en la imagen original es ‘1’ si al menos un píxel debajo del núcleo es ‘1’.
  • Aumenta la región blanca en la imagen o aumenta el tamaño del objeto en primer plano

Ejemplo: Erosión y dilatación de Python OpenCV

Python3

# Python program to demonstrate erosion and
# dilation of images.
import cv2
import numpy as np
 
# Reading the input image
img = cv2.imread('geeks.png', 0)
 
# Taking a matrix of size 5 as the kernel
kernel = np.ones((5,5), np.uint8)
 
# The first parameter is the original image,
# kernel is the matrix with which image is
# convolved and third parameter is the number
# of iterations, which will determine how much
# you want to erode/dilate a given image.
img_erosion = cv2.erode(img, kernel, iterations=1)
img_dilation = cv2.dilate(img, kernel, iterations=1)
 
cv2.imshow('Input', img)
cv2.imshow('Erosion', img_erosion)
cv2.imshow('Dilation', img_dilation)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción
 

Python OpenCV Erosion and Dilation

Coincidencia de características

ORB es una fusión del detector de punto clave FAST y el descriptor BRIEF con algunas funciones adicionales para mejorar el rendimiento. FAST son características de la prueba de segmento acelerado que se utiliza para detectar características de la imagen proporcionada. También utiliza una pirámide para producir características multiescala. Ahora no calcula la orientación y los descriptores de las características, por lo que aquí es donde BRIEF entra en el papel.

ORB usa descriptores BRIEF pero BRIEF funciona mal con la rotación. Entonces, lo que hace ORB es rotar el BRIEF de acuerdo con la orientación de los puntos clave. Usando la orientación del parche, se encuentra su array de rotación y rota el BRIEF para obtener la versión rotada. ORB es una alternativa eficiente a los algoritmos SIFT o SURF utilizados para la extracción de características, en el costo de cómputo, el rendimiento coincidente y, principalmente, las patentes. SIFT y SURF están patentados y se supone que debe pagarles por su uso. Pero ORB no está patentado. 

Python3

import numpy as np
import cv2
 
     
# Read the query image as query_img
# and train image This query image
# is what you need to find in train image
# Save it in the same directory
# with the name image.jpg
query_img = cv2.imread('geeks.png')
train_img = cv2.imread('geeks.png')
 
# Convert it to grayscale
query_img_bw = cv2.cvtColor(query_img,cv2.COLOR_BGR2GRAY)
train_img_bw = cv2.cvtColor(train_img, cv2.COLOR_BGR2GRAY)
 
# Initialize the ORB detector algorithm
orb = cv2.ORB_create()
 
# Now detect the keypoints and compute
# the descriptors for the query image
# and train image
queryKeypoints, queryDescriptors = orb.detectAndCompute(query_img_bw,None)
trainKeypoints, trainDescriptors = orb.detectAndCompute(train_img_bw,None)
 
# Initialize the Matcher for matching
# the keypoints and then match the
# keypoints
matcher = cv2.BFMatcher()
matches = matcher.match(queryDescriptors,trainDescriptors)
 
# draw the matches to the final image
# containing both the images the drawMatches()
# function takes both images and keypoints
# and outputs the matched query image with
# its train image
final_img = cv2.drawMatches(query_img, queryKeypoints,
train_img, trainKeypoints, matches[:20],None)
 
final_img = cv2.resize(final_img, (1000,650))
 
# Show the final image
cv2.imshow("Matches", final_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

python opencv feature matching

Dibujar en imágenes

Veamos algunas de las funciones de dibujo y dibujemos formas geométricas en imágenes usando OpenCV. Algunas de las funciones de dibujo son:

Para demostrar los usos de las funciones mencionadas anteriormente, necesitamos una imagen de tamaño 400 X 400 llena de un color sólido (negro en este caso). Para hacer esto, podemos utilizar la función numpy.zeroes para crear la imagen requerida. 

Ejemplo: Python OpenCV dibujar en la imagen

Python3

# Python3 program to draw rectangle
# shape on solid image
import numpy as np
import cv2
 
# Creating a black image with 3
# channels RGB and unsigned int datatype
img = np.zeros((400, 400, 3), dtype = "uint8")
 
# Creating rectangle
cv2.rectangle(img, (30, 30), (300, 200), (0, 255, 0), 5)
 
cv2.imshow('dark', img)
 
# Allows us to see image
# until closed forcefully
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

Python OpenCV Draw on Image

Reconocimiento facial

Haremos reconocimiento facial en este artículo usando algo conocido como cascadas haar . Haar Cascade es un enfoque basado en el aprendizaje automático en el que se utilizan muchas imágenes positivas y negativas para entrenar al clasificador.

  • Imágenes positivas: Estas imágenes contienen las imágenes que queremos que identifique nuestro clasificador.
  • Imágenes negativas: Imágenes de todo lo demás, que no contienen el objeto que queremos detectar.

Archivo utilizado: 

Ejemplo: Python OpenCV Face Recognition

Python3

# OpenCV program to detect face in real time
# import libraries of python OpenCV
# where its functionality resides
import cv2
 
# Trained XML classifiers describes some features of some
# object we want to detect a cascade function is trained
# from a lot of positive(faces) and negative(non-faces)
# images.
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
 
# Trained XML file for detecting eyes
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
 
# capture frames from a camera
cap = cv2.VideoCapture(0)
 
# loop runs if capturing has been initialized.
while 1:
 
    # reads frames from a camera
    ret, img = cap.read()
 
    # convert to gray scale of each frames
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
    # Detects faces of different sizes in the input image
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
 
    for (x,y,w,h) in faces:
        # To draw a rectangle in a face
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]
 
        # Detects eyes of different sizes in the input image
        eyes = eye_cascade.detectMultiScale(roi_gray)
 
        # To draw a rectangle in eyes
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,127,255),2)
 
    # Display an image in a window
    cv2.imshow('img',img)
 
    # Wait for Esc key to stop
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
 
# Close the window
cap.release()
 
# De-allocate any associated memory usage
cv2.destroyAllWindows()

Producción
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *