Procesamiento de imágenes con SciPy y NumPy en Python

En este tutorial, analizaremos el procesamiento de imágenes en Python utilizando los módulos científicos principales, como NumPy y SciPy. Las imágenes se componen de ndarrays NumPy para que podamos procesar y manipular imágenes y SciPy proporciona el submódulo scipy.ndimage que proporciona funciones que pueden operar en los arreglos NumPy.

Image Processing with SciPy and NumPy in Python

 Discutiremos cómo abrir y escribir imágenes, y también cubriremos diferentes técnicas de manipulación y filtrado. Entonces, antes de comenzar, veamos cómo instalar ambos módulos.

Instalación

Numpy: para instalar numpy, escriba el siguiente comando en la terminal.

pip install numpy

Installing Numpy on Linux using PIP

SciPy: también puede usar el comando anterior para instalar SciPy.

pip install scipy

pip install scipy

Abrir y escribir imágenes

El paquete misceláneo de SciPy viene con algunas imágenes precargadas. Usaremos esas imágenes para aprender sobre el procesamiento de imágenes. Una de esas imágenes es proporcionada por la función face(). La función face() obtendrá una imagen coloreada de la cara de un mapache.

Ejemplo: Guardar imagen usando SciPy

Python3

from scipy import misc
import imageio
import matplotlib.pyplot as plt
 
# reads a raccoon face
face = misc.face()
 
# save the image
imageio.imsave('raccoon.png', face)
 
plt.imshow(face)
plt.show()

Producción:

scipy open image

Ejemplo: crear una array NumPy a partir de la imagen

Aquí leeremos la imagen usando la función imread().

Python3

from scipy import misc
import imageio
import matplotlib.pyplot as plt
 
img = imageio.imread('raccoon.png')
 
print(img.shape)
print(img.dtype)
 
plt.imshow(img)
plt.show()

Producción:

(768, 1024, 3)
uint8

imread image scipy

Crear archivo RAW

Un archivo RAW es un archivo que contiene datos mínimamente procesados ​​de un sensor de imagen. Podemos crear este archivo usando el método tofile() del paquete scipy.

Ejemplo: Crear un archivo RAW usando SciPy

Python3

from scipy import misc
import imageio
import matplotlib.pyplot as plt
 
# reads a raccoon face
face = misc.face()
 
face.tofile("raccoon.raw")

Esto creará un archivo .raw en nuestro directorio de trabajo actual.

Apertura de archivo RAW

Para abrir el archivo .raw, necesitaremos el módulo NumPy que usará el método fromfile(). Esta función es una forma eficiente de leer datos binarios con un tipo de datos conocido, así como de analizar texto con formato simple.

Ejemplo: lectura de un archivo RAW usando NumPy

Python3

import numpy as np
 
img = np.fromfile('raccoon.raw',
                  dtype=np.uint8)
 
print(img.shape)

Producción:

(2359296,)

Obtención de información estadística

Podemos usar las funciones max() y min() para obtener el máximo y el mínimo a lo largo del eje dado. Y para encontrar la media podemos usar la función mean().

Ejemplo: obtener valores mínimos, máximos y medios

Python3

from scipy import misc
 
img = misc.face()
 
print(img.max())
print(img.min())
print(img.mean())

Producción:

255
0
110.16274388631184

Imagen recortada

Como sabemos que las imágenes están representadas por números en una array, cambiar el valor de la array resultará en cambiar la imagen original. Veamos cómo usar esta idea para recortar la imagen.

Ejemplo: recortar la imagen

Python3

from scipy import misc
import matplotlib.pyplot as plt
 
# for grascaling the image
img = misc.face(gray = True)
 
 
x, y = img.shape
 
