Manipular pixeles OpenCV Python
En este tutorial veremos como aplicar las operaciones básicas sobre imágenes cargadas en memoria mediante OpenCV, veremos cómo acceder a los pixeles de una imagen y modificarlos, aprenderemos a seleccionar una región de interés (ROI) y mostraremos como trabajar con los distintos canales de una imagen.
Para utilizar correctamente OpenCV desde Python se requiere tener un buen conocimiento de Numpy.
Obtener y modificar un pixel
Luego de cargar una imagen podemos acceder a cado uno de los pixeles de la misma, para una imagen a color obtendremos los canales: azul, verde y rojo, si la imagen es a escala de grises solo tendremos un canal, el cual indica la intensidad de gris de dicho pixel.
import cv2
image = cv2.imread('lena.jpg')
# obtener el valor BGR del pixel en la posicion (10, 50)
b, g, r = image[10, 50]
print('pixel:', b, g, r)
De manera similar podemos modificar el valor de un pixel:
image[100,100] = [255,255,255]
Un modo más eficiente de acceder a un pixel es usando las funciones Numpy: array.item()
y array.itemset()
.
import cv2
image = cv2.imread('lena.jpg')
x = 240
y = 178
b = image.item(y, x, 0)
g = image.item(y, x, 1)
r = image.item(y, x, 2)
print('pixel:', b, g, r)
Para modificar un pixel usaremos:
image.itemset((y, x, 0), 255)
image.itemset((y, x, 1), 255)
image.itemset((y, x, 2), 255)
Con esto modificamos las componente BGR del pixel ubicado en la posición (x, y).
Propiedades de una imagen
Podemos acceder a las distintas propiedades de una imagen, por ejemplo:
Obtener el numero de filas, columnas y canales que componen una imagen, si la imagen es ha escala de grises la tupla devuelta solo contiene los dos primeros valores.
>>> image.shape
(512, 512, 3)
Para obtener el numero total de pixel que componen la imagen.
>>> image.size
786432
Cuando deseemos obtener el tipo de datos usado para almacenar los pixeles.
>>> image.dtype
dtype('uint8')
Copiar una región
En ocasiones deseamos trabajar con una porción de la imagen original, en esos casos podemos usar el indexing de Numpy para seleccionar y copiar la región rectangular deseada, ejemplo:
import cv2
image = cv2.imread('lena.jpg')
roi = image[240:375, 215:365]
cv2.imshow('roi', roi)
cv2.imshow('original', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Para indicar la región que seleccionaremos indicamos primero el valor de las coordenadas y0 y y1 luego x0 y x1 de este modo: img[y0:y1, x0:x1]
roi = image[240:375, 215:365]
Este código genera el siguiente resultado:
Hasta aquí llega este tutorial, nos vemos en la próxima.
Gracias!
ResponderEliminary para copiar una región circular?
ResponderEliminarcv2.circle se utilizaría con este código?
Para copiar una región que no sea rectangular debes crear una mascara, puedes usar cv2.circle() para crear la mascara y luego usar la misma para copiar el área deseada.
Eliminarsabes como ocultar los valores de una matriz en la imagen?
ResponderEliminarsi
EliminarHola! Me gustaria saber si yo puedo agregar una columna o varis columnas de pixeles de color blanco a una imagen que ya tengo. Necesito hacer que varias imagenes de diferentes tama;os sean del mismo tama;o. Pero no agrandar sus dimensiones sino modificarlas de raiz, agregando pixeles.
ResponderEliminarClaro que es posible debes usar:
Eliminarimage.itemset((y, x, 0), 255)
image.itemset((y, x, 1), 255)
image.itemset((y, x, 2), 255)
para modificar el color en la posicion (x, y) 255 indica la intensidad color para el canal B = 0, debes hacer lo mismo para modificar los canales G y R, 1 y 2 respectivamente
buenos dias necesito por favor, si podria ayudarme con un codigo necesito hacer que la misma imagen quede por cuadrantes
ResponderEliminarcon rojo verde y gris como poria hacer gracias
Buen día. Cómo puedo observar la intensidad de un pixel si la imagen se encuentra en escala de grises?
ResponderEliminar