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

Entrenar OpenCV en Detección de Objetos

Acceso a la webcam con OpenCV

JavaFx 8 Administrar ventanas

Analizador Léxico