项目作者: Milchreis

项目描述 :
Collection of basic image processing algorithms for processing
高级语言: Java
项目地址: git://github.com/Milchreis/processing-imageprocessing.git
创建时间: 2018-01-04T18:38:33Z
项目社区:https://github.com/Milchreis/processing-imageprocessing

开源协议:Other

下载


Image processing for Processing

This library collects various image processing algorithms and provides simple access to them. All algorithms are implemented
in Java and runs without any other dependencies. Some algorithms are pretty standard and others maybe do you know from Photoshop.
It starts with less basic features and grow over the last years.
If you need high power performance better use opencv for processing.

If you like this project and you want to keep me awake 🤪

Buy Me a Coffee at ko-fi.com

Installation

If you want to use this library in your processing sketch you can download it via the integrated Contribution Manager.

alt install

Examples

Overview

The following algorithms are supported in this library. Click on the link to see an example image and a code snippet.

Original image

alt original

Photo taken by me more here

Basics

Grayscale image

alt grayscale

  1. PImage processedImage = Grayscale.apply(image);

Flip image

alt flip

  1. PImage processedImage = Flip.apply(image, horizontal, vertical); // horizontal and vertical are boolean

Invert colors

alt invert colors

  1. // invertRed, invertGreen and invertBlue are boolean
  2. PImage processedImage = InvertColors.apply(image, invertRed, invertGreen, invertBlue);

Threshold image

alt threshold

  1. PImage processedImage = Threshold.apply(image); // Auto threshold
  2. PImage processedImage = Threshold.apply(image, value); // Threshold value between 0 and 255

Dilation image

alt dilation

  1. PImage processedImage = Dilation.apply(image, radius); // radius is a positive number

Erosion image

alt erosion

  1. PImage processedImage = Erosion.apply(image, radius); // radius is a positive number

Vignette image

alt vignette

  1. // intensity and vignetteWidth are floats between 0.0 and 1.0
  2. PImage processedImage = Vignette.apply(image, intensity, vignetteWidth);

Quantization

alt quantization

  1. PImage processedImage = Quantization.apply(image, shades); // shades is a positive number between 1 and 255

PaletteMapping

alt quantization

  1. PImage processedImage = PaletteMapping.apply(image, color1, color2, color3); // Add any number of colors from dark to light

Difference

alt difference

  1. // difference is a float between 0.0 and 1.0 from less to very different
  2. float difference = Comparison.howDifferent(image1, image2);
  3. // differenceImage is the difference between the pixel values (black is no difference, white is high difference)
  4. PImage differenceImage = Comparison.calculateDifferenceImage(image1, image2);

Blur

Gaussian blur image

alt gaussian

  1. PImage processedImage = Gaussian.apply(image, 7, 0.84089642); // kernel size and sigma

Pixelize image

alt pixelation

  1. // pixelsize is a positive number
  2. PImage processedImage = Pixelation.apply(image, pixelsize);
  3. // Pixelize a sub area of the input image
  4. PImage processedImage = Pixelation.apply(image, pixelsize, subX, subY, subWidth, subHeight);

Tilt-Shift-Effect

alt tilt-shift

  1. PImage processedImage = TiltShift.apply(image, blurIntensity, horizontal, position, sharpWideness);

Edge detection

Canny’s algorithm

alt canny-edge

  1. PImage processedImage = CannyEdgeDetector.apply(image);

Sobels algorithm

alt sobel-edge

  1. PImage processedImage = SobelEdgeDetector.apply(image);
  2. // for colored sobel (for each color channel)
  3. PImage processedImage = SobelEdgeDetector.apply(image, false);

Optimisation

Brightness

alt autobalance

  1. PImage processedImage = Brightness.apply(image, value);
  2. // value isa positive number for brighting up or a negative for darken down

Contrast

alt contrast

  1. // intensity is between -1.0 and 1.0
  2. PImage processedImage = Contrast.apply(image, intensity);

Saturation

alt saturation

  1. // intensity is between 0.0 and 10.0
  2. // 0.0 to 1.0 decreases and all above increases the saturation
  3. PImage processedImage = Saturation.apply(image, intensity);

Changing highlights

alt changing highlights

  1. // intensity between -1.0 and 1.0
  2. PImage processedImage = Lights.apply(image, intensity);

Changing shadows

alt changing shadows

  1. // intensity between -1.0 and 1.0
  2. PImage processedImage = Shadows.apply(image, intensity);

AutoBalance image

alt autobalance

  1. PImage processedImage = AutoBalance.apply(image);

Bloom image

alt bloom

  1. PImage processedImage = Bloom.apply(image, intensity); // intensity between 0 and 255

Sharpen image

alt sharpen

  1. PImage processedImage = Sharpen.apply(image, sharpIntensity); // sharpIntensity between 0.0 and 10.0

Color shift image

alt color shift

  1. // hue is a value between 0 and 360
  2. // offset is the color range which is accepted (in hue range)
  3. // shift is the number of the subtracted or added hue value
  4. PImage processedImage = ColorShift.applyHue(image, hue, offset, shift); // or short: ColorShift.apply(image, hue, offset, shift)
  5. PImage processedImage = ColorShift.applySaturation(image, hue, offset, shift);
  6. PImage processedImage = ColorShift.applyBrightness(image, hue, offset, shift);

Looks

