La eliminación de parte de una imagen se refiere al proceso de destrucción de datos de imagen en ciertas regiones de una imagen. Donde la eliminación puede ser dinámica o codificada. En la mayoría de los procesos de eliminación, las dimensiones de la imagen permanecen iguales en la imagen resultante. Quitar literalmente secciones de una imagen cambiaría las dimensiones de manera inexplicable. En este artículo, veremos las formas de eliminar una región de una imagen y aprenderemos sobre las diferentes formas de hacerlo.
¿Por qué eliminar una región de una imagen?
A veces, una imagen contiene ciertos artefactos (irregularidades) o regiones no deseadas que pueden ser indeseables. Una vez que se han reconocido dichas regiones, es necesario identificar sus tipos, lo que ayudaría a encontrar el mejor método para deshacerse de ellas. La mayoría de los paquetes de procesamiento de imágenes como Photoshop, Gimp, etc. ofrecen herramientas para realizar tareas específicas. Pero esto también se puede hacer programáticamente como veremos en un momento. La siguiente imagen se utilizará para la demostración.
Ejemplo 1:
Eliminar una parte (Región) de una imagen requiere que se proporcione la Región de interés de antemano. Donde proporcionar ROI cada vez que se realiza el proceso significa que el ROI está codificado. Mientras que el cálculo del ROI por sí mismo (que cambia según las diferentes imágenes y condiciones ) significa que el ROI es dinámico. Donde el ROI es generalmente una tupla de tamaño 4 que contiene las coordenadas superior izquierda e inferior derecha del Bbox.
Eliminar una región significa que primero seleccionamos la región de la que estamos dispuestos a deshacernos. Donde la selección podría estar basada en valores de región o píxel. Una vez que se haya identificado la región, convertiremos los valores de píxel de esa región en los del fondo. Donde el color de fondo no es constante y, por lo tanto, depende del contexto para el que se utilizará la imagen. Los fondos más comunes son blanco o negro. En este artículo, asumiremos que el color de fondo es negro. Para demostrar esto, estaríamos eliminando los píxeles en la región (0,0) a (400, 400) (lado superior izquierdo) de la imagen antes mencionada.
A continuación se muestra la implementación:
Python3
from PIL import Image import numpy as np # Opening the image and converting # it to RGB color mode # IMAGE_PATH => Path to the image img = Image.open(r"IMAGE_PATH").convert('RGB') # Extracting the image data & # creating an numpy array out of it img_arr = np.array(img) # Turning the pixel values of the 400x400 pixels to black img_arr[0 : 400, 0 : 400] = (0, 0, 0) # Creating an image out of the previously modified array img = Image.fromarray(img_arr) # Displaying the image img.show()
Producción:
Explicación:
En primer lugar, importamos la biblioteca de imágenes PIL y el módulo Numpy, lo que nos permitiría almacenar valores de píxeles homogéneos como arrays, lo que a su vez conduce a operaciones más rápidas en ellos. Luego abrimos la imagen (objeto de imagen creado) usando la función Image.open() y luego convertimos la imagen al modo de color RGB (originalmente era RGBA). Después de lo cual creamos una array Numpy a partir de los datos de la imagen usando la función np.array() . Más tarde, utilizamos el corte indexado para convertir los valores de píxel de la región (0, 0) – (400, 400) en negro (0, 0, 0). Al final, creamos una imagen a partir de los datos de píxeles modificados usando Image.fromarray() y la mostramos.
Ejemplo 2: Eliminación de la región de una imagen que tiene el modo de color rgba
Si una imagen es del modo de color RGBA, entonces la región eliminada no necesita representarse usando un valor de color (como en el caso anterior). Podríamos hacer que las regiones eliminadas aparezcan como completamente transparentes (con alfa 0). Esto no solo cumple el propósito de eliminar esa región de la imagen final (o casi desaparecer), sino que también brinda una indicación visual de píxeles inexistentes en esa región. Para demostrar esto, se utilizará la siguiente imagen: –
Estaríamos eliminando las regiones de la imagen que están llenas de color negro. Dado que la región no se puede describir como una forma, estaríamos usando funciones de inundación para llenar esa región con valores de píxeles transparentes. En el siguiente ejemplo, usaríamos el valor del color magenta como semilla para el algoritmo de inundación y lo usaríamos para obtener valores de píxeles totalmente transparentes.
A continuación se muestra la implementación:
Python3
# Importing ImageDraw for # using floodfill function from PIL import Image, ImageDraw # Opening the image and # converting its type to RGBA img = Image.open(r"IMG_PATH").convert('RGBA') # Location of seed seed = (0, 0) # Pixel Value which would # be used for replacement rep_value = (0, 0, 0, 0) # Calling the floodfill() function and # passing it image, seed, value and # thresh as arguments ImageDraw.floodfill(img, seed, rep_value, thresh = 100) img.show()
Producción:
Puede parecer que el color negro en la imagen fue reemplazado por el color blanco. Pero ese color blanco es, de hecho, el color del fondo, los píxeles de esas regiones son completamente transparentes (con alfa = 0). Lo que hicimos en el código anterior es:
- En primer lugar, descubrió la región continua más larga que consta de color negro (usando el algoritmo de relleno de inundación/semilla para hacerlo)
- Cambie los valores de color de esa región a (0, 0, 0, 0) (transparencia total)