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:

opencv python roi

Hasta aquí llega este tutorial, nos vemos en la próxima.

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Procesamiento de imágenes en OpenCV

Acceso a la webcam con OpenCV

Entrenar OpenCV en Detección de Objetos

Gauss Seidel y Jacobi