README

bild

bild logo

MIT License GoDoc CircleCI Go Report Card

A collection of parallel image processing algorithms in pure Go.

The aim of this project is simplicity in use and development over absolute high performance, but most algorithms are designed to be efficient and make use of parallelism when available.

It uses packages from the standard library whenever possible to reduce dependency use and development abstractions.

All operations return image types from the standard library.

Documentation

The documentation for the various packages is available here.

CLI usage

Download and compile from sources:

go get github.com/anthonynsimon/bild

Or get the pre-compiled binaries for your platform on the releases page

bild

A collection of parallel image processing algorithms in pure Go

Usage:
  bild [command]

Available Commands:
  adjust      adjust basic image features like brightness or contrast
  blend       blend two images together
  blur        blur an image using the specified method
  channel     channel operations on images
  effect      apply effects on images
  help        Help about any command
  histogram   histogram operations on images
  imgio       i/o operations on images
  noise       noise generators
  segment     segment an image using the specified method

Flags:
  -h, --help      help for bild
      --version   version for bild

Use "bild [command] --help" for more information about a command.

For example, to apply a median effect with a radius of 1.5 on the image input.png, writing the result into a new file called output.png:

bild effect median --radius 1.5 input.png output.png

Install package

bild requires Go version 1.11 or greater.

go get github.com/anthonynsimon/bild/...

Basic package usage example:

package main

import (
    "github.com/anthonynsimon/bild/effect"
    "github.com/anthonynsimon/bild/imgio"
    "github.com/anthonynsimon/bild/transform"
)

func main() {
    img, err := imgio.Open("input.jpg")
    if err != nil {
        fmt.Println(err)
        return
    }

    inverted := effect.Invert(img)
    resized := transform.Resize(inverted, 800, 800, transform.Linear)
    rotated := transform.Rotate(resized, 45, nil)

    if err := imgio.Save("output.png", rotated, imgio.PNGEncoder()); err != nil {
        fmt.Println(err)
        return
    }
}

Output examples

Adjustment

import "github.com/anthonynsimon/bild/adjust"
Brightness
result := adjust.Brightness(img, 0.25)

example

Contrast
result := adjust.Contrast(img, -0.5)

example

Gamma
result := adjust.Gamma(img, 2.2)

example

Hue
result := adjust.Hue(img, -42)

example

Saturation
result := adjust.Saturation(img, 0.5)

example

Blend modes

import "github.com/anthonynsimon/bild/blend"

result := blend.Multiply(bg, fg)
Add Color Burn Color Dodge
Darken Difference Divide
Exclusion Lighten Linear Burn
Linear Light Multiply Normal
Opacity Overlay Screen
Soft Light Subtract

Blur

import "github.com/anthonynsimon/bild/blur"
Box Blur
result := blur.Box(img, 3.0)

example

Gaussian Blur
result := blur.Gaussian(img, 3.0)

example

Channel

import "github.com/anthonynsimon/bild/channel"
Extract Channels
result := channel.Extract(img, channel.Alpha)

example

Extract Multiple Channels
result := channel.ExtractMultiple(img, channel.Red, channel.Alpha)

Effect

import "github.com/anthonynsimon/bild/effect"
Dilate
result := effect.Dilate(img, 3)

example

Edge Detection
result := effect.EdgeDetection(img, 1.0)

example

Emboss
result := effect.Emboss(img)

example

Erode
result := effect.Erode(img, 3)

example

Grayscale
result := effect.Grayscale(img)

example

Invert
result := effect.Invert(img)

example

Median
result := effect.Median(img, 10.0)

example

Sepia
result := effect.Sepia(img)

example

Sharpen
result := effect.Sharpen(img)

example

Sobel
result := effect.Sobel(img)

example

Unsharp Mask
result := effect.UnsharpMask(img, 0.6, 1.2)

example

Histogram

import "github.com/anthonynsimon/bild/histogram"
RGBA Histogram
hist := histogram.NewRGBAHistogram(img)
result := hist.Image()

example

Noise

import "github.com/anthonynsimon/bild/noise"
Uniform colored
result := noise.Generate(280, 280, &noise.Options{Monochrome: false, NoiseFn: noise.Uniform})

example

Binary monochrome
result := noise.Generate(280, 280, &noise.Options{Monochrome: true, NoiseFn: noise.Binary})

example

Gaussian monochrome
result := noise.Generate(280, 280, &noise.Options{Monochrome: true, NoiseFn: noise.Gaussian})

example

Perlin Noise
result := noise.GeneratePerlin(280, 280, 0.25)

