Dividir y fusionar canales con OpenCV Python
Una imagen en color digital estándar está representada por píxeles y cada píxel es una combinación de colores primarios. Y un canal es una imagen en escala de grises que se compone solo de uno de los colores primarios de una imagen en color. Por ejemplo, una imagen RGB tiene tres canales: rojo, verde y azul.
Observe las siguientes imágenes en color para ver cómo se ve cada canal por separado:
Debajo de las imágenes en escala de grises se encuentra la representación de cada canal de la imagen RGB.
En este artículo, discutiremos cómo dividir y fusionar canales de una imagen usando la biblioteca Python openCV.
Dividir canales
El módulo Python OpenCV proporciona una función cv2.split() para dividir una matriz multicanal/coloreada en matrices separadas de un solo canal. Devolverá una matriz con los tres canales, cada uno de los cuales corresponde a los canales azul, verde y rojo representados como una matriz estándar con dos dimensiones.
Sintaxis
cv2.split(m[, mv])
Dónde,
src: entrada de matriz multicanal.
mv – matriz de salida o vector de matrices
Ejemplo
En este ejemplo, tomaremos una imagen en color "OpenCV_logo.png" para dividirla en 3 canales.
import cv2
image = cv2.imread('Images/OpenCV_logo.png')
#split the image into its three channels
(b_channel, g_channel, r_channel) = cv2.split(image)
#display the images
cv2.imshow('blue channel',b_channel)
cv2.imshow('green channel',g_channel)
cv2.imshow('red channel',r_channel)
cv2.waitKey(0)
cv2.destroyAllWindows()
Imagen de entrada
Imágenes de salida
La imagen en color "OpenCV_logo.png" se ha dividido en tres imágenes en escala de grises: r_channel ("canal rojo"), g_channel (verde), b_channel (azul).
Fusionar canales
La función cv2.merge() toma matrices de un solo canal y las combina para crear una matriz/imagen multicanal. Devuelve un array de la concatenación de los elementos de los arrays de entrada. La siguiente es la sintaxis de la función merge():
cv2.merge(mv[, dst])
Parámetros
-
mv: vector de entrada de las matrices a fusionar. todas las matrices deben tener el mismo tamaño y la misma profundidad.
recuento: debe ser mayor que cero. Especifica el número de matrices de entrada cuando el vector de entrada es una matriz C simple.
dst: matriz de salida con el mismo tamaño y profundidad que la matriz de entrada.
Ejemplo
Fusionemos los canales azul, verde y rojo separados en una imagen BGR.
import cv2
image = cv2.imread('Images/OpenCV_logo.png')
#split the image into its three channels
(b_channel, g_channel, r_channel) = cv2.split(image)
#display the images
cv2.imshow('blue channel',b_channel)
cv2.imshow('green channel',g_channel)
cv2.imshow('red channel',r_channel)
# merge the image
image_merged = cv2.merge((b_channel,g_channel,r_channel))
cv2.imshow('merged image',image_merged)
cv2.waitKey(0)
cv2.destroyAllWindows()
Imagen de entrada
Imagen de salida
Ejemplo
En este ejemplo, convertiremos una imagen a CMYK y luego dividiremos los canales.
import cv2
import numpy as np
rgb = cv2.imread('Images/Tajmahal.jpg')
rgbdash = rgb.astype(np.float)/255.
K = 1 -np.max(rgbdash, axis=2)
C = (1-rgbdash [...,2] - K)/(1-K)
M = (1-rgbdash [...,1] - K)/(1-K)
Y = (1-rgbdash [...,0] - K)/(1-K)
# Convert the input BGR image to CMYK colorspace
CMYK = (np.dstack((C,M,Y,K)) * 255).astype(np.uint8)
# Split CMYK channels
Y, M, C, K = cv2.split(CMYK)
# display the images
cv2.imshow("Cyan",C)
cv2.imshow("Magenta", M)
cv2.imshow("Yellow", Y)
cv2.imshow("Key", K)
if cv2.waitKey(0):
cv2.destroyAllWindows()
Imagen de entrada
Imagen de salida cian
Imagen de salida Magenta
Imagen de salida amarilla
Clave de imagen de salida
En el ejemplo anterior, la imagen RGB se convirtió a CMYK y se dividió en cuatro canales: cian, magenta, amarillo y clave.