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

  1. y para copiar una región circular?
    cv2.circle se utilizaría con este código?

    ResponderEliminar
    Respuestas
    1. 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.

      Eliminar
  2. sabes como ocultar los valores de una matriz en la imagen?

    ResponderEliminar
  3. Hola! 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.

    ResponderEliminar
    Respuestas
    1. Claro que es posible debes usar:

      image.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

      Eliminar
  4. buenos dias necesito por favor, si podria ayudarme con un codigo necesito hacer que la misma imagen quede por cuadrantes
    con rojo verde y gris como poria hacer gracias

    ResponderEliminar
  5. Buen día. Cómo puedo observar la intensidad de un pixel si la imagen se encuentra en escala de grises?

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

tkinter Grid

Histogramas OpenCV Python

tkinter Canvas

Python Binance API

Spring MVC Thymeleaf formularios