Open-source project
imagej/imagej2 avatar
imagej/imagej2

ImageJ2: the N-dimensional rebuild of ImageJ, and when to use it

Open scientific N-dimensional image processing :microscope: :sparkler:

1,405 stars350 forksJavaBSD-2-Clause

At a glance

What is it?
ImageJ2 is a scientific imaging application and Java library that replaces ImageJ's flat image model with an N-dimensional one driven by ImgLib2, while staying compatible with the original ImageJ user interface. It is a library-first project, not a downloaded desktop app for most users.
Who is it for?
Adopt ImageJ2 as a library if you are writing Java, Python or JavaScript code that needs N-dimensional image processing and you want the same commands to run headless on a server. Do not adopt it if what you actually want is a desktop application with a plugin menu: the README points users to the ImageJ wiki and to Fiji, and this repository is the application assembly plus the net.imagej:imagej artifact.
Can I use it commercially?
Yes. BSD-2-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 42 days ago.
What is it written in?
Mainly Java, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem ImageJ2 was written to solve

The original ImageJ application has a fixed idea of what an image is. ImageJ2 exists to break that idea open. The README states the central goal plainly: to broaden the paradigm of ImageJ beyond the limitations of the original ImageJ application, so that a wider range of multidimensional scientific image data is supported. If your data has more axes than x, y and a channel, or if the pixel type is something other than the eight and sixteen bit integers the original tool assumed, that is the gap this project addresses.

The intended audience is not someone who wants to click through a menu. It is developers and computational scientists who need image processing as a component inside something else. The README lists the contexts explicitly: headless in the cloud, on a server such as OMERO, inside another Java application such as KNIME or Icy, or from Python-based applications such as CellProfiler and napari through PyImageJ. That list tells you where the project's centre of gravity sits. The desktop application still exists, but the design decisions are made for embedding.

How the N-dimensional data model and UI separation work

Two architectural choices define ImageJ2. The first is the data model. Image data is handled by ImgLib2, which the README describes as supporting image data expressed in an extensible set of numeric and non-numeric types, accessed from an extensible set of data sources. The word extensible is doing real work here: the axis count and the pixel type are not baked into the core. A dataset with a time axis and three spatial axes is the normal case rather than a special case.

The second choice is the separation of processing logic from the user interface. The README says ImageJ2 completely isolates the image processing logic from the graphical user interface, which is what allows the same commands to run in a headless server context or inside a host application. This is the mechanism behind the portability claims. It is also the source of the project's main structural cost, because that separation has to be maintained across every plugin.

Backwards compatibility is handled by integration rather than by a fork. ImageJ2 is designed to fully integrate into the original ImageJ user interface, so existing users keep working the way they already do while new features become available. The repository itself is the assembly point: it depends on ImageJ Common, ImageJ Legacy, ImageJ Ops, ImageJ Updater, ImgLib2, SCIFIO and SciJava Common, each in its own repository, and pulls in plugin components such as ImageJ Scripting at runtime. Reading the dependency list is the fastest way to understand that this repository is a distribution, not a monolith.

Installing ImageJ2 as a Maven dependency

The README gives one concrete installation path for developers: Maven. The artifact is net.imagej:imagej, and the recommended setup inherits from the pom-scijava parent. Adding the dependency without a version is possible only because the parent supplies dependency management. The README warns that if you do not inherit from pom-scijava you must include the version yourself, and that you may hit a documented Maven bug regarding the versions of ImageJ2's dependencies that you inherit. Take that warning seriously; it is the difference between a clean build and a dependency conflict.

xml
<parent>
  <groupId>org.scijava</groupId>
  <artifactId>pom-scijava</artifactId>
  <version>45.0.0</version>
</parent>
...
<dependency>
  <groupId>net.imagej</groupId>
  <artifactId>imagej</artifactId>
</dependency>

After a successful build you should see the ImageJ2 and SciJava artifacts resolved into your local repository and on your classpath. From there you construct an ImageJ context in code and invoke commands; the README does not walk through that first invocation, so the ImageJ wiki is the place to look for the command API rather than this repository's README.

If Java is not your language, the README names the alternatives directly. Python uses the PyImageJ module on PyPI, or Appose to call ImageJ2 as a separate process. JavaScript uses the imagej module on npm for in-process calls from node.js. Ruby, R and other Truffle-based languages go through GraalVM. For web services there is ImageJ Server, reachable over a RESTful API. Each of these is a different repository or package, and none of them is covered by install steps in this README.

Where ImageJ2 is the wrong tool

The most common mistake is treating this repository as the thing you download to analyse an image. It is not. There is no install section for an end user here, no release download link, and no instructions for getting a desktop application onto a laptop. The README points outward to the ImageJ wiki and to the ImageJ2 software page for that. If your goal is to open a microscopy file and click through a segmentation, you are in the wrong repository, and the search phrase that brings people here is usually the one that leads them astray.

