2012-02-08 25 views
10

Soy un principiante en el procesamiento de imágenes, y supongo que es bastante fácil de hacer, pero no conozco la terminología.Aplicación de una superposición de color a una imagen en PIL o Imagemagik

Básicamente tengo una imagen en blanco y negro, simplemente quiero aplicar una superposición de color a la imagen, de modo que tengo la imagen superpuesta con azul verde y amarilla como las imágenes que se muestran a continuación (que realmente puedo ' Mostrar porque no tengo suficiente reputación para hacerlo - grrrrrr). Imagina que tengo una imagen física y una superposición verde/roja/azul/amarilla, que coloco en la parte superior de la imagen.

Idealmente, me gustaría hacer esto usando Python PIL, pero estaría encantado de hacerlo utilizando ImageMagik, pero de cualquier manera tengo que poder guiar el proceso ya que tengo unas 100 imágenes que necesito para llevar a cabo el proceso en.

Respuesta

18

Aquí hay un fragmento de código que muestra cómo usar scikit-image para superponer colores en una imagen de nivel de grises. La idea es convertir ambas imágenes al espacio de color HSV, y luego reemplazar los valores de tono y saturación de la imagen de nivel de gris con los de la máscara de color.

from skimage import data, color, io, img_as_float 
import numpy as np 
import matplotlib.pyplot as plt 

alpha = 0.6 

img = img_as_float(data.camera()) 
rows, cols = img.shape 

# Construct a colour image to superimpose 
color_mask = np.zeros((rows, cols, 3)) 
color_mask[30:140, 30:140] = [1, 0, 0] # Red block 
color_mask[170:270, 40:120] = [0, 1, 0] # Green block 
color_mask[200:350, 200:350] = [0, 0, 1] # Blue block 

# Construct RGB version of grey-level image 
img_color = np.dstack((img, img, img)) 

# Convert the input image and color mask to Hue Saturation Value (HSV) 
# colorspace 
img_hsv = color.rgb2hsv(img_color) 
color_mask_hsv = color.rgb2hsv(color_mask) 

# Replace the hue and saturation of the original image 
# with that of the color mask 
img_hsv[..., 0] = color_mask_hsv[..., 0] 
img_hsv[..., 1] = color_mask_hsv[..., 1] * alpha 

img_masked = color.hsv2rgb(img_hsv) 

# Display the output 
f, (ax0, ax1, ax2) = plt.subplots(1, 3, 
            subplot_kw={'xticks': [], 'yticks': []}) 
ax0.imshow(img, cmap=plt.cm.gray) 
ax1.imshow(color_mask) 
ax2.imshow(img_masked) 
plt.show() 

Aquí está la salida:

enter image description here

+0

Gracias Stefan, que era muy útil. – Ctrlspc

+1

Gracias Stefan, uso este silencio a menudo. ¿Cómo podría extenderse más allá de 3 colores siguiendo un esquema de colores, es decir, plt.cm.cmap? Tengo 7 mapas binarios, necesito superponer en una imagen en escala de grises. – iratzhash

+0

plt.cm.viridis (o cualquiera de los colores) devolverá valores RGB para cualquier llamada, p. "En [10]: plt.cm.viridis (15) Fuera [10]: (0.28192400000000001, 0.089665999999999996, 0.41241499999999998, 1.0)". También puede operar en arreglos completos, p. "plt.cm.viridis (my_image)" para obtener los valores RGB apropiados. –

8

acabé encontrando una respuesta a esta usando PIL, creando básicamente una nueva imagen con un color bloque, y luego componer la imagen original, con este nueva imagen, usando una máscara que define una capa alfa transparente. Código de abajo (adaptado para convertir cada imagen en una carpeta llamada de datos, la salida en una carpeta llamada de salida):

from PIL import Image 
import os 

dataFiles = os.listdir('data/') 

for filename in dataFiles: 

    #strip off the file extension 
    name = os.path.splitext(filename)[0] 

    bw = Image.open('data/%s' %(filename,)) 

    #create the coloured overlays 
    red = Image.new('RGB',bw.size,(255,0,0)) 
    green = Image.new('RGB',bw.size,(0,255,0)) 
    blue = Image.new('RGB',bw.size,(0,0,255)) 
    yellow = Image.new('RGB',bw.size,(255,255,0)) 

    #create a mask using RGBA to define an alpha channel to make the overlay transparent 
    mask = Image.new('RGBA',bw.size,(0,0,0,123)) 

    Image.composite(bw,red,mask).convert('RGB').save('output/%sr.bmp' % (name,)) 
    Image.composite(bw,green,mask).convert('RGB').save('output/%sg.bmp' % (name,)) 
    Image.composite(bw,blue,mask).convert('RGB').save('output/%sb.bmp' % (name,)) 
    Image.composite(bw,yellow,mask).convert('RGB').save('output/%sy.bmp' % (name,)) 

No puede enviar las imágenes de salida por desgracia, debido a la falta de repetición.

+2

Gracias y aquí hay algunos representantes para ti – LoveGandhi

1

Ver mi GIST función básica https://gist.github.com/Puriney/8f89b43d96ddcaf0f560150d2ff8297e

través opencv se describe a continuación.

def mask_color_img(img, mask, color=[0, 255, 255], alpha=0.3): 
    ''' 
    img: cv2 image 
    mask: bool or np.where 
    color: BGR triplet [_, _, _]. Default: [0, 255, 255] is yellow. 
    alpha: float [0, 1]. 

    Ref: http://www.pyimagesearch.com/2016/03/07/transparent-overlays-with-opencv/ 
    ''' 
    out = img.copy() 
    img_layer = img.copy() 
    img_layer[mask] = color 
    out = cv2.addWeighted(img_layer, alpha, out, 1 - alpha, 0, out) 
    return(out) 

Añadir superposición de color y transparente sobre la imagen RGB o gris puede trabajar: highlight-on-color highlight-on-gray

Cuestiones relacionadas