Как можно раскрасить изображение RGB синим цветом? - PullRequest
0 голосов
/ 23 мая 2018

У меня есть следующее изображение, которое я хотел бы закрасить синим цветом.

Ввод изображения:
inputs

Ожидаемый результат:
Expected_output

Существует ли какой-либо инструмент для создания лыж или opencv, который позволяет выполнять такие операции?

Спасибо

Ответы [ 5 ]

0 голосов
/ 28 мая 2018

Чистый numpy раствор

import numpy as np
import skimage.io

def blend(a, b, alpha):
    return (alpha * a + (1 - alpha) * b).astype(np.uint8)

def luma(img):
    rgb_to_luma = np.array([0.2126, 0.7152, 0.0722]) # BT.709
    return np.repeat((img * rgb_to_luma).sum(axis=-1).astype(np.uint8), 3).reshape(img.shape)

BGCOLOR = np.array([1, 174, 242])

img = skimage.io.imread('city.jpg')
bg = np.ones_like(img) * BGCOLOR

skimage.io.imsave('blue.png', blend(luma(img), bg, 0.2))

enter image description here

0 голосов
/ 23 мая 2018

Чтобы точно ответить на ваш вопрос, вы можете просто установить другие каналы на 0. Возможно, вы захотите установить их немного выше этого значения или все закончится немного темнее, но здесь вы идете:

img = cv2.imread(your_image)
img[:, :, 1] = 0  # (or 20)
img[:, :, 2] = 0

cv2.namedWindow("test")

while True:
    cv2.imshow("test", a)
    ch = cv2.waitKey & 0xFF
    if ch == ord('q'):
    break

cv2.destroyAllWindows()

Вот пример:

Original Image Blue Cage

0 голосов
/ 23 мая 2018

Типичное растровое изображение - это двумерная сетка пикселей, где каждый пиксель представляет собой группу из трех целых чисел в диапазоне от 0 до 255, представляющих красный, зеленый и синий.Если вы хотите просмотреть только синий канал изображения, вы можете создать новое изображение из пикселей исходного изображения и установить для красного и зеленого пикселей значения 0 для каждого пикселя, оставив только синий.

0 голосов
/ 23 мая 2018

Вы можете получить желаемый эффект, применяя прозрачное наложение.Я примерно разобрался с цветом (небесно-голубой) методом проб и ошибок.Его можно изменить на любой цвет.

В OpenCV вы можете использовать cv2..addWeighted() для этой цели

Код:

import numpy as np
import cv2

image = 'C:/Users/Desktop/city.jpg'
im = cv2.imread(path, 1)

blue = np.zeros_like(im)
blue[:] = (255, 200, 0)     #<--- Change here
cv2.imshow('blue.jpg', blue)

enter image description here

val = 0.75
fin = cv2.addWeighted(blue, val, im, 1 - val, 0)
cv2.imshow('Transparent_image', fin)

enter image description here

Как уже упоминалось @vasia, установка красного и зеленого пикселей на 0 не дает желаемого эффекта.Вот что я получаю в результате:

enter image description here

ОБНОВЛЕНИЕ

@ Комментарий MarkSetchell заставил меня задуматься иэто результат этого:

enter image description here

Так что я сделал?

Я объединил три канала:

  1. Массив значений 255 в синем канале
  2. Оттенки серого исходного изображения в зеленом канале
  3. Массив значений 0 в красном канале

Спасибо Марк !!

0 голосов
/ 23 мая 2018

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

здесь - учебное пособие по OpenCVо том, как это сделать.

Вы можете увидеть, как это может повлиять на ваши изображения более подробно в этом сообщении в блоге

...