Как заменить все пиксели определенного значения RGB другим значением RGB в opencv - PullRequest
1 голос
/ 01 февраля 2020

Мне нужно иметь возможность заменить все пиксели с определенным значением RGB другим цветом в opencv. Каков наилучший способ сделать это?

Редактировать: я пробовал некоторые решения на http://www.answers.opencv.org/question/97416/replace-a-range-of-colors-with-a-specific-color-in-python, но ни одно из них не помогло мне

1 Ответ

1 голос
/ 01 февраля 2020

TLDR; Сделайте все зеленые пиксели белыми с помощью Numpy:

import numpy as np

pixels[np.all(pixels == (0, 255, 0), axis=-1)] = (255,255,255)

Здесь я привел несколько примеров других способов изменения цвета. Сначала я опишу точные значения c RGB, которые вы задали в своем вопросе, используя это изображение. Он имеет три больших блока ровно красного, ровно зеленого и ровно синего цвета слева и три постепенных перехода между этими цветами справа:

enter image description here

Вот первоначальный ответ, как указано выше, снова:

#!/usr/bin/env python3

import cv2
import numpy as np

# Load image
im = cv2.imread('image.png')

# Make all perfectly green pixels white
im[np.all(im == (0, 255, 0), axis=-1)] = (255,255,255)

# Save result
cv2.imwrite('result1.png',im)

enter image description here


На этот раз я определяю названия цветов для дополнительной удобочитаемости и удобства обслуживания. Последняя строка - важный момент:

# Define some colours for readability - these are in OpenCV **BGR** order - reverse them for PIL
red   = [0,0,255]
green = [0,255,0]
blue  = [255,0,0]
white = [255,255,255]
black = [0,0,0]

# Make all perfectly green pixels white
im[np.all(im == green, axis=-1)] = white

Тот же результат.


На этот раз я делаю маску красных пикселей многократного использования, которую я могу использовать в последующих операциях. Последняя строка с назначением im[Rmask] = black теперь особенно легко читается:

# Define some colours for readability - these are in OpenCV **BGR** order - reverse them for PIL
red   = [0,0,255]
green = [0,255,0]
blue  = [255,0,0]
white = [255,255,255]
black = [0,0,0]

# Make mask of all perfectly red pixels
Rmask = np.all(im == red, axis=-1)

# Make all red pixels black
im[Rmask] = black

enter image description here


На этот раз я объединить маска красного и синего пикселей, чтобы вы могли видеть силу масок. Последняя строка - важный момент:

# Define some colours for readability - these are in OpenCV **BGR** order - reverse them for PIL
red   = [0,0,255]
green = [0,255,0]
blue  = [255,0,0]
white = [255,255,255]
black = [0,0,0]

# Make mask of all perfectly red pixels and all perfectly blue pixels
Rmask = np.all(im == red,  axis=-1)
Bmask = np.all(im == blue, axis=-1)

# Make all red or blue pixels black
im[Rmask | Bmask] = black

enter image description here


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

# Define some colours for readability - these are in OpenCV **BGR** order - reverse them for PIL
red   = [0,0,255]
green = [0,255,0]
blue  = [255,0,0]
white = [255,255,255]
black = [0,0,0]

# Make mask of all perfectly red pixels
Rmask = np.all(im == red,  axis=-1)

# Make all non-red pixels black
im[~Rmask] = black

enter image description here


До сих пор мы делали только несколько выделенных пикселей в одном новый цвет. Что если мы хотим сделать несколько пикселей одного цвета, а все остальные пиксели - другим цветом за один проход? Последняя строка - важный момент:

# Define some colours for readability - these are in OpenCV **BGR** order - reverse them for PIL
red   = [0,0,255]
green = [0,255,0]
blue  = [255,0,0]
white = [255,255,255]
black = [0,0,0]

# Make mask of all perfectly red pixels
Rmask = np.all(im == red,  axis=-1)

# Make all red pixels white AND at same time everything else black
im = np.where(np.all(im == red, axis=-1, keepdims=True), white, black)

enter image description here


Если вы хотите повлиять на весь диапазон из цвета, а не заданное c значение RGB, выглядят здесь и здесь .

Ключевые слова : обработка изображений, Python, премьер, изменить цвет, изменить цвет, премьер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...