Skip to main content

Image processing blend modes

Project description

This Python package implements blend modes for images.

Description

The Blend Modes package enables blending different images, or image layers, by means of blend modes. These modes are commonly found in graphics programs like Adobe Photoshop or GIMP.

Blending through blend modes allow to mix images in a variety of ways. This package currently supports the following blend modes (name of the respective functions in the package in italics):

  • Soft Light (blend_modes.soft_light)

  • Lighten Only (blend_modes.lighten_only)

  • Dodge (blend_modes.dodge)

  • Addition (blend_modes.addition)

  • Darken Only (blend_modes.darken_only)

  • Multiply (blend_modes.multiply)

  • Hard Light (blend_modes.hard_light)

  • Difference (blend_modes.difference)

  • Subtract (blend_modes.subtract)

  • Grain Extract (known from GIMP, blend_modes.grain_extract)

  • Grain Merge (known from GIMP, blend_modes.grain_merge)

  • Divide (blend_modes.divide)

The intensity of blending can be controlled by means of an opacity parameter that is passed into the functions. See Usage for more information.

The Blend Modes package is optimized for speed. It takes advantage of vectorization through Numpy. Further speedup can be achieved when implementing the package in Cython. However, Cython implementation is not part of this package.

Usage

The blend mode functions take image data expressed as arrays as an input. These image data are usually obtained through functions from image processing packages. Two popular packages in Python are PIL or its fork Pillow and OpenCV. The following examples show how to blend images using these packages.

Input and Output Formats

The blend mode functions expect Numpy arrays in the format [pixels in dimension 1,pixels in dimension 2,4] as an input. The order of the channels in the third dimension should be R, G, B, A, where A is the alpha channel. All values should be floats in the range 0.0 <= value <= 255.0. The blend mode functions return arrays in the same format.

PIL/Pillow Example

The following example shows how to use the Blend Modes package with the PIL or Pillow packages.

from PIL import Image
import numpy
from blend_modes import blend_modes

# Import background image
background_img_raw = Image.open('background.png')  # RGBA image
background_img = numpy.array(background_img_raw)  # Inputs to blend_modes need to be numpy arrays.
background_img_float = background_img.astype(float)  # Inputs to blend_modes need to be floats.

# Import foreground image
foreground_img_raw = Image.open('foreground.png')  # RGBA image
foreground_img = numpy.array(foreground_img_raw)  # Inputs to blend_modes need to be numpy arrays.
foreground_img_float = foreground_img.astype(float)  # Inputs to blend_modes need to be floats.

# Blend images
opacity = 0.7  # The opacity of the foreground that is blended onto the background is 70 %.
blended_img_float = blend_modes.soft_light(background_img_float, foreground_img_float, opacity)

# Convert image back into PIL images
blended_img = numpy.uint8(blended_img_float)  # Image needs to be converted back to uint8 type for PIL handling.
blended_img_raw = Image.fromarray(blended_img)  # Note that alpha channels are displayed in black by PIL by default.
                                                # This behavior is difficult to change (although possible).
                                                # If you have alpha channels in your images, then you should give
                                                # OpenCV a try.

OpenCV Example

The following example shows how to use the Blend Modes package with OpenCV.

import cv2  # import OpenCV
import numpy
from blend_modes import blend_modes

# Import background image
background_img_float = cv2.imread('background.png',-1).astype(float)

# Import foreground image
foreground_img_float = cv2.imread('foreground.png',-1).astype(float)

# Blend images
opacity = 0.7  # The opacity of the foreground that is blended onto the background is 70 %.
blended_img_float = blend_modes.soft_light(background_img_float, foreground_img_float, opacity)

Installation

The Blend Modes package can be installed through pip: $ pip install blend_modes

Dependencies

The Blend Modes package needs Numpy to function correctly. For loading images the following packages have been successfully used:

See Also

Blend modes are further described on Wikipedia. An actual implementation can be found in the GIMP source code, e.g. in the file gimpoperationdividecode.c.

Contribution

I am happy about any contribution or feedback. Please let me know about your comments via the Issues tab on GitHub.

License

The Blend Modes package is distributed under the MIT License (MIT). Please also take note of the licenses of the dependencies.

Project details


Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page