Lookup table image

alt lookup-table

  1. LUT style = LUT.loadLut(LUT.STYLE.CONTRAST);
  2. PImage processedImage = LUT.apply(image, style);

RetroConsole effect (Gameboy)

alt lookup-table

  1. PImage processedImage = RetroConsole.applyGameboy(image, pixelSize);

Glitch image

alt glitch-effect

  1. PImage processedImage = Glitch.apply(image, intensity, scanlineheight);

Matte effect

alt matte-effect

  1. PImage processedImage = Matte.apply(image,
  2. matteIntensity, // intensity for the lifting blacks between 0 and 255
  3. contrastIntensity, // intensity for the constrast between 0 and 255
  4. saturationIntensity); // change for the saturation between -0.5 and 0.5

Sabattier effect

alt sabattier-effect

  1. // intensity between 0.0 and 1.0
  2. PImage processedImage = Sabattier.apply(image, intensity);
  3. PImage processedImage = Sabattier.applyRed(image, intensity);
  4. PImage processedImage = Sabattier.applyGreen(image, intensity);
  5. PImage processedImage = Sabattier.applyBlue(image, intensity);

Strokes image

random angles fixed angle
alt strokes alt strokes
  1. PImage processedImage = Strokes.apply(image, gridSize, lineLength);
  2. PImage processedImage = Strokes.apply(image,
  3. gridSize, // is positive and the area for compound pixels
  4. lineLength, // is positive and the length in pixels for each line
  5. lineWeight, // is positive and the weight of each line in pixel
  6. linesPerGrid, // the number of lines per grid
  7. lineIntensity, // alpha value for each line between 0 and 255
  8. degree, // if set the rotation is fixed in degree, otherwise random
  9. inColor, // true for colors else black and white
  10. backgroundColor); // color for the background

Dithering

alt dithering

  1. // default dithering algorithm is BAYER_4x4
  2. PImage processedImage = Dithering.apply(image);
  3. // change algrithm: BAYER_2x2, BAYER_4x4, BAYER_8x8
  4. PImage processedImage = Dithering.apply(image, Dithering.Algorithm.BAYER_8x8);
  5. // use a curstom kernel (kernel = float[])
  6. PImage processedImage = Dithering.aapply(PImage image, kernel);

Halftone image

alt halftone

  1. PImage processedImage = Halftone.apply(image, dotsize); // dot size in pixel
  2. PImage processedImage = Halftone.apply(image, dotsize, grid); // grid = true, on false honeycomb style
  3. PImage processedImage = Halftone.apply(image, dotsize, foreground, background); // background and foreground colors
  4. PImage processedImage = Halftone.apply(image, dotsize, foreground, background, grid);
  5. PImage processedImage = Halftone.apply(image, dotsize, foreground, background, spacing, grid); // size between dots in pixels

Toning image

alt toning

  1. // tone is a color and intensity is a value between 0.0 and 1.0
  2. color tone = color(255, 11, 120);
  3. float intensity = 0.8f;
  4. PImage processedImage = Toning.apply(image, tone, intensity);

Split toning image

alt split-toning

  1. PImage processedImage = SplitToning.apply(
  2. image,
  3. highlightTone, // Color for highlighs (f.e. color highlightTone = color(211, 180, 21);
  4. intensityHighlights, // intensity for the toning in highlights between 0.0 and 1.0
  5. shadowTone, // Color for the shadows (f.e. color shadowTone = color(124, 32, 201);
  6. intensityShadows); // intensity for the toning in the shadows between 0.0 and 1.0

Sine-Wave image

alt sine-wave

  1. PImage processedImage = SineWave.apply(image, rowHeight, weight, backgroundColor, wavesColor);

Knitting image

alt knitting

  1. // keeps the original colors
  2. PImage processedImage = Knitting.apply(image, size);
  3. // Sets foreground and background color and uses a threshold
  4. PImage processedImage = Knitting.apply(image, size, threshold, 240, #EE0000);

ASCII image

alt ascii

  1. PImage processedImage = ASCII.apply(image);
  2. // characterset = ASCII.SHORT_SET or ASCII.LONG_SET, another String from black to white
  3. PImage processedImage = ASCII.apply(image, characterset);
  4. PImage processedImage = ASCII.apply(image, characterset, fontSize); // fontSize is an integer
  5. PImage processedImage = ASCII.apply(image, characterset, fontSize, foregroundColor, backgroundColor, toneInColor);
  6. // To get the ASCII image as plain string use the following method
  7. PImage processedImage = ASCII.getAsciiText(image);

Miscellaneous

Stacked images

alt stacked

  1. // Add so many images in the end as you need
  2. PImage processedImage = Stacker.apply(Stacker.ALGORITHM.AVERAGE, image1, image2);
  3. PImage processedImage = Stacker.apply(Stacker.ALGORITHM.MEDIAN, image1, image2);

Blending two images

alt blending

  1. // intensity is a float between 0.0 and 1.0
  2. PImage processedImage = Blend.apply(image1, image2, intensity);

Special thanks

My special thanks goes to avatarr for implementing and
publishing basic algorithms. Also thank you very much Tom Gibara for your great blog post and the implementation of
the canny edge detector.

Moreover I thank you Joseph HENRY for the Sine-Wave-effect code and
uheinema for the Sabattier code in the Processing Discourse.