# Cropping the image
crop = img[x//3: - x//8, y//3: - y//8]
 
plt.imshow(crop)
plt.show()

Producción:

cropping image scipy and numpy

Voltear imágenes

Podemos usar la función flipud() del módulo numpy para voltear esa imagen. Esta función voltea la array (entradas en cada columna) en dirección arriba-abajo, conservando la forma.

Ejemplo: Voltear imagen usando Scipy

Python3

from scipy import misc
import numpy as np
import matplotlib.pyplot as plt
 
img = misc.face()
 
flip = np.flipud(img)
 
plt.imshow(flip)
plt.show()

Producción:

flip image using numpy and scipy

Imágenes giratorias

Para rotar las imágenes podemos usar la función ndarray.rotate(). Esta función gira la imagen en un ángulo específico.

Ejemplo: Rotar imagen usando SciPy y NumPy

Python3

from scipy import misc,ndimage
import matplotlib.pyplot as plt
 
 
img = misc.face()
 
rotate = ndimage.rotate(face, 30)
 
plt.imshow(rotate)
plt.show()

Producción:

rotate image using numpy and scipy

Filtrado de imágenes

En términos más simples, el filtrado de imágenes es un proceso para mejorar o modificar una imagen en el que podemos aumentar la nitidez, mejorar los bordes o desenfocar la imagen. En el filtrado de imágenes, se aplica algún algoritmo al valor de píxel de la imagen dada y ese algoritmo determina el valor de la imagen de salida. Veamos algunas operaciones de filtrado de imágenes que se pueden realizar con NumPy y SciPy.

Imágenes borrosas

Desenfocar una imagen es un proceso de reducción del nivel de ruido en la imagen. Para esto, podemos usar un filtro gaussiano o un filtro unicornio.

Ejemplo: desenfocar imágenes usando SciPy y NumPy

Python3

from scipy import misc,ndimage
import matplotlib.pyplot as plt
 
img = misc.face()
 
blur_G = ndimage.gaussian_filter(img,sigma=7)
 
plt.imshow(blur_G)
plt.show()

Producción:

blur images using scipy and numpy

Afilado de imágenes

La nitidez se refiere a aumentar el contraste entre las regiones claras y oscuras y hacer que la imagen sea más definida y resalte las características de la imagen. Hay tres razones principales para mejorar la nitidez de la imagen: superar la borrosidad introducida por el equipo de la cámara, llamar la atención sobre ciertas áreas y aumentar la legibilidad. Si hay texto borroso en la imagen, se vuelve fácil de leer.

Ejemplo: Afilado de imágenes usando NumPy y SciPy

Python3

from scipy import misc, ndimage
import matplotlib.pyplot as plt
 
img = misc.face(gray=True).astype(float)
blur = ndimage.gaussian_filter(img, 5)
 
# Showing Blur Image
plt.imshow(blur)
plt.show()
 
blur_G = ndimage.gaussian_filter(blur, 1)
alpha = 30
sharp = blur+alpha*(blur-blur_G)
 
# showing sharp images
plt.imshow(sharp)
plt.show()

Producción:

Sharpening images using NumPy and SciPy

Imágenes de eliminación de ruido

La eliminación de ruido de una imagen se refiere al proceso de reconstrucción de una señal a partir de imágenes ruidosas. La eliminación de ruido se realiza para eliminar el ruido no deseado de la imagen para analizarla mejor. Al principio, vamos a crear una imagen ruidosa: 

Ejemplo 1: Creación de una imagen ruidosa

Python3

from scipy import misc,ndimage
import matplotlib.pyplot as plt
import numpy as np
 
img=misc.face(gray=True).astype(float)
img=img[40:100,30:100]
 
noise_img=img+0.9*img.std()*np.random.random(img.shape)
 
plt.imshow(noise_img)
plt.show()

Producción:

noisy image using scipy and numpy

Para suavizar los bordes y el ruido usamos el filtro Gaussiano.

Python3

denoised = ndimage.gaussian_filter(noise_img, 2.2)
 
plt.imshow(denoised)
plt.show()

Producción:

denoise gaussian filter

También podemos conservar los bordes utilizando el filtro mediano.

Python3

denoised = ndimage.median_filter(noise_img, 4)
 
plt.imshow(denoised)
plt.show()

Producción:

denoised scipy and numpy

Detección de bordes

El proceso de detección de imágenes implica la detección de bordes en la imagen. Funciona detectando discontinuidades en el brillo. Para variaciones de alta intensidad, podemos usar Sobel, un operador de gradiente.

Ejemplo: Detección de bordes usando SciPy y NumPy

Python3

from scipy import misc, ndimage
import matplotlib.pyplot as plt
import numpy as np
 
img = np.zeros((300, 300))
img[64:-64, 64:-64] = 1
img = ndimage.rotate(im, 30, mode='constant')
img = ndimage.gaussian_filter(im, 7)
 
# Original image
plt.imshow(im)
plt.show()
 
# edge detection
x = ndimage.sobel(im, axis=0, mode='constant')
y = ndimage.sobel(im, axis=1, mode='constant')
Sobel = np.hypot(x, y)
 
plt.imshow(sob)
plt.show()

Producción:

edge detection scipy and numpy

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 *