module Tutorial::ChromaKey

Overview

Given sample.jpg image:

Woman with black turtleneck and white background

We can swap out the background by creating a mask representing the pixels that are close in color, and replacing them using an MaskApply#apply_color method.

require "cr-image"
require "cr-image/jpeg"

image = CrImage::RGBAImage.open("sample.jpg")

# Grab a color from the background, for comparison
background = image[10, 10]

# Construct a mask of all pixels within a color distance of our background
background_mask = image.mask_from do |color|
  # 25 chosen through trial-and-error
  color.dist(background) < 25
end
  .closing! # Remove small `true` regions
  .opening! # Remove small `false` regions

# Now make the background blue
image
  .apply_color(background_mask, CrImage::Color.of("#0000cc"))
  .save("chromakey.jpg")

Results in image:

Background is blue, woman is unchanged

This script ran on my machine in 4ms in --release mode.

Defined in:

tutorials/chromakey_tutorial.cr