Filtros de imagen
Ecualización de histograma adaptativa¶
Histograma
Un histograma de imagen es un tipo de histograma que actúa como representación gráfica de la distribución tonal en una imagen digital. Traza el número de píxeles para cada valor tonal. Al observar el histograma de una imagen específica, el espectador podrá evaluar toda la distribución tonal de un solo vistazo.
Más información en las entradas de Wikipedia Image histogram y Ecualización del histograma.
# Ejemplo de ecualización del histograma
#
# Utilizar la ecualización de histograma para mejorar el contraste de una imagen
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
while(True):
clock.tick()
# Un clip_limit inferior a 0 proporciona una ecualización adaptativa normal del histograma,
# lo que puede dar lugar a una gran cantidad de ruido de contraste...
# Un clip_limit de 1 no hace nada. Para obtener los mejores resultados, utiliza un valor
# ligeramente superior a 1, como se muestra a continuación. Cuanto más alto sea el valor,
# más se acercará a la ecualización adaptativa estándar del histograma con grandes cambios
# de contraste
img = sensor.snapshot().histeq(adaptive=True, clip_limit=3)
print(clock.fps())
Descargar el programa Ecualización_histograma.py
Desenfoque¶
# Rutinas de filtrado difuso
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QVGA) # Tamaño de salida de la cámara QVGA (320x240)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
# Aplicar desenfoque gaussiano a la imagen
img.gaussian(1)
print(clock.fps())
Caricatura¶
# Rutina de filtro de caricaturización
# Este ejemplo muestra un filtro de caricaturización sencillo en una imagen.
# El filtro de caricaturización funciona conectando regiones de píxeles similares en una imagen
# y sustituyendo los píxeles de estas regiones por el valor medio de la región.
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # o GRAYSCALE...
sensor.set_framesize(sensor.QVGA) # o QQVGA...
sensor.skip_frames(time = 2000)
clock = time.clock()
while(True):
clock.tick()
# seed_threshold: Controla el crecimiento máximo del área de coloración. Al ampliarla,
# se fusionarán más píxeles.
# floating_threshold: La diferencia máxima entre píxeles al controlar el área de crecimiento.
# Si se establece un valor alto, se combinarán rápidamente todos los píxeles de la imagen.
# Se recomienda reducirlo.
# cartoon() Regiones que satisfacen ambas restricciones de crecimiento...
img = sensor.snapshot().cartoon(seed_threshold=0.05, floating_thresholds=0.05)
print(clock.fps())
Descargar el programa Caricatura.py
Filtro bilateral¶
Filtro bilateral
Un filtro bilateral es un filtro de suavizado no lineal que preserva los bordes y reduce el ruido de las imágenes . Reemplaza la intensidad de cada píxel con un promedio ponderado de los valores de intensidad de los píxeles cercanos. Esta ponderación puede basarse en una distribución gaussiana. El filtro bilateral es casi como un filtro gaussiano.
# Este ejemplo muestra el uso del filtrado bilateral en una imagen en color.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QVGA) # Tamaño de salida de la cámara QVGA (320x240)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
# color_sigma: Controla lo cerca que deben estar los píxeles de color para que se difuminen
# blured togheter.Los valores más pequeños significan que deben estar más cerca de.
# Los valores más altos son menos estrictos
# space_sigma: Controla la distancia mínima que deben tener entre sí los píxeles espaciales
# para que se difuminen juntos. Un valor más pequeño significa que deben estar más cerca.
# Un valor más grande es menos estricto.
# Ejecutar el núcleo en cada píxel de la imagen
img.bilateral(3, color_sigma=0.1, space_sigma=1)
# Tengase en cuenta que el filtro bilateral puede introducir defectos en la imagen si se
# establece color_sigma/space_sigma de forma agresiva. Aumenta los valores sigma hasta que
# desaparezcan los defectos si los hay.
print(clock.fps())
Descargar el programa Filtro_bilateral.py
Filtro binario¶
# Filtro binario
import sensor, image, time
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.skip_frames(time = 2000)
clock = time.clock()
# Establece el umbral:
# para el caso de imágenes rgb los seis números son (minL, maxL, minA, maxA, minB, maxB)
# para el caso de escala de grises, basta con establecer los números (mín, máx).
red_threshold = (0,100, 0,127, 0,127) # L A B
green_threshold = (0,100, -128,0, 0,127) # L A B
blue_threshold = (0,100, -128,127, -128,0) # L A B
# Utiliza Herramientas -> Visión de maquina -> Editor de Umbrales para seleccionar un umbral mejor.
while(True):
# Umbral rojo
for i in range(100):
clock.tick()
img = sensor.snapshot()
img.binary([red_threshold])
print(clock.fps())
# Umbral verde
for i in range(100):
clock.tick()
img = sensor.snapshot()
img.binary([green_threshold])
print(clock.fps())
# Umbral azul
for i in range(100):
clock.tick()
img = sensor.snapshot()
img.binary([blue_threshold])
print(clock.fps())
# Sin umbral rojo
for i in range(100):
clock.tick()
img = sensor.snapshot()
img.binary([red_threshold], invert = 1)
print(clock.fps())
# Sin umbral verde
for i in range(100):
clock.tick()
img = sensor.snapshot()
img.binary([green_threshold], invert = 1)
print(clock.fps())
# Sin umbral azul
for i in range(100):
clock.tick()
img = sensor.snapshot()
img.binary([blue_threshold], invert = 1)
print(clock.fps())
Descargar el programa Filtro_binario.py
Detección de brillos¶
# Rutina de deteccion y eliminación de brillos en imágenes
# Este ejemplo muestra cómo eliminar los brillos de una imagen.
# Para ello, se puede utilizar el método binary() con el parámetro "zero ="
# La eliminación de los brillos de una imagen permite utilizar histeq() en la imagen
# sin que los valores atípicos de las partes sobresaturadas de la imagen corrompan el algoritmo
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
thresholds = (90, 100, -128, 127, -128, 127)
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot().binary([thresholds], invert=False, zero=True)
print(clock.fps())
Descargar el programa Brillos.py
Filtro laplaciano¶
filtro laplaciano
El filtro laplaciano se usa en visión por computadora para detectar bordes en una imagen al resaltar áreas con cambios rápidos de intensidad, es decir, donde hay discontinuidades pronunciadas en los píxeles. Este filtro calcula la segunda derivada de la imagen y usa un núcleo con suma cero para realzar los bordes y suprimir las regiones planas, produciendo bordes delgados y nítidos.
# Filtro laplaciano
import sensor, image, time
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
# Ejecuta el algoritmo en cada píxel de la imagen.
img.laplacian(1)
print(clock.fps())
Descargar el programa Filtro_laplaciano.py
Corrección gamma¶
# Corrección gamma
#
# Este ejemplo muestra cómo desactivar la corrección gamma para que la imagen sea más brillante
# El método de corrección gamma también corrige el contraste y el brillo
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
while(True):
clock.tick()
# Corrección de gamma, contraste y brillo aplicada a cada canal
img = sensor.snapshot().gamma_corr(gamma = 0.5, contrast = 1.0, brightness = 0.0)
print(clock.fps())
Descargar el programa Correccion_gamma.py
Filtro bilateral en escala de grises¶
# Rutinas de filtrado bilateral
# Este ejemplo muestra el uso del filtrado bilateral en una imagen en escala de grises
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
# color_sigma: Controla lo cerca que deben estar los píxeles de color para que se difuminen juntos
# Los valores más pequeños significan que deben estar más cerca de.
# Los valores más altos son menos estrictos
# space_sigma: Controla la distancia mínima que deben tener entre sí los píxeles espaciales
# para que se difuminen juntos. Un valor más pequeño significa que deben estar más cerca.
# Un valor más grande es menos estricto.
# Ejecutar el algoritmo para cada pixel de la imagen
img.bilateral(3, color_sigma=0.1, space_sigma=1)
# Ten en cuenta que los filtros bilaterales pueden introducir defectos en la imagen
# Si observas un defecto, aumenta el valor sigma hasta que el defecto desaparezca。
print(clock.fps())
Eliminación de luz en escala de grises¶
# Rutina de filtrado en escala de grises
# Este ejemplo muestra cómo eliminar las partes brillantes de una imagen.
# Puedes hacerlo utilizando el método binary() con el parámetro "zero =".
# Al eliminar las partes brillantes de la imagen, puedes utilizar histeq() en la imagen sin
# que los valores atípicos de las partes sobresaturadas de la imagen corrompan el algoritmo...
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.GRAYSCALE) # Formato de salida de la cámara GRAYSCALE (también puede ser RGB565)
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
thresholds = (220, 255)
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot().binary([thresholds], invert=False, zero=True)
print(clock.fps())
Descargar el programa Eliminacion_luz_escala_grises.py
Ecualización del histograma¶
# Ecualización del histograma
#
# Este ejemplo muestra cómo se puede utilizar la ecualización de histograma para mejorar
# el contraste de una imagen
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot().histeq()
print(clock.fps())
Descargar el programa Ecualizacion_histograma.py
Distorsión¶
# Distorsión
# Este ejemplo muestra cómo utilizar métodos de corrección de distorsión para rectificar problemas
# de distorsión de imágenes.
# Aumente el valor de strength (potencia) hasta que aparezcan líneas rectas en la vista.
# zoom representa el factor de escala aplicado a la imagen. El valor predeterminado es 1.
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot().lens_corr(strength = 2.0, zoom = 1.0)
print(clock.fps())
Descargar el programa Distorsion.py
Cartografía polar lineal¶
Coordenadas polares lineales
Las coordenadas polares lineales son aquellas en las que una imagen se transforma o se manipula utilizando un filtro que la convierte de un formato rectangular o de proyección a un formato de "circunferencia", como en un globo terráqueo. Se pueden aplicar como un filtro en programas de edición de imágenes.
# Ejemplo de mapeo de coordenadas polares lineales
# Este ejemplo muestra cómo reproyectar una imagen utilizando una transformación de coordenadas
# polares lineales. Las imágenes polares lineales resultan útiles, ya que las rotaciones se traducen
# en desplazamientos lineales a lo largo del eje X, mientras que los cambios lineales en la escala
# se convierten en desplazamientos lineales a lo largo del eje Y.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot().linpolar(reverse=False)
print(clock.fps())
Descargar el programa Cartografia_polar_lineal.py
Coordenadas polares logarítmicas¶
Coordenadas polares logarítmicas
Las coordenadas polares logarítmicas son un sistema bidimensional que representa un punto con un ángulo y el logaritmo de la distancia a un punto de referencia (el polo). La imagen resultante de aplicar esta transformación no muestra la forma de la función en su distancia real, sino la distancia en una escala logarítmica, donde la distancia a lo largo de una espiral, por ejemplo, se vería como una línea recta o menos pronunciada que en su representación polar estándar.
# Coordenadas polares logarítmicas
# Este ejemplo muestra cómo reproyectar una imagen utilizando la transformación de coordenadas polares
# logarítmicas. Las imágenes de coordenadas polares logarítmicas resultan útiles, ya que las rotaciones
# se convierten en traslaciones a lo largo del eje X y los cambios de escala exponenciales (x², x⁴, etc.)
# se transforman en traslaciones lineales a lo largo del eje Y.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot().logpolar(reverse=False)
print(clock.fps())
Descargar el programa Coordenadas_polares_log.py
Filtro valor medio¶
# Rutina de filtro valor medio
# Ejemplo de filtrado del valor medio. El filtro de media es el filtro de media estándar para areas NxN
# El filtrado del valor medio elimina el ruido de una imagen difuminando todo el contenido
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
# El único argumento es el tamaño del kernel. N corresponde a un tamaño de kernel ((N*2)+1)^2.
# Por ejemplo, 1 == kernel 3x3, 2 == kernel 5x5, etc.
# Nota: Nunca debería ser necesario utilizar un valor superior a 2.
img.mean(1)
print(clock.fps())
Descargar el programa Filtro_valor_medio.py
Filtrado de umbral adaptativo de valor medio¶
# Ejemplo de filtrado de umbral adaptativo medio
#
# Este ejemplo muestra el filtrado medio con procesamiento de umbral adaptativo. Cuando
# mean(threshold = True), el método mean() aplica un umbral adaptativo a la imagen comparando
# el valor medio de los píxeles circundantes menos un desplazamiento.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
# El primer parámetro es el tamaño del kernel. N corresponde a un tamaño de núcleo de ((N * 2) + 1)^2.
# Por ejemplo: 1 corresponde a un núcleo de 3x3, 2 corresponde a un núcleo de 5x5, y así sucesivamente.
# Nota: No se debe utilizar valores superiores a 2.
img.mean(2, threshold=True, offset=5, invert=True)
print(clock.fps())
Descargar el programa umbral_adaptativo_valor_medio.py
Filtro de mediana¶
# Filtro de mediana
#
# El filtro de mediana sustituye cada píxel por la mediana de su area NxN. El filtrado de mediana
# es bueno para eliminar el ruido de una imagen preservando los bordes mientras se elimina el
# ruido de la imagen.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
# Size es el tamaño del kernel. 1 (kernel3x3)、2 (kernel 5x5) o superior
# El percentil controla el percentil de los valores utilizados dentro del núcleo. Por defecto,
# cada píxel se sustituye por el quinto percentil adyacente (centro). Cuando se utiliza el
# filtrado mínimo, se puede establecer este valor en 0; cuando se utiliza el filtrado del
# cuartil inferior, se establece en 0,75; y cuando se utiliza el filtrado máximo, se establece
# en 1. Cuando se utiliza el filtro del cuartil inferior, 0,75 cuando se utiliza el filtro del
# cuartil superior y 1 cuando se utiliza el filtro máximo.
img.median(1, percentile=0.5)
print(clock.fps())
Descargar el programa Filtro_mediana.py
Filtro de umbral adaptativo mediana¶
# Ejemplo de filtrado de umbral adaptativo mediana.
# Este ejemplo muestra el filtrado mediana con umbral adaptativo. Cuando median(threshold=True),
# el método median() aplica un umbral adaptativo a la imagen comparando la mediana de los píxeles
# circundantes menos un desplazamiento.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
# El primer parámetro es el tamaño del kernel. N corresponde a un tamaño de kernel de ((N * 2) + 1)^2.
# Por ejemplo: 1 corresponde a un kernel de 3x3, 2 corresponde a un kernel de 5x5, y así sucesivamente.
# El segundo parámetro "percentil" denota el percentil seleccionado del area proxima NxN.
# 0,5 representa la mediana, 0,25 el cuartil inferior y 0,75 el cuartil superior.
img.median(1, percentile=0.5, threshold=True, offset=5, invert=True)
print(clock.fps())
Descargar el programa umbral_adaptativo_mediana.py
Filtro modal¶
# Rutina de filtro modal
#
# Este ejemplo muestra el filtrado modal. El filtrado modal es una operación altamente no lineal que
# sustituye cada píxel por el modo de su area proxima NxN.
# Evitese utilizar filtros modales en imágenes RGB565. Provocan errores en los bordes de la imagen.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
# Size es el tamaño del kernel, 1 (kernel de 3x3)、2 (kernel de 5x5)
img.mode(1)
print(clock.fps())
Descargar el programa Filtro_modal.py
Filtro de umbral adaptativo¶
# Filtro de umbral adaptativo
# Ejemplo que muestra el filtrado utilizando umbrales adaptativos.
# El método `mode(threshold=True)` adapta el umbral comparando la
# mediana de los píxeles proximos con el valor del píxel y restando luego un desplazamiento.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
# El parámetro es el tamaño del kernel, que puede ser 0, 1 o 2
# para kernels de 1x1, 3x3 o 5x5, respectivamente.
img.mode(1, threshold=True, offset=5, invert=True)
print(clock.fps())
Descargar el programa Filtro_umbral_adaptativo.py
Negativo¶
# Rutina de inversión del valor de los píxeles
#
# Este ejemplo muestra una imagen con los valores de los píxeles invertidos.
# Aunque no es especialmente útil, en ocasiones puede resultar práctico.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.RGB565) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot().negate()
print(clock.fps())
Descargar el programa Negativo.py
Corrección de perspectivas¶
# Corrección de perspectivas
#
# Ejemplo que muestra cómo utilizar rotation_corr() para corregir la distorsión de la perspectiva y,
# a continuación, rotar la nueva imagen corregida hacia la derecha en el espacio 3D para tener en
# cuenta el movimiento.
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
# La imagen se distorsionará de forma que los siguientes puntos se conviertan en nuevos.
#
# (0, 0)
# (w-1, 0)
# (w-1, h-1)
# (0, h-1)
#
# Intenta colocar los siguientes puntos en las esquinas de un
# cuadrilátero (en el sentido de las agujas del reloj).
# Puedes obtener puntos en la imagen haciendo clic y arrastrando
# el búfer de fotogramas y registrando los valores que se muestran en el widget del histograma.
w = sensor.width()
h = sensor.height()
TARGET_POINTS = [(0, 0), # (x, y) ¡CÁMBIAME!
(w-1, 0), # (x, y) ¡CÁMBIAME!
(w-1, h-1), # (x, y) ¡CÁMBIAME!
(0, h-1)] # (x, y) ¡CÁMBIAME!
while(True):
clock.tick()
img = sensor.snapshot().rotation_corr(corners = TARGET_POINTS)
print(clock.fps())
Descargar el programa Corrección_perspectivas.py
Rotación¶
# Rotación
#
# Este ejemplo muestra cómo utilizar rotation_corr()
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
w = sensor.width()
h = sensor.height()
TARGET_POINTS = [(0, 0), # (x, y) ¡CÁMBIAME!
(w-1, 0), # (x, y) ¡CÁMBIAME!
(w-1, h-1), # (x, y) ¡CÁMBIAME!
(0, h-1)] # (x, y) ¡CÁMBIAME!
# Ángulo de rotación por fotograma...
X_ROTATION_DEGREE_RATE = 5
Y_ROTATION_DEGREE_RATE = 0.5
Z_ROTATION_DEGREE_RATE = 0
X_OFFSET = 0
Y_OFFSET = 0
ZOOM_AMOUNT = 1 # Valores más bajos reducen y valores más altos aumentan
FOV_WINDOW = 25 # Entre 0 y 180. Representa el campo de visión de la ventana de la escena
# al girar la imagen en el espacio tridimensional.
# Cuando se acerca a 0, las líneas parecen más rectas a medida que la ventana
# se aleja de la imagen que gira en el espacio tridimensional.
# En el espacio tridimensional, los valores más altos acercan la ventana a la
# imagen, lo que provoca una mayor distorsión de la perspectiva, lo que en
# ocasiones puede hacer que la imagen tridimensional se cruce con la ventana de la escena.
x_rotation_counter = 0
y_rotation_counter = 0
z_rotation_counter = 0
while(True):
clock.tick()
img = sensor.snapshot().rotation_corr(x_rotation = x_rotation_counter, \
y_rotation = y_rotation_counter, \
z_rotation = z_rotation_counter, \
x_translation = X_OFFSET, \
y_translation = Y_OFFSET, \
zoom = ZOOM_AMOUNT, \
fov = FOV_WINDOW, \
corners = TARGET_POINTS)
x_rotation_counter += X_ROTATION_DEGREE_RATE
y_rotation_counter += Y_ROTATION_DEGREE_RATE
z_rotation_counter += Z_ROTATION_DEGREE_RATE
print(clock.fps())
Descargar el programa Rotacion.py
Nitidez¶
# Nitidez
#
# Utilizar transformaciones para aumentar la nitidez de una imagen.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.GRAYSCALE) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
# Ejecutar el kernel en cada píxel de la imagen
img.laplacian(1, sharpen=True)
print(clock.fps())
Descargar el programa Nitidez.py
Enfoque¶
# muestra el uso de un filtro gaussiano para eliminar el efecto
# del filtro de de nitidez de una imagen.
import sensor, image, time
sensor.reset() # Reiniciar e inicializar Sentry2
sensor.set_pixformat(sensor.GRAYSCALE) # Formato de salida de la cámara RGB565 (también puede ser GRAYSCALE))
sensor.set_framesize(sensor.QQVGA) # Tamaño de salida de la cámara QQVGA (160x120)
sensor.skip_frames(time = 2000) # Saltar fotogramas cada 2000ms
clock = time.clock() # Crea un objeto reloj para calcular la frecuencia de imagen
while(True):
clock.tick() # Actualizar el reloj que calcula la velocidad en fotogramas
img = sensor.snapshot() # Obtener una imagen
# Ejecutar el kernel en cada píxel de la imagen
img.gaussian(1, unsharp=True)
print(clock.fps())
Descargar el programa Enfoque.py
Inversión vertical - Espejo horizontal - Transposición¶
# Inversión vertical - Espejo horizontal - Transposición
#
# Muestra cómo voltear verticalmente, reflejar horizontalmente o transponer una imagen.
#
# vflip=False, hmirror=False, transpose=False -> 0 grados de rotacion
# vflip=True, hmirror=False, transpose=True -> 90 grados de rotacion
# vflip=True, hmirror=True, transpose=False -> 180 grados de rotacion
# vflip=False, hmirror=True, transpose=True -> grados de rotacion
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
mills = time.ticks_ms()
counter = 0
while(True):
clock.tick()
img = sensor.snapshot().replace(vflip=(counter//2)%2,
hmirror=(counter//4)%2,
transpose=(counter//8)%2)
if (time.ticks_ms() > (mills + 1000)):
mills = time.ticks_ms()
counter += 1
print(clock.fps())