J'ai l'image suivante que j'aimerais coloriser en bleu.

Entrée d'image:
inputs

Sortie attendue:
Expected_output

Existe-t-il un outil skimage ou opencv permettant de faire ce genre d'opération?

Je vous remercie

1
eric lardon 23 mai 2018 à 18:02

5 réponses

Meilleure réponse

Vous pouvez obtenir l'effet souhaité en appliquant une superposition transparente. J'ai approximativement déterminé la couleur (bleu ciel) par essais et erreurs. Il peut être changé en n'importe quelle couleur possible.

Dans OpenCV, vous pouvez utiliser le cv2..addWeighted() à cet effet

Code:

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

Comme mentionné par @vasia, définir les pixels rouge et vert sur 0 ne produit pas l'effet souhaité. C'est ce que j'obtiens en conséquence:

enter image description here

MISE À JOUR

Le commentaire de MarkSetchell m'a fait réfléchir et c'est le résultat de cela:

enter image description here

Alors qu'est-ce que j'ai fait?

J'ai fusionné trois canaux:

  1. Un tableau de valeurs 255 dans le canal bleu
  2. Niveaux de gris de l'image d'origine dans le canal vert
  3. Un tableau de valeurs 0 dans le canal rouge

Merci Mark !!

4
Jeru Luke 23 mai 2018 à 17:11

Pour répondre exactement à votre question, vous pouvez simplement mettre les autres canaux à 0. Vous voudrez peut-être les régler un peu plus haut que cela ou les choses deviennent un peu sombres, mais c'est parti:

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()

Voici un exemple:

Original Image Blue Cage

1
Tim Bradley 23 mai 2018 à 16:28

Solution numpy pure

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
filippo 28 mai 2018 à 06:01

Vous pouvez le faire en mélangeant deux images ensemble, en créer une qui est juste votre image bleue et en la mélangeant avec l'alpha de votre choix:

ici est le didacticiel OpenCV sur la façon de le faire .

Vous pouvez voir comment cela peut affecter vos images plus en détail sur ce billet de blog

0
GPPK 23 mai 2018 à 15:05

Une image bitmap typique est une grille de pixels bidimensionnelle, où chaque pixel est un groupe de trois entiers allant de 0 à 255, représentant le rouge, le vert et le bleu. Si vous souhaitez afficher uniquement le canal bleu d'une image, vous pouvez créer une nouvelle image à partir des pixels de votre image d'origine et définir les valeurs des pixels rouge et vert sur 0 pour chaque pixel, en ne laissant que du bleu.

0
vasia 23 mai 2018 à 15:06