Применение цветного наложения к изображению в PIL или Imagemagik

Я полный новичок в обработке изображений, и я предполагаю, что это довольно легко сделать, но я просто не знаю терминологию.

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

В идеале я хотел бы сделать это с помощью Python PIL, но я был бы так же счастлив сделать это с помощью ImageMagik, но в любом случае мне нужно иметь возможность script процесса, поскольку у меня есть 100 или около того изображений, которые я необходимо выполнить процесс.

Ответ 1

Вот фрагмент кода, в котором показано, как использовать scikit-image для наложения цветов на изображении на уровне серого. Идея состоит в том, чтобы преобразовать оба изображения в цветовое пространство HSV, а затем заменить значения оттенка и насыщенности изображения на уровне серого цветом цветовой маски.

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

Здесь вывод:

enter image description here

Ответ 2

В итоге я нашел ответ на этот вопрос, используя PIL, в основном создавая новое изображение с цветным блоком, а затем компонуя исходное изображение с этим новым изображением, используя маску, которая определяет прозрачный альфа-слой. Код ниже (адаптирован для преобразования каждого изображения в папку с именем data, выводящую в папку с именем output):

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

Невозможно опубликовать выходные изображения, к сожалению, из-за отсутствия rep.

Ответ 3

См. мой gist https://gist.github.com/Puriney/8f89b43d96ddcaf0f560150d2ff8297e

Функция ядра через opencv описывается ниже.

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)

Добавление цветного и прозрачного наложения на RGB или серое изображение может работать: выделить по цвету highlight-on-gray