Convertir todos los píxeles blancos de la imagen en píxeles negros

Tengo esta imagen rand-walk-2.png

rand-walk-2.png

Me gustaría convertir todos los píxeles blancos a píxeles negros, de modo que haya una imagen de un paseo aleatorio rojo sobre un fondo negro, esto significa que no puedo invertir los colores de la imagen. Mi código actual simplemente encuentra los píxeles blancos y los pone en negro:

 from PIL import Image import PIL.ImageOps import numpy as np from skimage.io import imsave import cv2 in_path = 'rand-walk-2.png' out_path = 'rand-walk-trial.png' Image = cv2.imread(in_path) Image2 = np.array(Image, copy=True) white_px = np.asarray([255, 255, 255]) black_px = np.asarray([0 , 0 , 0 ]) (row, col, _) = Image.shape for r in xrange(row): for c in xrange(col): px = Image[r][c] if all(px == white_px): Image2[r][c] = black_px imsave(out_path, Image2) 

Pero produce esto:

rand-walk-trial.png

Por alguna razón no puedo explicarlo.

La razón es que el módulo skimage (en su caso, la función skimage.io.imsave ) utiliza la secuencia de colores RGB, mientras que OpenCV (en su caso, la función cv2.imread ) usa notoriamente la secuencia de colores BGR. Así que los colores azul y rojo se intercambian con tu script.

Dos soluciones para usted serían convertir la imagen a RGB directamente después de leer:

 Image = cv2.imread(in_path) Image = cv2.cvtColor(Image, cv2.COLOR_BGR2RGB) 

O para guardar la imagen de salida con cv2:

 cv2.imwrite(out_path, Image2) 

Resultado:

Paseo aleatorio rojo sobre fondo negro


Otra solución, que ofrece un resultado mucho más agradable, es simplemente invertir tu imagen:

 Image = cv2.imread(in_path) Image = cv2.bitwise_not(Image) cv2.imwrite(out_path, Image) 

Resultado:

Hermoso paseo aleatorio cian sobre fondo negro

O, si aún desea color rojo, puede invertir, eliminar el canal verde e intercambiar azul y rojo:

 Image = cv2.imread(in_path) Image = cv2.bitwise_not(Image) b,g,r = cv2.split(Image) z = np.zeros_like(g) Image = cv2.merge((z,z,b)) cv2.imwrite(out_path, Image) 

Resultado:

Hermoso paseo aleatorio rojo sobre fondo negro