The second limitation is the dependency surface. A project that depends on seven lower-level components plus a set of runtime plugins inherits every one of their release cycles and compatibility constraints. The README's own warning about Maven version resolution is a symptom, not an edge case. Teams that pin versions loosely will feel this. Teams that inherit pom-scijava are trading control of those versions for stability, which is a reasonable trade but still a trade.

Third, the backwards compatibility story cuts both ways. Integrating into the original ImageJ user interface means carrying the original ImageJ's assumptions along. That is exactly what makes migration gradual, and it is also why the legacy layer exists as a separate repository you cannot simply ignore.

ImageJ2 compared with Fiji and the original ImageJ

The three names get conflated constantly, and the difference is one of layer, not of feature list. The original ImageJ is the application that ImageJ2 was written to extend beyond. ImageJ2 is the rewrite with the N-dimensional ImgLib2 data model and the UI-independent command layer, and it is designed to run inside the original ImageJ interface rather than replace it outright. Fiji is a distribution that bundles ImageJ with a curated set of plugins and update sites, and the README lists it among the projects ImageJ2 collaborates with rather than as a competitor.

Practically, that means the choice is about what you are building. If you are writing software that must process multidimensional data headlessly, the relevant comparison is between ImageJ2's command layer and whatever imaging library you would otherwise assemble yourself, and the README's argument is that SCIFIO, ImgLib2 and Ops already cover the format reading, data model and operation layers. If you are a bench scientist who needs a working application today, the distribution route is the shorter path, and the ImageJ2 README does not ask you to take the longer one.

Maintenance, licensing and what an upgrade costs

The repository is not archived, and the last push was on 2026-08-07. That is recent enough that the codebase is moving, but the README gives no release notes and no versioning policy, so the practical upgrade signal is the dependency graph rather than a changelog in this repository. ImageJ2's version is managed through pom-scijava, and the README's example pins that parent at 45.0.0. Bumping that single version moves ImageJ2 and its lower-level components together, which is convenient when it works and opaque when it does not: you are upgrading ImageJ Common, ImageJ Ops, ImgLib2, SCIFIO and SciJava Common in one step, and the README does not document rollback for that.

Licensing is straightforward to state and worth stating precisely. ImageJ2 is distributed under a Simplified BSD License, and the full text lives in LICENSE.txt at the repository root. That is a permissive licence, which matters if you are embedding the library in a commercial product, but the dependency list means the licence that governs your build is the union of the licences of everything you pull in, not just this one. Check the licences of the lower-level components you actually resolve rather than assuming they match. This is a description of what the repository says, not legal advice; if the distinction matters to your organisation, have someone qualified read LICENSE.txt and the dependency licences.

Editorial conclusion

Adopt ImageJ2 as a library if you are writing Java, Python or JavaScript code that needs N-dimensional image processing and you want the same commands to run headless on a server. Do not adopt it if what you actually want is a desktop application with a plugin menu: the README points users to the ImageJ wiki and to Fiji, and this repository is the application assembly plus the net.imagej:imagej artifact. Before committing, verify which entry point matches your workflow (Maven dependency, PyImageJ, the npm imagej module, or ImageJ Server), and check the pom.xml for the exact dependency set you will inherit.

Frequently asked questions

What is ImageJ used for?

The README describes ImageJ2 as a rewrite of the original ImageJ for multidimensional image data, with a focus on scientific imaging. Its stated goal is to support a wider range of multidimensional scientific image data than the original application could.

Is ImageJ hard to learn?

The README does not address the learning curve. It does state that ImageJ2 is designed to fully integrate into the original ImageJ user interface, so users can keep using ImageJ in familiar ways while migrating to new features as needed.

Is ImageJ Fiji free?

The README does not state pricing for Fiji. It lists Fiji among the projects ImageJ2 collaborates with, and states that ImageJ2 itself is distributed under a Simplified BSD License with the full text in LICENSE.txt.

Which version of Fiji should I download?

The README gives no guidance on choosing a Fiji version. It only lists Fiji as a collaborating project and points to the ImageJ wiki for more details on the project.

What is the difference between ImageJ, ImageJ2 and Fiji?

ImageJ2 is a rewrite of the original ImageJ for multidimensional data, and it is designed to fully integrate into the original ImageJ user interface for backwards compatibility. Fiji is listed in the README as a collaborating project rather than as a version of ImageJ2.

Official sources

  1. imagej/imagej2 on GitHub
  2. Issues
  3. License: BSD-2-Clause
  4. Project website
  5. README
Community notes

Community notes