Difference between revisions of "ImageFilterDemo"

From RoboJackets Wiki
Jump to navigation Jump to search
(added plans for future versions of the program)
 
(60 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 +
[[Category:IGVC]]
 
[[Image:ImageFilterDemoScreenshot.jpg|thumb|right|Screenshot]]
 
[[Image:ImageFilterDemoScreenshot.jpg|thumb|right|Screenshot]]
  
 
'''ImageFilterDemo''' is a program that allows rapid prototyping of image filters in [http://java.sun.com Java].
 
'''ImageFilterDemo''' is a program that allows rapid prototyping of image filters in [http://java.sun.com Java].
 
This program was written by [[User:DavidF|David Foster]].
 
This program was written by [[User:DavidF|David Foster]].
 +
 +
It appears that [http://www.cc.gatech.edu/~tucker/ Tucker Blach] has written a similar program, but in C instead of Java. See the [[Talk:ImageFilterDemo|talk page]].
 +
 +
The '''BarrelBlobFinder''' filter, bundled with ImageFilterDemo v1.2.3 and later, is an implementation of one of the [[Barrel Detection|barrel detection]] algorithms.
  
 
== Program & Source Code ==
 
== Program & Source Code ==
* [[:Image:ImageFilterDemo.zip|v1.0]]
+
* [[:Image:ImageFilterDemo_v1_5_2.zip|v1.5.2]]
** Original version
+
** 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 <tt>1</tt>.
 +
*** Enhanced '''GrayscaleFilter''' with the <tt>Binary Output</tt> boolean filter parameter.
 +
** Added some new filters:
 +
*** 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 [http://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm 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
 +
 
 +
* [[:Image:ImageFilterDemo_v1_5_1.zip|v1.5.1]]
 +
[[Image:LinesOnBlack.png|thumb|right|Before...]]
 +
[[Image:LinesOnBlackWithHoughTransform.png|thumb|right|...and after application of the '''LinearHoughTransform2''' filter.]]
 +
** Added some new filters:
 +
*** 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:
 +
****# the output is far easier to interpret
 +
****# 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 (<tt>r</tt>, <tt><math>\theta</math></tt>) 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 <tt>createSizeCompatibleBufferedImage</tt> and <tt>createSizeCompatibleARGBBufferedImage</tt> methods.
 +
*** Added the <tt>copyImageToBufferedImage</tt> and <tt>copyImageToARGBBufferedImage</tt> methods.
 +
*** Added the <tt>createSizeCompatiblePixelBuffer</tt> method.
 +
*** Added the <tt>copyBufferedImageToPixelBuffer</tt> and <tt>copyBufferedImageToARGBPixelBuffer</tt> methods.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_5.zip|v1.5]]
 +
** Added a "scaling factor" slider to the ImageFilterDemo UI. Scaling images to smaller sizes improves performance in general.
 +
** Added some new filters
 +
*** 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 <tt>getBarrelBoundList()</tt> function.
 +
** Enhanced the '''Pixels''' utility class
 +
*** Added the <tt>grayToColor</tt> and <tt>graysToColors</tt> methods. These methods are useful for converting levels of gray into <tt>java.awt.Color</tt>s.
 +
*** Added the <tt>grayToARGB</tt> method.
 +
*** Added <tt>WHITE_ARGB_PIXEL</tt> and <tt>BLACK_ARGB_PIXEL</tt> constants.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_4_1.zip|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.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_4.zip|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 <tt>BufferedImage</tt>s in a optimized fashion.
 +
** Modified the GUI name of '''BarrelHilighterFilter''' to <tt>"Barrel Hilighter (Orange = Red-Green)"</tt>.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_3_2.zip|v1.3.2]]
 +
** Added '''OtsuThresholdingAlgorithm''', an implementation of the [[Adaptive Thresholding#Otsu Threshholding|Otsu thresholding algorithm]].
 +
** Modified '''GrayscaleLevelHistogram''' to display the optimal threshold value for the output histogram, as calculated by the [[Adaptive Thresholding#Otsu Threshholding|Otsu thresholding algorithm]].
 +
 
 +
* [[:Image:ImageFilterDemo_v1_3_1.zip|v1.3.1]]
 +
[[Image:Histogram.png|thumb|right|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.
 +
*** Created to assist in evaluating [[Adaptive Thresholding|adaptive thresholding]] algorithms.
 +
[[Image:HistogramWithOtsuThreshold.png|thumb|right|Example histogram with optimal [[Adaptive Thresholding#Otsu Threshholding|Otsu]] thresholding level indicated]]
 +
 
 +
* [[:Image:ImageFilterDemo_v1_3.zip|v1.3]]
 +
** New input source: Image sequences
 +
**# Choose an input file from a folder of images.
 +
**# Click the "Play" button in the lower-left corner of the window.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_2_5.zip|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.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_2_4.zip|v1.2.4]]
 +
** Addressed issue with loading certain images on Mac OS X:
 +
*** Specifically <tt>java.awt.image.ImageProducer.startProduction(ImageConsumer)</tt> on Mac OS X incorrectly invokes <tt>imageComplete(...)</tt> on the passed <tt>ImageConsumer</tt>.
 +
**** When a ''valid'' input image is loaded, <tt>imageComplete(...)</tt> is (correctly) invoked with the status <tt>STATICIMAGEDONE</tt>. But at the time of this invocation, attempts to query the loaded image's width/height fail (incorrectly).
 +
**** Also, after this first invocation of <tt>imageComplete(...)</tt>, it is invoked yet again, but this time (incorrectly) with the status <tt>IMAGEERROR</tt>. 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.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_2_3.zip|v1.2.3]]
 +
[[Image:IdentifiedBarrel.png|thumb|right|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 <tt>Threshold</tt> parameter to ''BarrelHilighterFilter''.
 +
** Added '''BarrelBlobFinder''', an experimental new filter that locates and draws bounding boxes around barrels.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_2_2.zip|v1.2.2]]
 +
** Added '''BufferedImageFilter2''', a new type of filter.
 +
** Added '''PixelBufferToBufferedImageFilter''', a new type of filter.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_2_1.zip|v1.2.1]]
 +
** Minor corrections make to the Makefile.
 +
** Added [[Color Mode Changing|color conversion routines]] (between ARGB and AHSB) to the '''Pixels''' utility class.
 +
** Added several new filters:
 +
*** '''RGB Channel Filters'''
 +
***# <tt>RedChannelFilter</tt>
 +
***# <tt>GreenChannelFilter</tt>
 +
***# <tt>BlueChannelFilter</tt>
 +
*** '''HSB Channel Filters'''
 +
***# <tt>HueChannelFilter</tt>
 +
***# <tt>SaturationChannelFilter</tt>
 +
***# <tt>BrightnessChannelFilter</tt>
 +
*** '''BarrelHilighterFilter''' (''experimental'') - hilights areas of images where the difference <tt>(Red - Green) = Orange</tt> is large
 +
 
 +
* [[:Image:ImageFilterDemo_v1_2.zip|v1.2]]
 +
** Made plugin architecture easier to use.
 +
*** To add a plugin to the GUI now, just add its <tt>.class</tt> file to the <tt>plugins</tt> folder.
 +
*** This can be done automatically if you write your plugin inside the <tt>srcplugins</tt> folder and then build it using the <tt>make pluginsWithDist</tt> command.
 +
** Updated <tt>README</tt> file to explain the new way of adding plugins to the GUI.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_1_1.zip|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.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_1.zip|v1.1]]
 +
** Added support for filter parameters that are manipulatable in the GUI.
 +
** Cleaned up and updated the <tt>README</tt> file.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_0_4.zip|v1.0.4]]
 +
** Added ability to save filtered images to disk.
 +
 
 +
* [[:Image:ImageFilterDemo_v1_0_3.zip|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".
 +
 
 +
* [[:Image:ImageFilterDemo_v1_0_2.zip|v1.0.2]]
 +
** Addressed issue with loading certain images on Windows systems.
 +
*** Specifically, <tt>java.awt.Toolkit.prepareImage(Image, int, int, ImageObserver)</tt> on Windows does not notify the specified ImageObserver when images are finished loading under certain conditions.
 +
*** Credit goes to [[User:AndyB|Andy]] for discovering this bug.
 +
 
 
* [[:Image:ImageFilterDemo_v1_0_1.zip|v1.0.1]]
 
* [[:Image:ImageFilterDemo_v1_0_1.zip|v1.0.1]]
 
** Added '''PixelBufferFilter2''', a new type of filter.
 
** Added '''PixelBufferFilter2''', a new type of filter.
 
** Added contour extraction filters for the horizontal, vertical, and plus (horizontal+vertical) directions.
 
** Added contour extraction filters for the horizontal, vertical, and plus (horizontal+vertical) directions.
 +
 +
* [[:Image:ImageFilterDemo.zip|v1.0]]
 +
** Original version
  
 
== Future Versions (Planned) ==
 
== Future Versions (Planned) ==
* v1.0.2 - '''Coming soon!'''
 
** Addresses 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 certain images are finished loaading.
 
*** Credit goes to [[User:AndyB|Andy]] for discovering this bug.
 
* v1.0.3
 
** "Select..." button for selecting files now remembers the last file that was selected.
 
** Added support for dragging & dropping files into the "file well".
 
* v1.1
 
** Added support for filter parameters that are manipulatable in the GUI.
 
 
* v2.0
 
* v2.0
** New input source: Image sequences
 
 
** New input source: Movies (.mov, or other formats that QuickTime can handle)
 
** 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.
 
** 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) --[[User:AndyB|Andy]]
 +
** ''Workaround:''
 +
**# Load the original image.
 +
**# Select the first filter.
 +
**# Save the filtered image.
 +
**# Load the filtered image.
 +
**# Select the next filter.
 +
**# Repeat until no more filters.
 +
* Ability to save config profiles for each filter. --[[User:AndyB|Andy]]
 +
** ''...to file, to preferences, or to both?'' --[[User:DavidF|David]]
 +
 +
== See Also ==
 +
* [[Barrel Blob Finder]]

Latest revision as of 21:49, 13 June 2018

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 some new filters:
      • 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 some new filters:
      • 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, ) 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 createSizeCompatiblePixelBuffer method.
      • 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 some new filters
      • 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 the grayToARGB method.
      • 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
    • 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.
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.
    • 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
    • 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
    • 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.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:
      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

See Also