Substitua a cor do pixel da imagem com base na condição do canal em Python

Sep 12 2020

Eu tenho uma imagem RGB, como posso alterar a cor do pixel para branco ou preto com base na comparação dos valores dos canais vermelho e azul do mesmo pixel?

if r_pixel > g_pixel:
    # make pixel white
else:
    # Make pixel black

Aqui está o que tentei:

img = cv2.imread("car.jpg")
b,g,r = cv2.split(img)
new = np.subtract(r , g)

A saída é uma imagem estritamente branca e preta (0 ou 255).

Respostas

2 MarkSetchell Sep 11 2020 at 23:20

Eu usaria np.where()para escolher 255ou 0em cada pixel, dependendo da condição:

import cv2
import numpy as np

# Load image
img = cv2.imread('colorwheel.jpg')

# Wherever R>G, make result white, and black elsewhere
res = np.where(img[...,2]>img[...,1], 255, 0).astype(np.uint8)

# ALTERNATIVE SOLUTION FOLLOWS

# Or you could generate a Boolean (True/False) array and multiply by 255 to get the same result
res = ((img[...,2]>img[...,1]) * 255 ).astype(np.uint8)

Entrada

Resultado

1 GilPinsky Sep 11 2020 at 23:03

Você pode dividir os canais necessários primeiro, conforme mostrado abaixo, em seguida, comparar os dois canais e converter o resultado de booleano em uint8 e, em seguida, comprimir o canal singleton e multiplicar por 255:

r = img[:,:,2:]
g = img[:,:,1:2]
new = 255*np.squeeze(r>g,axis=2).astype('uint8')