ImageFilterDemo

Screenshot

ImageFilterDemo is a program that allows rapid prototyping of image filters in Java. This program was written by David Foster.

It appears that Tucker Blach has written a similar program, but in C instead of Java. See the talk page.

The BarrelBlobFinder filter, bundled with ImageFilterDemo v1.2.3 and later, is an implementation of one of the barrel detection algorithms.

Program & Source Code

• v1.5.2
• Enhanced some existing filters:
• Enhanced LinearHoughTransform2 to superimpose identified lines on top of the original image.
• Looks really cool! Check the Hough Transform page for screenshots.
• The old behavior of the filter can be attained by setting the "Output Type" parameter to 1.
• Enhanced GrayscaleFilter with the Binary Output boolean filter parameter.
• Added LocalMaximaHilighter, a new filter that hilights local maxima in grayscale images.
• Added GaussianBlurFilter, a new filter that performs a Gaussian blur on the input image. Implemented according to this page.
• Added NormalizeGrayscaleFilter, a new filter that linearly transforms the gray levels in the input image such that there are at least some pixels with the minimum and maximum intensities.
• Enhanced the Pixels utility class with some additional methods for converting between ARGB and grayscale pixels.
• Enhanced the GUI so that filters are no longer reapplied when a filter parameter is changed to a "new value" that is the same as its old value.
• Extended the plugin architechure to support plugin classes that contain nested classes
Before...
...and after application of the LinearHoughTransform2 filter.
• Added LinearHoughTransform2, an experimental new filter that detects lines of white pixels in a grayscale image.
• This implementation of the Hough Transform is more CPU intensive than the original LinearHoughTransform filter, but has a number of advantages:
1. the output is far easier to interpret
2. lines in all orientations are detected equally well - sensitivity to near-diagonal lines is better
• Filter Writers: This is the first standard filter that produces an output image that is of a different size of an input image. Those wishing to implement similar filters may want to take a look at the code of this filter.
• Added LineGenerator2, a new filter that displays a line at a specified (r, ${\displaystyle \theta }$) coordinate (relative to the center pixel of the input image).
• The lines that this filter can generate are precisely the ones that LinearHoughTransform2 can search for.
• Enhanced the BufferedImages utility class:
• Added the createSizeCompatibleBufferedImage and createSizeCompatibleARGBBufferedImage methods.
• Added the copyImageToBufferedImage and copyImageToARGBBufferedImage methods.
• Added the copyBufferedImageToPixelBuffer and copyBufferedImageToARGBPixelBuffer methods.
• v1.5
• Added a "scaling factor" slider to the ImageFilterDemo UI. Scaling images to smaller sizes improves performance in general.
• Added WhiteHilighterFilter, a new filter that hilights white pixels (in a binary fashion)
• The method used to identify white pixels is the same as the one that BarrelBlobFinder uses to find white stripes on barrels.
• Added BarrelBlobDeleter, a new filter that fills the boundaries of identified barrels with the background color of the image.
• The parameters of this filter precisely match those of BarrelBlobFinder.
• Added contour extraction filters for the diagonal, antidiagonal, and star (horizontal + vertical + diagonal + antidiagonal) directions.
• DiagonalContourExtractionFilter
• AntidiagonalContourExtractionFilter
• StarContourExtractionFilter
• Added GrayscaleFilter, a new filter that converts images to grayscale (and optionally thresholds that grayscale image).
• Added LinearHoughTransform, an experimental new filter that detects lines of white pixels in a grayscale image.
• This implementation of the Hough transform is still rather rudimentary - the format of the output is difficult to interpret without detailed knowledge of the implementation.
• It is quite likely that I will release another implementation of the Hough transform whose output is easier to interpret.
• I might mention that this filter has difficulty detecting lines that are almost but not exactly diagonal.
• The directional resolution of the implementation is low for lines approaching a diagonal (or antidiagonal) direction.
• Added LineGenerator, a new filter that displays a line with a specified axis, slope, and intercept.
• The lines that this filter can generate are precisely the ones that the current implementation of LinearHoughTransform can search for.
• Enhanced some existing filters
• Made the list of barrel-boundaries identified by BarrelBlobFinder accessible to external code via the getBarrelBoundList() function.
• Enhanced the Pixels utility class
• Added the grayToColor and graysToColors methods. These methods are useful for converting levels of gray into java.awt.Colors.
• Added WHITE_ARGB_PIXEL and BLACK_ARGB_PIXEL constants.
• v1.4.1
• Extended the Pixels class with methods for converting to/from grayscale pixels.
• Added Histograms, a utility class with methods for creating and analyzing normal histograms as well as probability histograms.
• v1.4
• Fixed a behavioral bug in ImageFilterDemo that caused the filter pipeline to be cleared continuously while image sequences were being played.
• Optimized the input pipeline for the internal classes PixelBufferToBufferedImageFilterAsBufferedImageFilter2, PixelBufferFilterAsBufferedImageFilter, and PixelBufferFilter2AsBufferedImageFilter (from 170-280 ms to 30-50 ms - 3.2 times faster), which implicitly improves the performance of all filters that implement PixelBufferToBufferedImageFilter, PixelBufferFilter, PixelBufferFilter2, or PixelFilter, including:
• BarrelBlobFilter
• BarrelHilighterFilter
• GrayscaleLevelHistogram (filter)
• HorizontalContourExtractionFilter, VerticalContourExtractionFilter
• PlusContourExtractionFilter (special case - speedup x 3, or 9.6 times faster)
• HorizontalFlipFilter
• RGBInversionFilter
• RedChannelFilter, GreenChannelFilter, BlueChannelFilter
• HueChannelFilter, SaturationChannelFilter, BrightnessChannelFilter
• Optimized the output pipeline for the internal classes PixelBufferFilterAsBufferedImageFilter and PixelBufferFilter2AsBufferedImageFilter (from 90-105 ms to 20-30 ms - 4 times faster), which implicitly improves the performance of all filters that implement PixelBufferFilter, PixelBufferFilter2, or PixelFilter, including:
• BarrelHilighterFilter
• HorizontalContourExtractionFilter, VerticalContourExtractionFilter
• PlusContourExtractionFilter
• HorizontalFlipFilter
• RGBInversionFilter
• RedChannelFilter, GreenChannelFilter, BlueChannelFilter
• HueChannelFilter, SaturationChannelFilter, BrightnessChannelFilter
• Added BufferedImages, a new utility class for performing certain operations on BufferedImages in a optimized fashion.
• Modified the GUI name of BarrelHilighterFilter to "Barrel Hilighter (Orange = Red-Green)".
Example histogram generated by GrayscaleLevelHistogram
• Added GrayscaleLevelHistogram, a new filter that displays a histogram showing the frequencies of different levels of grays in the input image.
Example histogram with optimal Otsu thresholding level indicated
• v1.3
• New input source: Image sequences
1. Choose an input file from a folder of images.
2. Click the "Play" button in the lower-left corner of the window.
• v1.2.5
• Enhanced BarrelBlobFinder to determine barrel widths a lot more accurately.
• Specifically, BarrelBlobFinder can now deal with barrels whose bottoms appear curved (which is common) more robustly.
• v1.2.4
• Specifically java.awt.image.ImageProducer.startProduction(ImageConsumer) on Mac OS X incorrectly invokes imageComplete(...) on the passed ImageConsumer.
• When a valid input image is loaded, imageComplete(...) is (correctly) invoked with the status STATICIMAGEDONE. But at the time of this invocation, attempts to query the loaded image's width/height fail (incorrectly).
• Also, after this first invocation of imageComplete(...), it is invoked yet again, but this time (incorrectly) with the status IMAGEERROR. This is a nonsensical status value, given that the image was already reported as being fully loaded.
• Due to the particular way in which ImageFilterDemo checked whether the image was loaded successfully, this strange pattern of invocation resulted in the message "Unable to load image!" being briefly displayed before the input image was rendered.
• To address this issue, the image loading code was rewritten to use the Image I/O API instead of the AWT Image API.
A barrel and its bounding box, as identified by BarrelBlobFinder
• Added FloatFilterParam, a new type of filter parameter.
• Added DoubleFilterParam, a new type of filter parameter.
• Added a Threshold parameter to BarrelHilighterFilter.
• Added BarrelBlobFinder, an experimental new filter that locates and draws bounding boxes around barrels.
• v1.2.2
• Added BufferedImageFilter2, a new type of filter.
• Added PixelBufferToBufferedImageFilter, a new type of filter.
• v1.2.1
• Minor corrections make to the Makefile.
• Added color conversion routines (between ARGB and AHSB) to the Pixels utility class.
• RGB Channel Filters
1. RedChannelFilter
2. GreenChannelFilter
3. BlueChannelFilter
• HSB Channel Filters
1. HueChannelFilter
2. SaturationChannelFilter
3. BrightnessChannelFilter
• BarrelHilighterFilter (experimental) - hilights areas of images where the difference (Red - Green) = Orange is large
• v1.2
• Made plugin architecture easier to use.
• To add a plugin to the GUI now, just add its .class file to the plugins folder.
• This can be done automatically if you write your plugin inside the srcplugins folder and then build it using the make pluginsWithDist command.
• Updated README file to explain the new way of adding plugins to the GUI.
• v1.1.1
• Fixed bug: The GUI editors for the filter parameters now check to make sure that the inputted value for a parameter is within the parameter's minimum and maximum values.
• v1.1
• Added support for filter parameters that are manipulatable in the GUI.
• Cleaned up and updated the README file.
• v1.0.4
• Added ability to save filtered images to disk.
• v1.0.3
• "Select..." button for selecting files now remembers the last file that was selected (even across different invocations of the program).
• Added support for dragging & dropping files into the "file well".
• v1.0.2
• Specifically, java.awt.Toolkit.prepareImage(Image, int, int, ImageObserver) on Windows does not notify the specified ImageObserver when images are finished loading under certain conditions.
• Credit goes to Andy for discovering this bug.
• v1.0.1
• Added PixelBufferFilter2, a new type of filter.
• Added contour extraction filters for the horizontal, vertical, and plus (horizontal+vertical) directions.
• v1.0
• Original version

Future Versions (Planned)

• v2.0
• New input source: Movies (.mov, or other formats that QuickTime can handle)
• Added support for temporal filters. These are filters that are designed for processing several images in sequence.

Feature Requests

• Ability to apply multiple filters simultaneously (in a specific order) --Andy
• Workaround: