Blog
Operaciones Básicas en Imágenes
- Publicado por: Rafael Fernandez
- Categoría: Blog OpenCV Procesamiento de Imagenes
Acceder a los valores de píxeles y modificarlos
Acceder a las propiedades de imagen
Fijar la Región de Imagen (ROI, siglas en inglés de Region of Image)
Dividir y Combinar imágenes
Operaciones Básicas en Imágenes en OpenCV con Python
Casi todas las operaciones en esta sección están principalmente relacionadas con Numpy más que a OpenCV. Conocer bien Numpy es un requerimiento para escribir un código mejor optimizado con OpenCV. Si no conoces Numpy te recomendamos esta introducción a Numpy.
(Mostraremos los ejemplos en la terminal Python dado que la mayor parte de ellos corresponden a líneas únicas de código)
Accediendo y Modificando los valores de píxeles
Primero carguemos una imagen a color:
import cv2 import numpy as np img = cv2.imread('trump.jpg')
Puedes acceder al valor de un pixel por medio de las coordenadas de su fila y su columna. Para imágenes RGB, regresan una gama de valores entre Azul, Verde y Rojo. Para las imágenes en escala de grises, sólo la intensidad correspondiente es regresada.
px = img[100,100] print px # accessing only blue pixel blue = img[100,100,0] print blue
Puedes modificar los valores de pixel de la misma forma.
img[100,100] = [255,255,255] print  img[100,100]
aaaa
aaaa
Un mejor método para acceder al pixel y editarlo:
# accessing RED value img.item(10,10,2) # modifying RED value img.itemset((10,10,2),100) img.item(10,10,2)
Accediendo a las Propiedades de Imagen
Las propiedades de imagen incluyen número de filas, columnas y canales, tipo de data de imagen, número de píxeles, etc.
Se accede a la forma de la imagen por medio de img.shape. Este regresa una tupla de números de filas, columnas y canales (si la imagen es a color):
print img.shape
aaaa
Se accede al número total de píxeles por medio de img.size:
print img.size
El tipo de datos (datatype) de la imagen se obtiene por medio de img.dtype:
print img.dtype
aaaa
Dividiendo y Combinando Canales de Imagen
Los canales R,G,B de una imagen pueden dividirse en sus planos individuales cuando sea necesario. Luego, puede combinarse nuevamente dichos canales para nuevamente formar una imagen:
b,g,r = cv2.split(img) img = cv2.merge((b,g,r))
O
b = img[:,:,0]
Supongamos que quieres hacer que todos los píxeles rojos valgan cero, no necesitas dividirlos todos de esta forma y colocarlos igual a cero. Puedes simplemente usar indexación Numpy la cual es más rápida.
img[:,:,2] = 0
aaaa
Haciendo Bordes para la Imagen (Padding)
Si deseas crear un borde alrededor de una imagen, algo como un marco, puedes usar la función cv2.copyMakeBorder(). Pero tiene más aplicaciones para la operación de circonvolución, zero padding, etc. Esta función toma los siguientes argumentos:
- src – introducir imagen
- top, bottom, left, right – ancho de borde en número de píxeles en correspondencia con las direcciones.
- borderType – Marca que define el tipo de borde a añadir. Puede ser de los siguientes tipos:
- BORDER_CONSTANT – Añade un borde de color constante. El valor debería ser provisto como el siguiente argumento.
- BORDER_REFLECT – El border será el reflejo de sus elementos, como este: fedcba|abcdefgh|hgfedcb
- BORDER_REFLECT_101 or cv2.BORDER_DEFAULT – Igual que arriba, pero con un pequeño cambio, como este: gfedcb|abcdefgh|gfedcba
- BORDER_REPLICATE – El último elemento es replicado alrededor, así: aaaaaa|abcdefgh|hhhhhhh
- BORDER_WRAP – No puedo explicarlo, luciría así: cdefgh|abcdefgh|abcdefg
- valor – El color del borde si el tipo de borde es cv2.BORDER_CONSTANT
Más abajo hay una muestra del código demostrando todos estos tipos de borde para su mejor entendimiento:
import cv2 import numpy as np from matplotlib import pyplot as plt BLUE = [255,0,0] img1 = cv2.imread('opencv_logo.png') replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE) reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT) reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101) wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP) constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE) plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL') plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE') plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT') plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101') plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP') plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT') plt.show()
Fíjate en el resultado debajo. (La imagen se expone usando matplotlib. Así que los planos del ROJO y el AZUL están intercambiados):
Cada vez aumentamos más nuestros conocimientos en el manejo de imágenes.
En nuestro curso Python de OpenCV se estudian operaciones más avanzadas con imágenes:
Curso de Procesamiento de Imágenes y Visión Artificial
[…] ➡ Operaciones Básicas en Imágenes […]
como puedo desarrollar un programa que divida una imagen en 16 partes. (4×4). El usuario puede escoger en los primeros 4 cuadros que color desea, entre: rojo, azul, verde, normal o gris