Преобразование всех белых пикселей изображения в черные пиксели

У меня есть это изображение rand-walk-2.png

rand-walk-2.png

Я хотел бы преобразовать все белые пиксели в черные, чтобы на черном фоне было изображение красного случайного блуждания, это означает, что я не могу просто инвертировать цвета изображения. Мой текущий код просто находит белые пиксели и устанавливает их черными:

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)

Но он производит следующее:

rand-walk-trial.png

почему-то не могу объяснить.


person xiaolingxiao    schedule 17.04.2018    source источник


Ответы (1)


Причина в том, что модуль skimage ( в вашем случае функция skimage.io.imsave) использует цветовую последовательность RGB, тогда как OpenCV (в вашем случае функция cv2.imread) как известно использует цветовую последовательность BGR. Таким образом, синий и красный цвета меняются местами в вашем сценарии.

Для вас есть два решения: либо преобразовать изображение в RGB сразу после прочтения:

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

Или для сохранения выходного изображения с помощью cv2:

cv2.imwrite(out_path, Image2)

Результат:

Красная случайная прогулка на черном фоне


Другое решение, которое дает гораздо более приятный результат, - это просто инвертировать ваше изображение:

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

Результат:

Красивое голубое случайное блуждание на черном фоне

Или, если вам все еще нужен красный цвет, вы можете инвертировать, удалить зеленый канал и поменять местами синий и красный:

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)

Результат:

Красивая красная случайная прогулка на черном фоне

person Andriy Makukha    schedule 18.04.2018
comment
Я предполагаю, что части, которые все еще выглядят белыми, - это просто очень светло-красные цвета, которые кажутся белыми на фоне? - person xiaolingxiao; 18.04.2018
comment
Верно. Возможно, вам будет лучше просто перевернуть изображение. См., Например, выше. - person Andriy Makukha; 18.04.2018
comment
украсить. именно то, что я хотел. - person xiaolingxiao; 18.04.2018