Image representation in ImageJ

imagej
matlab

#1

Hi there,

In Matlab a image is represented by a 2D array (Matrix). Similar in ImageJ how a image is represented? I hope you got the question.

Best


#2

Good day,

I fear there are not many alternatives to 2D arrays …

AFAIK, Matlab follows a different convention regarding the orientation of the y-axis.

ImageJ: down = positive (can be changed in the options section)
Matlab: up = positive

Because ImageJ is open source you, may investigate the whole source code and convince yourself.

Regards

Herbie


#3

Thank you very much. :slight_smile:


#4

In fact, ImageJ1 internally represents each image plane as a 1-dimensional array of values, together with the information of width and height to display it. See for example the source code of ByteProcessor:

You won’t find a 2D array in the Java source of imagej/imagej1 to represent image data, if I am not mistaken.

The reason for using 1-dimensional array is because, in Java, processing these (i.e. iterating over the pixels) is much more performant than processing 2-dimensional or multi-dimensional arrays.


For ImageJ2 (which is included in the Fiji distribution, and is backed by ImgLib2 data structures), the internal representaion of an image varies depending on which type of Img implementation is used (from the javadoc):

  • ArrayImg

    This Img stores an image in a single linear array of basic types.

  • PlanarImg

    A NativeImg that stores data in an list of primitive arrays, one per image plane.
    The PlanarImg provides access to the underlying data arrays via the getPlane(int) method.

  • CellImg

    Img types that divide their underlying data into cells.

  • NTreeImg

    This is used for sparse data representations, e.g. sparse labelings; see this topic for some discussion.

For general information about ImgLib2, see also the publication:

ImgLib2 - generic image processing in Java
https://doi.org/10.1093/bioinformatics/bts543


#5

Dear Jan,

these are ways of realizing 2D arrays. But in fact we speak of an image matrix, independent of the way it is internally realized.

BTW, the advantage of 1D arrays over 2D arrays very much depends on the compiler/interpreter. But I must admit that I have no idea how the current Java-machines rank with this respect.

Thanks anyway for your detailed contribution

Herbie


#6

Please note that this is incorrect. For images, Matlab uses the same convention as ImageJ and other image processing tools:

For pixel indices, the row increases downward, while the column increases to the right. Pixel indices are integer values, and range from 1 to the length of the row or column.

See https://www.mathworks.com/help/images/image-coordinate-systems.html

Note however that the row and column counting are different. Matlab starts counting with 1, while ImageJ (and most programming languages) use 0-based indices for arrays as well as images.


#7

Dear Jan,

my memory seems to vanish. What I had in mind was this thread on the list:
http://imagej.1557.x6.nabble.com/Problem-with-ImageJ-and-Matlab-image-analysis-td5019978.html

Because I never used Matlab I could not check it myself and so I wrote “AFAIK”. However, the above thread doesn’t actually state what I thought to remember.

Sorry for the confusion

Herbie

PS:
Just for the record, here is another post
http://forum.image.sc/t/convert-imagelib-image-to-matlab-and-vice-versa/5232/5?u=herbie
that deals with images in Matlab and ImageJ. It appears to conform with the list posts linked above.


#8

Thank you very much guys. for this valuable discussion. I hope this will help lot of guys…!