example

Paint

import "github.com/anthonynsimon/bild/paint"
Flood Fill
// Fuzz is the percentage of maximum color distance that is tolerated
result := paint.FloodFill(img, image.Point{240, 0}, color.RGBA{255, 0, 0, 255}, 15)

example

Segmentation

import "github.com/anthonynsimon/bild/segment"
Threshold
result := segment.Threshold(img, 128)

example

Transform

import "github.com/anthonynsimon/bild/transform"
Crop
// Source image is 280x280
result := transform.Crop(img, image.Rect(70,70,210,210))

example

FlipH
result := transform.FlipH(img)

example

FlipV
result := transform.FlipV(img)

example

Resize Resampling Filters
result := transform.Resize(img, 280, 280, transform.Linear)
Nearest Neighbor Linear Gaussian
Mitchell Netravali Catmull Rom Lanczos
Rotate
// Options set to nil will use defaults (ResizeBounds set to false, Pivot at center)
result := transform.Rotate(img, -45.0, nil)

example

// If ResizeBounds is set to true, the full rotation bounding area is used
result := transform.Rotate(img, -45.0, &transform.RotationOptions{ResizeBounds: true})

example

// Pivot coordinates are set from the top-left corner
// Notice ResizeBounds being set to default (false)
result := transform.Rotate(img, -45.0, &transform.RotationOptions{Pivot: &image.Point{0, 0}})

example

Shear Horizontal
result := transform.ShearH(img, 30)

example

Shear Vertical
result := transform.ShearV(img, 30)

example

Translate
result := transform.Translate(img, 80, 0)

example

Contribute

Want to hack on the project? Any kind of contribution is welcome!
Simply follow the next steps:

  • Fork the project.
  • Create a new branch.
  • Make your changes and write tests when practical.
  • Commit your changes to the new branch.
  • Send a pull request, it will be reviewed shortly.

In case you want to add a feature, please create a new issue and briefly explain what the feature would consist of. For bugs or requests, before creating an issue please check if one has already been created for it.

Changelog

Please see the changelog for more details.

License

This project is licensed under the MIT license. Please read the LICENSE file.

Expand ▾ Collapse ▴

Documentation

The Go Gopher

There is no documentation for this package.

Source Files

Directories

Path Synopsis
Package adjust provides basic color correction functions.
Package adjust provides basic color correction functions.
Package blend provides common image blending modes.
Package blend provides common image blending modes.
Package blur provides image blurring functions.
Package blur provides image blurring functions.
Package channel provides image channel separation and manipulation functions.
Package channel provides image channel separation and manipulation functions.
Package clone provides image cloning function.
Package clone provides image cloning function.
Package convolution provides the functionality to create and apply a kernel to an image.
Package convolution provides the functionality to create and apply a kernel to an image.
Package effect provides the functionality to manipulate images to achieve various looks.
Package effect provides the functionality to manipulate images to achieve various looks.
Package fcolor provides a basic RGBAF64 color type.
Package fcolor provides a basic RGBAF64 color type.
Package histogram provides basic histogram types and functions to analyze RGBA images.
Package histogram provides basic histogram types and functions to analyze RGBA images.
Package imgio provides basic image file input/output.
Package imgio provides basic image file input/output.
math
f64
Package f64 provides helper functions for the float64 type.
Package f64 provides helper functions for the float64 type.
integer
Package integer provides helper functions for the integer type.
Package integer provides helper functions for the integer type.
Package paint provides functions to edit a group of pixels on an image.
Package paint provides functions to edit a group of pixels on an image.
Package parallel provides helper functions for the dispatching of parallel jobs.
Package parallel provides helper functions for the dispatching of parallel jobs.
Package perlin provides coherent noise function over 1, 2 or 3 dimensions This code is go adaptagion based on C implementation that can be found here: http://git.gnome.org/browse/gegl/tree/operations/common/perlin/perlin.c (original copyright Ken Perlin)
Package perlin provides coherent noise function over 1, 2 or 3 dimensions This code is go adaptagion based on C implementation that can be found here: http://git.gnome.org/browse/gegl/tree/operations/common/perlin/perlin.c (original copyright Ken Perlin)
Package segment provides basic image segmentation and clusterring methods.
Package segment provides basic image segmentation and clusterring methods.
Package transform provides basic image transformation functions, such as resizing, rotation and flipping.
Package transform provides basic image transformation functions, such as resizing, rotation and flipping.
Package util provides various helper functions for the package bild.
Package util provides various helper functions for the package bild.