Applying a coloured overlay to an image in either PIL or Imagemagik

前端 未结 3 1822
自闭症患者
自闭症患者 2020-12-15 08:04

I am a complete novice to image processing, and I am guessing this is quite easy to do, but I just don\'t know the terminology.

Basically, I have a black and white im

相关标签:
3条回答
  • 2020-12-15 08:50

    Here's a code snippet that shows how to use scikit-image to overlay colors on a grey-level image. The idea is to convert both images to the HSV color space, and then to replace the hue and saturation values of the grey-level image with those of the color mask.

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

    Here's the output:

    enter image description here

    0 讨论(0)
  • 2020-12-15 08:51

    See my gist https://gist.github.com/Puriney/8f89b43d96ddcaf0f560150d2ff8297e

    Core function via opencv is described as below.

    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)
    

    Add colored and transparent overlay on either RGB or gray image can work:

    0 讨论(0)
  • 2020-12-15 09:01

    I ended up finding an answer to this using PIL, basically creating a new image with a block colour, and then compositing the original image, with this new image, using a mask that defines a transparent alpha layer. Code below (adapted to convert every image in a folder called data, outputting into a folder called 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,))
    

    Can't post the output images unfortunately due to lack of rep.

    0 讨论(0)
提交回复
热议问题