Quantitative Image Analysis
What's new in Version 1.0.0?
First of all, it is probably time to drop the "beta". Crystal Image has gone through
nine revisions since it was published as v.0.9.0 in 2011 when Advanced Biomedical
Image Analysis was published. Initially, I created about two releases per year,
but this has now dropped to one release per year, which indicates a certain level of
maturity. There are still functions in need of development or improvement, such as
the wavelet-based filters, the snake function, or some segmentation algorithms.
There are probably still a large number of undiscovered bugs, and the code is
full of comments that this or that section needs cleaning-up. In this respect, Crystal
Image is still evolving.
However, I have used this software in class and for my own image processing needs over
the last five years, and I found that it suits my needs very well. Thus, I do no longer
consider it "beta".
New features (combined with major bug fixes into one list):
- RGB-to-HSV conversion now available in macro function convert_image function.
- Massive overhaul of the Fourier filter GUI and implementation. Some specific items:
- "Order" slider is now integer.
- The confusing "Gain" slider was removed, the gain is fixed to unity.
- Modified the computation of the data logarithm (used for homomorphic filtering).
The log computation uses a suitable offset to avoid large, negative numbers.
Homomorphic filtering now has considerably improved quality.
- Modified the windowing functions (this is more of a bug fix).
- Added a Wiener filter function with variable denominator offset
- Added the Oppenheim highpass that is suggested by Erik Reinhard et al. for
high dynamic range tone mapping (see: Reinhard E, Ward G, Pattanaik S, Debevec P.
High Dynamic Rainge Imaging, Morgan Kaufmann, 2006)
- Added a first-derivative filter with variable high-frequency rolloff similar to
the Shepp-Logan kernel for the filtered backprojection in CT.
- Unified the GUI for the "generator" module with the Fourier filter module.
- Massive overhaul of the discrete wavelet transform and wavelet filter functions.
Some specific items:
- Removed dyadic decomposition of the L/H and H/L regions
- Filter functions are now continuously using double-precision data instead of
truncating back to single-precision. This results in a major improvement of
the quality of coefficient shrinking algorithms.
- Fixed some problems with threshold finding for SUREshrink and GCV
(Note that BayesShrink is still unreliable and depends on the image value range)
- Added the explicit DWT and IDWT to the Process menu. Also added the DWT macro function
to the main codebase. Therefore, the wavelet DSO module is now obsolete and has
- Improved wavelet-based background removal (try it, seems to deliver really good results!)
- Added two experimental wavelet-based highpass/sharpening formulations
- Improved the action of the AMMSE (adaptive minimum mean-squared error) filter. The AMMSE filter
has dramatically strengthened action and now also features an adjustable strength parameter.
- Circular ROI now features a size-adaptive number of vertices, which reduces the polygonal
appearance for large diamters
- Generator module: Unfied the GUI for creation of Fourier filter functions with the FFT filter
module. Now, all available filter functions can be generated and visualized.
- In the same function: Added option to visualize the windowing functions as well.
- Watershed: Added function to generate the SKIZ (SKeleton inf Influence Zone)
- Fractal dimension estimators: Significant overhaul of the GUI with improved instructions,
dyadic size selections (depends on estimator notion). Fixed some problems with the
- Fixed some inconsistency in the log and log-abs contrast modes in the colormap window.
- Also, fixed inconsistent treatment of log and log-abs between colormap view and
the "created" secondary window.
- Bug or feature? Propagated syntax highlighting for the kate editor to 16.04, which
changed the location of the syntax files *again*
- The GL-based image viewer is now available in the settings by default
What's new in Version 0.9.9?
- Fixed a problem with rescaling of the discrete Hartley transform
- Added numerous tooltips
- Minor improvements to the snake funcions
- Added a range filter rescaling option to the adaptive bilateral filter, which makes the range filter
independent of the image value range
What's new in Version 0.9.8?
Note: This version (build date of May 2015) still had a bug in the macro interpreter
that caused the operands of a division or subtraction to be swapped. This is a minor change,
and I decided not to advance the version number. I have rebuilt the binary, which now has a
build date of June 2015. Please update if you have the older 0.9.8 binary.
- Ensured that cimage compiles and runs on 15.04
- Fixed a bug which caused the operands of subtractions and divisions to be swapped
- Fixed a bug in image math that caused a crash when main and secondary images were exchanged
- Optional pixel rulers above and to the left of the main image
- Function to display intensity in logarithmic scale now includes a log-abs function for FFT and similar
- New Image Math function to display the joint histogram of two equal-size images (presently limited to 256 bins)
- New Image Math function to compute ln(A/B) specifically for absorbance in x-ray projection images
- Improved the adaptive thresholding function:
- Slightly improved speed of adaptive ISODATA
- Now using circular instead of rectangular local neighborhoods for ISODATA and moving window
- Added a fast FFT-based unsharp masking computation for the threshold map
- Added local adaptive version of Otsu's method. Moderately fast, surprisingly.
- Added optional Gaussian smoothing of the threshold map
- Fixed a bug with RGB handling
- Connected the adaptive threshold to the macro interpreter
- Removed the "Release Notes" menu item. Did anybody really read this anyway?
- Connected the 2D graph display to Gnuplot for better publication-quality plots
- Also, the 2D plot function can now plot log scale or log-log scale
- Overhaul of the fractal dimension GUI with tooltips and explanations
- Fractal dimension plots are now in log-log scale where appropriate
- Crystal Image now has a rudimentary read function for the Compix SimplePCI format (.cxd files).
In the process, the Astrophysics .wim format has been removed from the core and moved into
The new .cxd import function is still highly experimental.
What's new in Version 0.9.7?
- Fixed minor issues with the NetPBM read and write functions
- Fixed some minor inconsistencies between image/image operations in image math and the macro interpreter
- Fixed generation of images with fractional Brownian surfaces (now true 2D generation)
- Fixed nasty little bug that made a ROI with ctrl-a always square
- Fixed bug in the inverse line Hough transform
- Revised some sections of the Snake algorithm. Most importantly,
- Fixed problem with circuiar ROI
- Improved convergence with GVF
- Improved GVF-related parts of the GUI
- Fixed a minor bug that caused some macro-generated images to have incorrect min/max values
and thus bad contrast.
- Updated the syntax highlighting file that can be used with KDE's kate editor. Note: This file needs to
be installed manually.
- Fixed dependendcy on libfftw3-double3 of the .deb package. The binaries should
now install on 14.04 and 14.10 machines.
- Can somebody tell me why the TIFF library, version 4.0.x is now called 'libtiff5'?
(fixed this dependency, too.)
- Added a function to remove features from binary images that touch the image boundary
- Added logarithmic histogram scaling, tooltips for histogram functions, and better bin selection
- Added visualization/colormap function to display intensity in logarithmic scale
- Major reorgainzation of the wavelet functions:
- Moved the wavelet transform functions into the core of the codebase
- Moved wavelet shrinking functions into the core of the codebase
- Corrected some mistakes in the threshold finding algorithm
- Added a 1D denoising function as internal utility function
- Added wavelet-based image denoising as one-step process (now under process/filter)
- Added a WVDENOISE macro function
What's new in Version 0.9.6?
- Fixed segfault in the save function of the secondary image when the image format (such as png)
was not specified
- Fixed font issue in histogram caused by deprecated gdk_draw_string in the GTK library
- Fixed a few more Pango-related minor issues
- Fixed something (I don't recall what) in the cluster labeling algorithm
- Fixed default settings for 3D viewer. The 3D viewer now defaults to the GL version
(cimage_sv) as it should.
- Included the meshextract module as published in Madison A and Haidekker MA,
A Completely Open-Source Finite
Element Modeling Chain for Tubular Tissue-Engineered Constructs, Int.J.Comp.Syst.Appl.
2012; 1(2): 44--55. (open access publication)
- Image math now can merge image slices with stacks
- A cleanup function in binary images removes all features that touch the boundary
- Histogram now has an ImageJ-style graytone bar
- For builders: Created an "includeall.h" for the modules so that individual header files
from the base system no longer need to be included.
- Tested on Ubuntu 13.04
What's new in Version 0.9.5?
- Fixed segmentation fault issue with the -m command line option
- Fixed incorrect calculation of the standard deviation in several parts of the program
- Fixed occasional weird crashes at the end of a macro run
What's new in Version 0.9.4?
- Hill-climbing segmentation as proposed by Bankmann et al, IEEE Trans Inform Techn Biomed 1997; 1: 141-9.
- Fixed the command entry line in macro "immediate execution" mode
- Fixed some mysterious crashes when image windows were repeatedly opened and closed
What's new in Version 0.9.3?
- In the macro interpreter, the cluster labeling functions now return the number of clusters
- Cluster labeling now has a new feature that allows labeling by size (in addition to labeling
by size rank). This new feature affects the labelopts parameter of the cluster2d
function in the macro interpreter (see Advanced Biomedical Image Analysis, pg. 489):
- 0: Label by size rank
- 1: Pure binary image output
- 2: Label by size
- 3: Label by compactness
- 4: Label by aspect ratio
- 5: Label by irregularity
- Added a rudimentary distance measurement function
- Updated the file selection dialog. Cimage now "remembers" the directory it last used and
selects this directory as default for all subsequent file dialogs. A major element of
inconvenience finally removed!
- Fixed a bug that caused cimage to crash in the macro interpreter when the "foreach" statement
was used with all three parameters, but the third parameter pointed to a non-existent
- Fixed a bug that caused undefined shadow images to appear if the substack function was used on
a single-slice image, or if the substack went beyond the stack bounds.
- Fixed a bug that caused cimage to crash in the skeletonization function whenever a tabular
description was requested
- Now using Pango for axis labels in graph function (compatible with Ubuntu 11.10)
What's new in Version 0.9.2?
This version is mainly a bug fix version. List of bugfixes:
- Fixed bug in the parameter entry window for skeletonization
- Some background removal functions "hang" when a zero window was accidentally
selected. A zero window size is no longer allowed (and doesn't make sense, anyway)
- Fixed a crash that occurred when using undo in memory.
- Cluster counting now reacts properly to changes in the parameter window
- Crashes in Open Multiple have been fixed.
- Some helper functions have been removed, and Crystal Image
now relies on GSL.
- Fixed segfault in the CWM filter when debuglevel > 1
- Fixed issue with phantom windows when new images are opened before the
old ones were closed (mainly with DICOM)
- Fixed ambiguous pixel selection in sign-symmetric threshold functions
- Fixed Fourier filter preview function
- Fixed minor issues with RGB interpolation
- Fixed crash issues in timecourse dso
- Added saturation functions to threshold
- Added main window zoom function
- Added a fast lacunarity function to the fractal measurements