ImageFilterDemo

From RoboJackets Wiki
Revision as of 09:04, 10 November 2005 by DavidF (talk | contribs) (Future Versions (Planned))
Jump to navigation Jump to search
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.0
    • Original version
  • 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.2
    • Addressed issue with loading certain images on Windows systems.
      • 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.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.4
    • Added ability to save filtered images to disk.
  • v1.1
    • Added support for filter parameters that are manipulatable in the GUI.
    • Cleaned up and updated the README file.
  • 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.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.2.1
    • Minor corrections make to the Makefile.
    • Added color conversion routines (between ARGB and AHSB) to the Pixels utility class.
    • Added several new filters:
      • 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.2
    • Added BufferedImageFilter2, a new type of filter.
    • Added PixelBufferToBufferedImageFilter, a new type of filter.
  • v1.2.3
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.4
    • Addressed issue with loading certain images on Mac OS X:
      • 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.
  • 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.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.3.1
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

Future Versions (Planned)

  • v1.4 - Coming Soon!
    • 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)".
  • 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:
      1. Load the original image.
      2. Select the first filter.
      3. Save the filtered image.
      4. Load the filtered image.
      5. Select the next filter.
      6. Repeat until no more filters.
  • Ability to save config profiles for each filter. --Andy
    • ...to file, to preferences, or to both? --David