Divisão do espaço de cores RGB - usando divisão e matrizes do OpenCV

Divisão do espaço de cores RGB - usando divisão e matrizes do OpenCV

Gerar gráficos RGB

Em princípio, a matriz de imagem colorida RGB é armazenada na forma de pixels. O exemplo a seguir desenhará três círculos nas três cores primárias de vermelho, verde e azul. Deve-se prestar atenção especial que o formato da imagem de exibição do pyplot é RGB(A), então a conversão do espaço de cores é necessária cv2.cvtColor(image,cv2.COLOR_RGB2BGRA)

Código de referência

from matplotlib import pyplot as plt
import cv2
import numpy as np
# 生成一个 640*480 的 BGR 三个通道的彩色图片,底色全为0
canvas = np.zeros((480, 640, 3), dtype='uint8')
image_path='../data/diy.jpg'
# 圆半径为 90 pixel
radius = 90
# 配色为 BGR
blue = (255, 0, 0)
green = (0, 255, 0)
red = (0, 0, 255)
# 圆边厚度为 10 pixel
thickness = 10
# 画出 红绿蓝三个图片
image = cv2.circle(canvas, (320, 200), radius, red, thickness)
image = cv2.circle(canvas, (220, 300), radius, green, thickness)
image = cv2.circle(canvas, (420, 300), radius, blue, thickness)
# 因为 pyplot 显示图片的格式为 RGB(A) 所以要进行颜色空间转换
toGBR = cv2.cvtColor(image,cv2.COLOR_RGB2BGRA)
# the image in the BGR 8-bit format
cv2.imwrite(image_path,canvas)
plt.figure(figsize=(8,12))
plt.subplot(211), plt.title('BGR format')
plt.imshow(image) # image 为 BGR 8-bit 格式,而 plt 以 RGB 方式显示,所以颜色会不对
plt.subplot(212), plt.title('RGB(A) format')
plt.imshow(toGBR) # toGBR 为 RGB(A) 格式,这才是正确的配色
plt.show()

insira a descrição da imagem aqui
Figura 1. Mostrando a diferença entre os formatos BGR e RGB(A), a correspondência de cores dos gráficos no lado direito está correta

Canais RGB divididos para exibição em escala de cinza

Divida a imagem colorida de acordo com o canal BGR. O exemplo a seguir exibe uma imagem separada para cada canal da imagem diy.jpg gerada acima. Pela ordem de exibição, pode-se descobrir que os canais são vermelho (0), verde ( 1), azul (2).

Código de referência

from matplotlib import pyplot as plt
import cv2
#IMREAD_COLOR 会将图片以 BGR 8-bit 格式读入
img1 = cv2.imread('../data/diy.jpg',cv2.IMREAD_COLOR)
# 将图片依 BGR 分割成三个通道
channels = cv2.split(img1)
# color in BGR
titles=['Blue', 'Green', 'Red']
figure, plots = plt.subplots(ncols=3, nrows=1,figsize=(12,6))
for i, subplot in zip(range(3), plots):
    subplot.imshow(channels[i],'gray')
    subplot.set_axis_off()
    subplot.set_title(titles[i])
plt.show()

insira a descrição da imagem aqui
Figura 2. Dividir o espaço de cores BGR

Canais RGB divididos para exibir em cores

As etapas de processamento são:

  1. Carregue uma imagem colorida e leia-a no formato BGR de 8 bits (opencv)
  2. Dividir canais de cores independentes (opencv)
  3. Criar uma imagem em branco (np)
  4. Dê a cor de um canal específico a uma imagem em branco
  5. Converter para o espaço de cores de plt (opencv)
  6. Exibir resultados usando plt (matplotlib)

Código de referência

from matplotlib import pyplot as plt
import numpy as np
import cv2
#加载彩色图像
img = cv2.imread('../data/diy.jpg',cv2.IMREAD_COLOR)
# 分割独立的颜色通道
channels = cv2.split(img)
# color in BGR
titles=['Blue', 'Green', 'Red']
figure, plots = plt.subplots(ncols=3, nrows=1,figsize=(12,6))
for i, subplot in zip(range(3), plots):
    # 创建空白图片
    temp = np.zeros(img.shape, dtype='uint8')
    # 将特定通道的颜色给予空白图片
    temp[:,:,i] = channels[i] # img[:,:,i]
    # 转换成 plt 的颜色空间
    toGBR = cv2.cvtColor(temp,cv2.COLOR_RGB2BGRA)
    subplot.imshow(toGBR)
    subplot.set_title(titles[i])
    subplot.set_axis_off()
plt.show()

insira a descrição da imagem aqui
Figura 3. Respectivos canais RGB exibidos em cores

Se for para uma imagem com fundo branco, esse método de exibição geralmente não consegue o efeito desejado, conforme mostrado no código abaixo, porque o fundo branco fará com que todo o display de canal único mostre a cor de fundo de um único canal , o que não é fácil de destacar o alvo. Além disso, o vermelho, o azul e o verde nos olhos humanos geralmente são o resultado da mistura; portanto, se você deseja descobrir as cores vermelho, azul e verde separadamente, geralmente usa o espaço de cores HSV.

from matplotlib import pyplot as plt
import numpy as np
import cv2
#加载彩色图像
img = cv2.imread('../data/b.png',cv2.IMREAD_COLOR)
channels = cv2.split(img)
# color in BGR
titles=['Blue', 'Green', 'Red']
figure, plots = plt.subplots(ncols=4, nrows=1,figsize=(12,4))
for i, subplot in zip(range(4), plots):
    if i < 3:
        temp = np.zeros(img.shape, dtype='uint8')
        temp[:,:,i] = channels[i] # img[:,:,i]
        toGBR = cv2.cvtColor(temp,cv2.COLOR_RGB2BGRA)
        subplot.imshow(toGBR)
        subplot.set_title(titles[i])
        subplot.set_axis_off()
    else:
        toGBR = cv2.cvtColor(img,cv2.COLOR_RGB2BGRA)
        subplot.imshow(toGBR)
        subplot.set_title('Origin')
        subplot.set_axis_off()
plt.show()

insira a descrição da imagem aqui
Figura 4. Respectivos canais RGB exibidos em cores

Referências

  • API OpenCV, https://docs.opencv.org/
  • Introdução às imagens, https://docs.opencv.org/4.x/db/deb/tutorial_display_image.html
  • matplotlib.pyplot.subplot, https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplot.html#matplotlib.pyplot.subplot
  • matplotlib.pyplot.imshow, https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html

Acho que você gosta

Origin blog.csdn.net/m0_50614038/article/details/129899226
Recomendado
Clasificación