CINXE.COM

Creating Imglib2 images in MATLAB

<!DOCTYPE html> <html> <head> <title>Creating Imglib2 images in MATLAB</title> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=3" /> <meta content="ImageJ Wiki" property="og:site_name"> <meta content="Creating Imglib2 images in MATLAB" property="og:title"> <meta content="article" property="og:type"> <meta content="The ImageJ wiki is a community-edited knowledge base on topics relating to ImageJ, a public domain program for processing and analyzing scientific images, and its ecosystem of derivatives and variants, including ImageJ2, Fiji, and others." property="og:description"> <meta content="https://imagej.github.io/libs/imglib2/matlab" property="og:url"> <meta content="https://imagej.github.io/media/icons/imagej2.png" property="og:image"> <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> <link rel="manifest" href="/site.webmanifest"> <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="theme-color" content="#ffffff"> <link rel="stylesheet" href="/assets/css/lightbox.min.css" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/instantsearch.css@7/themes/algolia-min.css"/> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/dygraphs@2.1.0/dist/dygraph.min.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/dygraphs@2.1.0/dist/dygraph.min.css" /> <link rel="stylesheet" href="/assets/css/main.css" /> <link rel="stylesheet" href="/assets/css/layout.css"/> <link rel="stylesheet" href="/assets/css/includes.css" /> <link rel="stylesheet" href="/assets/css/timeline.css"/> <link rel="stylesheet" href="/assets/css/dock.css"/> <noscript><link rel="stylesheet" href="/assets/css/noscript.css" /></noscript> <link rel="stylesheet" href="/assets/css/page.css" /> </head> <body class="is-preload"> <!-- Top bar --> <section id="top-bar"> <a href="/"><img id="site-logo" src="/media/icons/imagej2.png"></a> <div id="search-panel"> <div id="search-box"></div> </div> </section> <!-- Page-info --> <div class="page-info"> <a href="https://github.com/imagej/imagej.github.io/commits/main/_pages/libs/imglib2/matlab.md">Page history</a> <a href="https://github.com/imagej/imagej.github.io/edit/main/_pages/libs/imglib2/matlab.md">Edit this page</a> <a href="/editing">How do I edit this website?</a><br><a href="https://imagej.net/imagej-wiki-static/Creating_Imglib2_images_in_MATLAB">Original MediaWiki page</a></div> <section id="left-column" class="sidebar dock"> <!-- Menu --> <div class="menu dockable"> <div class="drag-handle"></div><h3>ImageJ Docs</h3> <ul> <li><a href="/downloads">Download</a></li> <li><details><summary>Learn</summary><ul> <li><details><summary><a href="/learn">ImageJ Basics</a></summary><ul> <li><a href="/tutorials">Tutorials</a></li> <li><a href="/learn/user-guides">User Guides</a></li> <li><a href="/learn/keyboard-shortcuts">Keyboard Shortcuts</a></li> <li><a href="/learn/tips-and-tricks">Tips and Tricks</a></li> <li><a href="/learn/troubleshooting">Troubleshooting</a></li> <li><a href="/learn/faq">Frequently Asked Questions</a></li> <li><details><summary><a href="/platforms">Supported Platforms</a></summary><ul> <li><a href="/platforms/windows">Windows</a></li> <li><a href="/platforms/macos">MacOS</a></li> <li><a href="/platforms/linux">Linux</a></li> <li><a href="/platforms/pi">Raspberry Pi</a></li> <li><a href="/platforms/android">Android</a></li> </ul></details></li> <!-- Learn/ImageJ Basics/Supported Platforms --> <li><details><summary><a href="/formats">File Formats</a></summary><ul> <li><a href="/formats/bio-formats">Bio-Formats</a></li> <li><a href="/formats/video">Video formats</a></li> <li><a href="/formats/quicktime">QuickTime</a></li> <li><a href="/formats/tiff">TIFF</a></li> <li><a href="/formats/pdf">PDF</a></li> <li><a href="/formats/dicom">DICOM</a></li> <li><a href="/formats/lsm">Zeiss LSM</a></li> <li><a href="/formats/olympus">Olympus VSI</a></li> <li><a href="/formats/lurawave">Opera Flex</a></li> <li><a href="/formats/fib-sem">FIB-SEM</a></li> </ul></details></li> <!-- Learn/ImageJ Basics/File Formats --> </ul></details></li> <!-- Learn/ImageJ --> <li><details><summary><a href="/imaging">Scientific Imaging</a></summary><ul> <li><a href="/imaging/principles">Principles of Scientific Imaging</a></li> <li><a href="/imaging/annotating-images">Annotating Images</a></li> <li><a href="/imaging/colocalization-analysis">Colocalization</a></li> <li><a href="/imaging/color-image-processing">Color Image Processing</a></li> <li><a href="/imaging/deconvolution">Deconvolution</a></li> <li><a href="/imaging/image-intensity-processing">Image Intensity Processing</a></li> <li><a href="/imaging/particle-analysis">Particle Analysis</a></li> <li><a href="/imaging/registration">Registration</a></li> <li><a href="/imaging/segmentation">Segmentation</a></li> <li><a href="/imaging/stack-slice-manipulations">Stack-slice Manipulations</a></li> <li><a href="/imaging/t-functions">T-functions</a></li> <li><a href="/imaging/tracking">Tracking</a></li> <li><a href="/imaging/visualization">Visualization</a></li> <li><a href="/imaging/z-functions">Z-functions</a></li> </ul></details></li> <!-- Learn/Scientific Imaging --> </ul></details></li> <!-- Learn --> <li><details><summary><a href="/plugins">Extend</a></summary><ul> <li><a href="/list-of-extensions">List of Extensions</a></li> <li><details><summary><a href="/update-sites">Update Sites</a></summary><ul> <li><a href="/list-of-update-sites">List of Update Sites</a></li> <li><a href="/update-sites/following">Following an Update Site</a></li> <li><a href="/update-sites/setup">Creating an Update Site</a></li> <li><a href="/update-sites/tos">Terms of Service</a></li> <li><a href="/update-sites/automatic-uploads">Automatic Upload</a></li> <li><a href="/update-sites/core-uploads">Uploading to Core Sites</a></li> <li><a href="/update-sites/faq">Update Sites FAQ</a></li> <li><a href="/update-sites/stats">Statistics</a></li> </ul></details></li> <!-- Extend/Update Sites --> <li><details><summary><a href="/scripting">Scripting</a></summary><ul> <li><a href="/scripting/basics">Scripting Basics</a></li> <li><a href="/scripting/script-editor">Script Editor</a></li> <li><a href="/scripting/parameters">Parameters</a></li> <li><a href="/scripting/user-input">User Input</a></li> <li><a href="/scripting/auto-imports">Auto Import</a></li> <li><a href="/scripting/templates">Templates</a></li> <li><a href="/scripting/batch">Batch Processing</a></li> <li><a href="/scripting/headless">Running Headlessly</a></li> <li><a href="/scripting/comparisons">Scripting Comparisons</a></li> <li><a href="/scripting/toolbox">Toolbox</a></li> <li><details><summary>Languages</summary><ul> <li><a href="/scripting/beanshell">BeanShell Scripting</a></li> <li><a href="/scripting/groovy">Groovy Scripting</a></li> <li><a href="/scripting/macro">ImageJ Macro</a></li> <li><a href="/scripting/javascript">JavaScript</a></li> <li><a href="/scripting/clojure">Lisp (Clojure)</a></li> <li><a href="/scripting/matlab">MATLAB</a></li> <li><a href="/scripting/jython">Python (Jython)</a></li> <li><a href="/scripting/python">Python (native)</a></li> <li><a href="/scripting/renjin">R (Renjin)</a></li> <li><a href="/scripting/jruby">Ruby (JRuby)</a></li> <li><a href="/scripting/scala">Scala Scripting</a></li> </ul></details></li> <!-- Extend/Scripting/Languages --> </ul></details></li> <!-- Extend/Scripting --> <li><details><summary><a href="/develop">Development</a></summary><ul> <li><a href="/develop/philosophy">Philosophy</a></li> <li><a href="/develop/architecture">Architecture</a></li> <li><a href="/develop/source">Source code</a></li> <li><a href="/develop/project-management">Project management</a></li> <li><a href="/develop/coding-style">Coding style</a></li> <li><a href="/develop/javadoc">Using Javadoc</a></li> <li><a href="/develop/debugging">Debugging</a></li> <li><a href="/develop/wish-list">Wish list</a></li> <li><details><summary>Tools</summary><ul> <li><a href="/develop/github">GitHub</a></li> <li><a href="/develop/maven">Maven</a></li> <li><a href="/develop/ci">CI/CD</a></li> <li><a href="/develop/dotfiles">Dotfiles</a></li> <li><details><summary><a href="/develop/ides">IDEs</a></summary><ul> <li><a href="/develop/eclipse">Eclipse</a></li> <li><a href="/develop/netbeans">NetBeans</a></li> <li><a href="/develop/intellij">IntelliJ IDEA</a></li> <li><a href="/develop/command-line">Command Line</a></li> </ul></details></li> </ul></details></li> <!-- Extend/Development/Tools --> <li><details><summary>Guides</summary><ul> <li><a href="/develop/plugins">Writing plugins</a></li> <li><a href="/develop/improving-the-code">Contributing to a plugin</a></li> <li><a href="/develop/releasing">Development lifecycle</a></li> <li><a href="/develop/building-a-pom">Building a POM</a></li> <li><a href="/develop/debugging-exercises">Hands-on debugging</a></li> <li><a href="/develop/writing-ops">Adding new ops</a></li> <li><a href="/develop/formats">Adding new formats</a></li> <li><a href="/develop/native-libraries">Using native libraries</a></li> <li><a href="/develop/tips">Tips for developers</a></li> <li><a href="/develop/cpp-tips">Tips for C++ developers</a></li> <li><a href="/develop/ij1-plugins">ImageJ 1.x plugins</a></li> <li><a href="/develop/versioning">Versioning</a></li> <li><a href="/develop/logging">Logging</a></li> <li><a href="/develop/uber-jars">Uber-JARs</a></li> </ul></details></li> <!-- Extend/Development/Guides --> <li><details><summary><a href="/develop/git">Git</a></summary><ul> <li><a href="/develop/git/eclipse">Git in Eclipse (EGit)</a></li> <li><a href="/develop/git/mini-howto">Git mini howto</a></li> <li><a href="/develop/git/workshop">Git workshop</a></li> <li><a href="/develop/git/conflicts">Git conflicts</a></li> <li><a href="/develop/git/topic-branches">Git topic branches</a></li> <li><a href="/develop/git/notes">Git notes</a></li> <li><a href="/develop/git/reflogs">Git reflogs</a></li> <li><a href="/develop/git/submodules">Git submodules</a></li> <li><a href="/develop/git/pinpoint-regressions">How to pinpoint regressions</a></li> <li><a href="/develop/git/publish-a-repository">How to publish a git repository</a></li> <li><a href="/develop/git/extract-a-subproject">How to extract a subproject</a></li> </ul></details></li> <!-- Extend/Development/Git --> </ul></details></li> <!-- Extend/Development --> </ul></details></li> <!-- Extend --> <li><details><summary><a href="/contribute">Contribute</a></summary><ul> <li><a href="/contribute/citing">Citing</a></li> <li><a href="/people">Contributors</a></li> <li><a href="/orgs">Organizations</a></li> <li><a href="/contribute/governance">Governance</a></li> <li><a href="/contribute/funding">Funding</a></li> <li><a href="/contribute/fiji">Contributing to Fiji</a></li> <li><details><summary><a href="/licensing">Licensing</a></summary><ul> <li><details><summary><a href="/licensing/open-source">Open Source</a></summary><ul> <li><a href="/licensing/apache">Apache</a></li> <li><a href="/licensing/bsd">BSD</a></li> <li><a href="/licensing/epl">EPL</a></li> <li><a href="/licensing/gpl">GPL</a></li> <li><a href="/licensing/lgpl">LGPL</a></li> <li><a href="/licensing/mit">MIT</a></li> <li><a href="/licensing/public-domain">Public domain</a></li> <li><a href="/licensing/big">BIG</a></li> </ul></details></li> <!-- Contribute/Licensing/Open Source --> <li><a href="/licensing/closed-source">Proprietary</a></li> </ul></details></li> <!-- Contribute/Licensing --> <li><details><summary><a href="/editing">Editing the Wiki</a></summary><ul> <li><a href="/editing/advanced">Advanced Editing</a></li> <li><a href="/editing/buttons">Buttons</a></li> <li><a href="/editing/citations">Citations</a></li> <li><a href="/editing/code">Source Code</a></li> <li><a href="/editing/debugging">Debugging</a></li> <li><a href="/editing/headers">Headers</a></li> <li><a href="/editing/icons">Icons</a></li> <li><a href="/editing/images">Images</a></li> <li><a href="/editing/keys">Keyboard Shortcuts</a></li> <li><a href="/editing/linking">Linking</a></li> <li><a href="/editing/math">Math Expressions</a></li> <li><a href="/editing/menu-paths">Menu Paths</a></li> <li><a href="/editing/navigation">Navigation</a></li> <li><a href="/editing/notices">Notices</a></li> <li><a href="/editing/people">People</a></li> <li><a href="/editing/pitfalls">Pitfalls</a></li> <li><a href="/editing/quizzes">Quizzes</a></li> <li><a href="/editing/statbox">Statbox</a></li> <li><a href="/editing/symbols">Symbols</a></li> <li><a href="/editing/tables">Tables</a></li> <li><a href="/editing/timelines">Timelines</a></li> <li><a href="/editing/tooltips">Tooltips</a></li> <li><a href="/editing/videos">Videos</a></li> <li><a href="/editing/whitespace">Whitespace</a></li> </ul></details></li> <!-- Contribute/Editing the Wiki --> </ul></details></li> <!-- Contribute --> <li><details><summary><a href="/discuss">Discuss</a></summary><ul> <li><a href="/discuss/bugs">Reporting Issues</a></li> <li><a href="/discuss/mailing-lists">Mailing Lists</a></li> <li><a href="/discuss/chat">Chat</a></li> </ul></details></li> <!-- Discuss --> <li><details open><summary>Explore</summary><ul> <li><a href="/news">News</a></li> <li><details><summary><a href="/events">Events</a></summary><ul> <li><a href="/events/presentations">Presentations</a></li> <li><a href="/events/conferences">Conferences</a></li> <li><a href="/events/hackathons">Hackathons</a></li> <li><a href="/events">More...</a></li> </ul></details></li> <!-- Discuss/Events --> <li><details open><summary><a href="/libs">Libraries</a></summary><ul> <li><a href="/libs/imagej-ops">ImageJ Ops</a></li> <li><a href="/libs/imagej-common">ImageJ Common</a></li> <li><a href="/libs/imagej-legacy">ImageJ Legacy</a></li> <li><a href="/libs/scijava">SciJava</a></li> <li><a href="/libs/scifio">SCIFIO</a></li> <li><details open><summary><a href="/libs/imglib2">ImgLib2</a></summary><ul> <li><a href="/libs/imglib2/getting-started">Getting Started</a></li> <li><a href="/libs/imglib2/accessors">Accessors</a></li> <li><a href="/libs/imglib2/accessibles">Accessibles</a></li> <li><a href="/libs/imglib2/examples">Examples</a></li> <li><a href="/libs/imglib2/workshop-introductory">Introductory Workshop</a></li> <li><a href="/libs/imglib2/workshop-advanced">Advanced Workshop</a></li> <li><a class="current-page">ImgLib2 images in MATLAB</a></li> <li><a href="/libs/imglib2/benchmarks">Benchmarks</a></li> <li><a href="/libs/imglib2/faq">FAQ</a></li> <li><a href="/libs/imglib2/developing">Developing ImgLib2</a></li> <li><a href="/libs/imglib2/discussion">ImgLib2 Discussion</a></li> </ul></details></li> <!-- Explore/Libraries/ImgLib2 --> <li><a href="/libs">More...</a></li> </ul></details></li> <!-- Explore/Libraries --> <li><details><summary><a href="/software">Software</a></summary><ul> <li><a href="/software/nih-image">NIH Image</a></li> <li><a href="/software/imagej">ImageJ</a></li> <li><a href="/software/imagej2">ImageJ2</a></li> <li><a href="/software/fiji">Fiji</a></li> <li><a href="/software">More...</a></li> </ul></details></li> <!-- Explore/Software --> </ul></details></li> <!-- Explore --> </ul> </div> </section> <section id="right-column" class="sidebar dock"> <!-- Vital stats --> <!-- Table of contents --> <div id="toc" class="toc menu dockable"> <div class="drag-handle"></div> <h3>Page contents</h3> <ul data-toc="#content" data-toc-headings="h1,h2,h3,h4,h5,h6"></ul> </div> </section> <!-- Page title --> <div class="container"> <header class="major special"> <a class="project-icon shadowed-box" href="/libs/imglib2"><span class="tooltip"><img src="/media/icons/imglib2.png"><span class="tooltiptext" style="top: 80%; left: 25%; width: 20em">This page describes content relating to the ImgLib2 multidimensional image processing library. Click the logo for details.</span></span></a> <h1>Creating Imglib2 images in MATLAB</h1> <span class="project-counterweight"> </span> </header> </div> <!-- Nav bar --> <!-- Main content --> <section id="page" class="main style1"> <div class="container"> <div class="box alt"></div> <div id="content" class="page-content"> <div class="notice" style="font-size: 2; background: #ebf2f8; border-left: 10px solid #67a1fe"><div class="notice-icon"><img src="/media/icons/info.svg" width="32"></div><div class="notice-content"><p>The content of this page has not been vetted since shifting away from MediaWiki. If you’d like to help, check out the <a href="/events/wiki-grand-opening/how-to-help">how to help guide</a>!</p> </div> </div> <p>This page recenses experiments with creating ImgLib2 images from <a href="/scripting/matlab">MATLAB</a>, and then calling ImgLib2 algorithm from <a href="/scripting/matlab">MATLAB</a>. We aim first at showing how to build ImgLib2 types from <a href="/scripting/matlab">MATLAB</a> types, then to do that efficiently. By this we mean having to <b>share</b> a single, massive low level data piece between ImgLib2 and <a href="/scripting/matlab">MATLAB</a>, which is not doable simply due to <a href="/scripting/matlab">MATLAB</a> memory model.</p> <p>All snippets listed here are to be run from <a href="/scripting/matlab">MATLAB</a>. We rely on <a href="/plugins/miji">Miji</a> to set up class path, so you have to start every <a href="/scripting/matlab">MATLAB</a> session with the command</p> <div class="language-matlab highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Miji</span><span class="p">(</span><span class="nb">false</span><span class="p">)</span> </code></pre></div></div> <h2 id="creating-a-new-imglib2-image-in-matlab">Creating a new ImgLib2 image in MATLAB</h2> <p>In <a href="/scripting/matlab">MATLAB</a>, we are limited to native type images (float, uint8, uint16, …) represented as native arrays. The matching ImgLib2 container for this is the <a href="https://github.com/imglib/imglib/blob/master/core/src/main/java/net/imglib2/img/array/ArrayImg.java">ArrayImg</a>.</p> <p>Because ImgLib2 authors wrote nice static utilities, our work is relatively easy. The class <code class="language-plaintext highlighter-rouge">ArrayImgs</code> has all the methods you need, one per native type.</p> <div class="language-matlab highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;&gt;</span> <span class="nb">load</span> <span class="n">clown</span> <span class="o">&gt;&gt;</span> <span class="n">img</span> <span class="o">=</span> <span class="n">net</span><span class="o">.</span><span class="n">imglib2</span><span class="o">.</span><span class="n">img</span><span class="o">.</span><span class="n">array</span><span class="o">.</span><span class="n">ArrayImgs</span><span class="o">.</span><span class="n">doubles</span><span class="p">(</span><span class="n">X</span><span class="p">(:),</span> <span class="nb">size</span><span class="p">(</span><span class="n">X</span><span class="p">));</span> <span class="o">&gt;&gt;</span> <span class="n">net</span><span class="o">.</span><span class="n">imglib2</span><span class="o">.</span><span class="n">img</span><span class="o">.</span><span class="nb">display</span><span class="o">.</span><span class="n">imagej</span><span class="o">.</span><span class="n">ImageJFunctions</span><span class="o">.</span><span class="nb">show</span><span class="p">(</span><span class="n">img</span><span class="p">);</span> <span class="c1">% ImageJ display</span> <span class="o">&gt;&gt;</span> <span class="nb">imshow</span><span class="p">(</span><span class="n">X</span><span class="p">,[])</span> <span class="c1">% [[MATLAB]] display</span> </code></pre></div></div> <p><img src="/media/libs/imglib2/matlabtoimglib2-clown.png" alt="" /></p> <p>We note that the ImageJ display is rotated and flipped regarding the <a href="/scripting/matlab">MATLAB</a> image. This is because <a href="/scripting/matlab">MATLAB</a> arrays are expected to be arranged along columns, whereas Java arrays are arranged along lines. We would need to permute dimension 0 and dimension 1 to display the data in ImageJ as expected in <a href="/scripting/matlab">MATLAB</a>.</p> <p>Note also that the raw data was cast from 64-bit double data to 32-bit float for display. But the source <code class="language-plaintext highlighter-rouge">img</code> has the expected type.</p> <h2 id="matlab-to-imglib2-bridge-functions">MATLAB to ImgLib2 bridge functions</h2> <p>The exacts method in <code class="language-plaintext highlighter-rouge">ArrayImgs</code> depend on the native type you want to use, so you would have to deal with all possible cases. But there is already some <a href="/scripting/matlab">MATLAB</a> functions in Fiji that does that in the <code class="language-plaintext highlighter-rouge">scripts</code> folder of your Fiji installation: <a href="https://github.com/fiji/fiji/blob/master/scripts/copytoImg.m">copytoImg</a> and <a href="https://github.com/fiji/fiji/blob/master/scripts/copytoImgPlus.m">copytoImgPlus</a>. You need therefore to add <code class="language-plaintext highlighter-rouge">scripts</code> to your <a href="/scripting/matlab">MATLAB</a> path, but this is most likely already done since it also contains <code class="language-plaintext highlighter-rouge">Miji</code> which you need to call already.</p> <p>The first function generates a plain <code class="language-plaintext highlighter-rouge">Img</code>. The second one generates and <code class="language-plaintext highlighter-rouge">ImgPlus</code> which allows you specifying the spatial calibration, image name and axis types. Check the help of these functions for details.</p> <h2 id="example-usage">Example usage</h2> <p>Let’s put ImgLib2 to work to filter a source image using anisotropic diffusion:</p> <div class="language-matlab highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">load</span> <span class="n">clown</span> <span class="n">Miji</span><span class="p">(</span><span class="nb">false</span><span class="p">);</span> <span class="n">img</span> <span class="o">=</span> <span class="n">copytoImg</span><span class="p">(</span><span class="n">X</span><span class="p">);</span> <span class="k">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span> <span class="p">:</span> <span class="mi">10</span> <span class="c1">% do it 10 times, in place</span> <span class="n">net</span><span class="o">.</span><span class="n">imglib2</span><span class="o">.</span><span class="n">algorithm</span><span class="o">.</span><span class="n">pde</span><span class="o">.</span><span class="n">PeronaMalikAnisotropicDiffusion</span><span class="o">.</span><span class="n">inFloatInPlace</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="mf">0.15</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span> <span class="k">end</span> <span class="n">net</span><span class="o">.</span><span class="n">imglib2</span><span class="o">.</span><span class="n">img</span><span class="o">.</span><span class="nb">display</span><span class="o">.</span><span class="n">imagej</span><span class="o">.</span><span class="n">ImageJFunctions</span><span class="o">.</span><span class="nb">show</span><span class="p">(</span><span class="n">img</span><span class="p">);</span> </code></pre></div></div> <h2 id="retrieving-the-content-of-an-imglib2-image-in-matlab">Retrieving the content of an ImgLib2 image in MATLAB</h2> <p>Now we want to get the result back in <a href="/scripting/matlab">MATLAB</a>. Since we are using <code class="language-plaintext highlighter-rouge">ArrayImg</code>, we can always access the underlying java primitive array that the <code class="language-plaintext highlighter-rouge">Img</code> wraps, but we still have to keep in mind the X and Y dimension permutation. Also: the wrapped array is a 1D, very long array, that can be looked upon as the row-by-row concatenation of the image content. We have to reshape it in <a href="/scripting/matlab">MATLAB</a> to give the image back its aspect:</p> <div class="language-matlab highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">% Retrieve a copy (see below) of the java primitive array</span> <span class="o">&gt;&gt;</span> <span class="n">I</span> <span class="o">=</span> <span class="n">img</span><span class="o">.</span><span class="n">update</span><span class="p">([])</span><span class="o">.</span><span class="n">getCurrentStorageArray</span><span class="p">;</span> <span class="c1">% Reshape it to match the initial aspect. Careful, we need to remember we permuted X &amp; Y.</span> <span class="o">&gt;&gt;</span> <span class="n">J</span> <span class="o">=</span> <span class="nb">reshape</span><span class="p">(</span><span class="n">I</span><span class="p">,</span> <span class="nb">size</span><span class="p">(</span><span class="n">X</span><span class="s1">')); % X'</span> <span class="nb">not</span> <span class="n">X</span> <span class="c1">% Display it with X &amp; Y permuted</span> <span class="o">&gt;&gt;</span> <span class="nb">imshow</span><span class="p">(</span><span class="n">J</span><span class="o">'</span><span class="p">,</span> <span class="p">[])</span> </code></pre></div></div> <p>This is all and nice and worked as expected. But it worked because we were using <code class="language-plaintext highlighter-rouge">double</code>s for this image. Let’s try with a more memory-saving type. First, let’s create a <code class="language-plaintext highlighter-rouge">uint8</code> image from a <a href="/scripting/matlab">MATLAB</a> array of this type:</p> <div class="language-matlab highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;&gt;</span> <span class="nb">clear</span> <span class="o">&gt;&gt;</span> <span class="nb">load</span> <span class="n">clown</span> <span class="o">&gt;&gt;</span> <span class="n">Y</span> <span class="o">=</span> <span class="n">ind2gray</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">map</span><span class="p">);</span> <span class="o">&gt;&gt;</span> <span class="n">Z</span> <span class="o">=</span> <span class="nb">uint8</span><span class="p">(</span><span class="mi">255</span><span class="o">*</span><span class="n">Y</span><span class="p">);</span> <span class="o">&gt;&gt;</span> <span class="nb">imshow</span><span class="p">(</span><span class="n">Z</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="n">img</span> <span class="o">=</span> <span class="n">copytoImg</span><span class="p">(</span><span class="n">Z</span><span class="p">);</span> <span class="o">&gt;&gt;</span> <span class="n">net</span><span class="o">.</span><span class="n">imglib2</span><span class="o">.</span><span class="n">img</span><span class="o">.</span><span class="nb">display</span><span class="o">.</span><span class="n">imagej</span><span class="o">.</span><span class="n">ImageJFunctions</span><span class="o">.</span><span class="nb">show</span><span class="p">(</span><span class="n">img</span><span class="p">);</span> </code></pre></div></div> <p>This just builds an acceptable <a href="/scripting/matlab">MATLAB</a> uint8 image and a UnsignedByteType ImgLib2 image. Let’s suppose we modified this image, keeping its type, and want to retrieve the content in <a href="/scripting/matlab">MATLAB</a>. We do just like before:</p> <div class="language-matlab highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;&gt;</span> <span class="n">I</span> <span class="o">=</span> <span class="n">img</span><span class="o">.</span><span class="n">update</span><span class="p">([])</span><span class="o">.</span><span class="n">getCurrentStorageArray</span><span class="p">;</span> <span class="o">&gt;&gt;</span> <span class="n">J</span> <span class="o">=</span> <span class="nb">reshape</span><span class="p">(</span><span class="n">I</span><span class="p">,</span> <span class="nb">size</span><span class="p">(</span><span class="n">X</span><span class="s1">')); % X'</span> <span class="nb">not</span> <span class="n">X</span> <span class="o">&gt;&gt;</span> <span class="nb">imshow</span><span class="p">(</span><span class="n">J</span><span class="o">'</span><span class="p">,</span> <span class="p">[])</span> </code></pre></div></div> <p><img src="/media/libs/imglib2/matlabtoimglib2-int8.png" alt="" /></p> <p>What happened here? The gray levels are all messed up. Checking the class of the returned array gives a clue:</p> <div class="language-matlab highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;&gt;</span> <span class="nb">class</span><span class="p">(</span><span class="n">J</span><span class="p">)</span> <span class="nb">ans</span> <span class="o">=</span> <span class="nb">int8</span> </code></pre></div></div> <p>Aha! So we gave to ImgLib2 an uint8 array, but it gives us back an int8 array, with all values wrapped. This is actually something that should have been expected: There is no unsigned byte type in Java, only signed byte type. This is a language design choice we could discuss for hours, but in Java there just isn’t uint8 or uint16[^1].</p> <p>ImgLib2 developers managed to deal with it elegantly. Since the library can abstract about everything, having an image type which is not directly backed up by an existing primitive type is not a problem. The uint8 is represented internally by something Java can handle, and ImgLib2 makes sure the unsigned byte type arithmetics are respected whenever the image content is retrieved or display.</p> <p>But when we call the <code class="language-plaintext highlighter-rouge">getCurrentStorageArray</code> method, we retrieve this internal representation, and it just happens that it is of type <code class="language-plaintext highlighter-rouge">int8</code>, that is signed byte. The values are a bit mixed, since <code class="language-plaintext highlighter-rouge">int8</code> ranges from -128 to 127, while <code class="language-plaintext highlighter-rouge">uint8</code> range from 0 to 255. <a href="/scripting/matlab">MATLAB</a> has a built-in function to put it back right:</p> <div class="language-matlab highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;&gt;</span> <span class="n">I</span> <span class="o">=</span> <span class="n">img</span><span class="o">.</span><span class="n">update</span><span class="p">([])</span><span class="o">.</span><span class="n">getCurrentStorageArray</span><span class="p">;</span> <span class="o">&gt;&gt;</span> <span class="n">J</span> <span class="o">=</span> <span class="nb">typecast</span><span class="p">(</span><span class="n">I</span><span class="p">,</span> <span class="s1">'uint8'</span><span class="p">);</span> <span class="o">&gt;&gt;</span> <span class="n">K</span> <span class="o">=</span> <span class="nb">reshape</span><span class="p">(</span><span class="n">J</span><span class="p">,</span> <span class="nb">size</span><span class="p">(</span><span class="n">X</span><span class="o">'</span><span class="p">));</span> <span class="o">&gt;&gt;</span> <span class="nb">imshow</span><span class="p">(</span><span class="n">K</span><span class="o">'</span><span class="p">)</span> </code></pre></div></div> <p>But of course, there is a <a href="/scripting/matlab">MATLAB</a> function that does all of this for you, and that you can also find in the scripts folder of your Fiji installation: <a href="https://github.com/fiji/fiji/blob/master/scripts/copytoMatlab.m">copytoMatlab</a>.</p> <h2 id="matlab-arrays-are-not-shared">MATLAB arrays are not shared</h2> <p>We expect the underlying raw data - an array of doubles - to be shared between <a href="/scripting/matlab">MATLAB</a> and ImgLib2. Unfortunately, it isn’t so. Let’s try to turn the first column entirely white</p> <div class="language-matlab highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;&gt;</span> <span class="nb">close</span> <span class="nb">all</span> <span class="o">&gt;&gt;</span> <span class="n">X</span><span class="p">(:,</span><span class="mi">1</span><span class="p">)</span> <span class="o">=</span> <span class="mi">255</span><span class="p">;</span> <span class="o">&gt;&gt;</span> <span class="nb">imshow</span><span class="p">(</span><span class="n">X</span><span class="p">,[])</span> <span class="o">&gt;&gt;</span> <span class="n">net</span><span class="o">.</span><span class="n">imglib2</span><span class="o">.</span><span class="n">img</span><span class="o">.</span><span class="nb">display</span><span class="o">.</span><span class="n">imagej</span><span class="o">.</span><span class="n">ImageJFunctions</span><span class="o">.</span><span class="nb">show</span><span class="p">(</span><span class="n">img</span><span class="p">);</span> </code></pre></div></div> <p>It did not work: the ImgLib2 image did not see the change. This means that it does not wrap <b>the</b> <a href="/scripting/matlab">MATLAB</a> array, but a copy of it. This is a shame and this is of crucial importance. Not only we might have some very large data to process we wish not to duplicate in memory, but we might want to take advantage of some ImgLib2 algorithms that run <em>in place</em> and modify the source image.</p> <p>This is by construction, and there is no workaround, at least for Java<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">1</a></sup>. <a href="/scripting/matlab">MATLAB</a> passes all the data <em>per-value</em>, not <em>per-reference</em> and this is what happened here.</p> <h2 id="using-java-arrays-in-matlab">Using Java arrays in MATLAB</h2> <p>A first attempt to solve this would be to try and use Java arrays in <a href="/scripting/matlab">MATLAB</a>, which is made possible by the function <code class="language-plaintext highlighter-rouge">javaArray</code>. As explained in the <a href="http://www.mathworks.fr/fr/help/matlab/matlab_external/working-with-java-arrays.html">[MATLAB](/scripting/matlab) docs</a>, you can use this function to instantiate proper Java arrays, which we could then use to create an ImgLib2 image, and play with the same data both on the <a href="/scripting/matlab">MATLAB</a> side and on the ImgLib2 side.</p> <p>But this would unsatisfactory as well. The <code class="language-plaintext highlighter-rouge">javaArray</code> function allows the creation of Java <em>objects</em>, but not of <em>primitive types</em>. As suggested on the <a href="/scripting/matlab">MATLAB</a> docs, and noted <a href="http://stackoverflow.com/questions/5554518/can-matlab-not-read-back-a-double-array-from-java">here</a>:</p> <p><a href="/scripting/matlab">MATLAB</a> can pass Java objects when calling a Java function, and modifications to these objects are afterwards available in <a href="/scripting/matlab">MATLAB</a> - <u>except when the Java object is an array of a primitive data type`</u><code class="language-plaintext highlighter-rouge">. In this case automatic conversion between </code><a href="/scripting/matlab"><code class="language-plaintext highlighter-rouge">MATLAB</code></a><code class="language-plaintext highlighter-rouge"> and Java kicks in, making a Java array-of-primitive-double correspond directly to a double matrix in </code><a href="/scripting/matlab"><code class="language-plaintext highlighter-rouge">MATLAB</code></a><code class="language-plaintext highlighter-rouge"> - which is by </code><a href="/scripting/matlab"><code class="language-plaintext highlighter-rouge">MATLAB</code></a>` conventions a thing “passed as value” so no return values are possible.</p> <p>So this means that we could create an array of <code class="language-plaintext highlighter-rouge">java.lang.Double[]</code> and use its reference, but we cannot have and manipulate a plain native <code class="language-plaintext highlighter-rouge">double[]</code> array without <a href="/scripting/matlab">MATLAB</a> shadowing any change because it operates on a copy.</p> <p>An array of <code class="language-plaintext highlighter-rouge">java.lang.Double[]</code> is not acceptable for most of our use cases. We expect to deal sometimes with very large images - the main reason for trying to escape duplicating data in memory - and a <code class="language-plaintext highlighter-rouge">Double</code> object adds some overhead on the primitive it wraps we would like to avoid.</p> <p>As of now (<a href="/scripting/matlab">MATLAB</a> 2013a), this answer seems to be definitive: There is no workaround if we are to stay with a native array in <a href="/scripting/matlab">MATLAB</a>.</p> <h2 id="using-imglib2-types-as-primary-data-holder">Using ImgLib2 types as primary data holder</h2> <p>Therefore, a solution implies a change of approach. We will not use <a href="/scripting/matlab">MATLAB</a> matrices as data holder, but use ImgLib2 structures. We can access the raw data through ImgLib2 facilities (cursor, randomAcess, …). The changes made are then done <em>in place</em>, and will be visible from both ImgLib2 and <a href="/scripting/matlab">MATLAB</a>, provided the data is accessed from the ImgLib2 container. We also already saw that <code class="language-plaintext highlighter-rouge">ArrayImg</code>s wrap a native array, that we can copy to <a href="/scripting/matlab">MATLAB</a> shall we need to quickly get the whole dataset.</p> <p>With this strategy, <a href="/scripting/matlab">MATLAB</a> steps aside a bit, since we use ImgLib2 for basically all data manipulation. It takes the role of a scripting language like <a href="/scripting/jython">Jython</a>, from which you make plain call to Java classes. Duplicating the native array wrapped in an <code class="language-plaintext highlighter-rouge">ArrayImg</code> allows you still make the best our of <a href="/scripting/matlab">MATLAB</a> easily, but you must design a good tactic in your script to avoid these local copies to exist for too long.</p> <h2 id="references">References</h2> <p>[^1] :Check <a href="http://darksleep.com/player/JavaAndUnsignedTypes.html">here</a> for the details of unsigned types story.</p> <div class="footnotes" role="doc-endnotes"> <ol> <li id="fn:2" role="doc-endnote"> <p>For C++, you can write a Mex wrapper that will force <a href="/scripting/matlab">MATLAB</a> to operate on the reference of an array. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p> </li> </ol> </div> </div> </div> </section> <!-- Footer --> <section id="footer"> <ul class="icons"> <li><a href="https://forum.image.sc/tag/imagej" class="icon alt"><img src="/media/icons/image-sc.png" width="24" style="vertical-align: middle; margin-top: -10px"><span class="label">Forum</span></a></li> <li><a href="https://twitter.com/hashtag/ImageJ" class="icon brands alt fa-twitter"><span class="label">Twitter</span></a></li> <li><a href="https://github.com/imagej" class="icon brands alt fa-github"><span class="label">GitHub</span></a></li> </ul> <ul class="copyright"> <li>Design: <a href="http://html5up.net">HTML5 UP</a></li> </ul> </section> <!-- Hamburger menu --> <nav role="navigation"> <div id="ham-toggle"> <input type="checkbox" /> <span></span> <!-- top bun --> <span></span> <!-- hamburger --> <span></span> <!-- bottom bun --> <ul id="ham-menu"> <div class="menu"><h3>ImageJ Docs</h3> <ul> <li><a href="/downloads">Download</a></li> <li><details><summary>Learn</summary><ul> <li><details><summary><a href="/learn">ImageJ Basics</a></summary><ul> <li><a href="/tutorials">Tutorials</a></li> <li><a href="/learn/user-guides">User Guides</a></li> <li><a href="/learn/keyboard-shortcuts">Keyboard Shortcuts</a></li> <li><a href="/learn/tips-and-tricks">Tips and Tricks</a></li> <li><a href="/learn/troubleshooting">Troubleshooting</a></li> <li><a href="/learn/faq">Frequently Asked Questions</a></li> <li><details><summary><a href="/platforms">Supported Platforms</a></summary><ul> <li><a href="/platforms/windows">Windows</a></li> <li><a href="/platforms/macos">MacOS</a></li> <li><a href="/platforms/linux">Linux</a></li> <li><a href="/platforms/pi">Raspberry Pi</a></li> <li><a href="/platforms/android">Android</a></li> </ul></details></li> <!-- Learn/ImageJ Basics/Supported Platforms --> <li><details><summary><a href="/formats">File Formats</a></summary><ul> <li><a href="/formats/bio-formats">Bio-Formats</a></li> <li><a href="/formats/video">Video formats</a></li> <li><a href="/formats/quicktime">QuickTime</a></li> <li><a href="/formats/tiff">TIFF</a></li> <li><a href="/formats/pdf">PDF</a></li> <li><a href="/formats/dicom">DICOM</a></li> <li><a href="/formats/lsm">Zeiss LSM</a></li> <li><a href="/formats/olympus">Olympus VSI</a></li> <li><a href="/formats/lurawave">Opera Flex</a></li> <li><a href="/formats/fib-sem">FIB-SEM</a></li> </ul></details></li> <!-- Learn/ImageJ Basics/File Formats --> </ul></details></li> <!-- Learn/ImageJ --> <li><details><summary><a href="/imaging">Scientific Imaging</a></summary><ul> <li><a href="/imaging/principles">Principles of Scientific Imaging</a></li> <li><a href="/imaging/annotating-images">Annotating Images</a></li> <li><a href="/imaging/colocalization-analysis">Colocalization</a></li> <li><a href="/imaging/color-image-processing">Color Image Processing</a></li> <li><a href="/imaging/deconvolution">Deconvolution</a></li> <li><a href="/imaging/image-intensity-processing">Image Intensity Processing</a></li> <li><a href="/imaging/particle-analysis">Particle Analysis</a></li> <li><a href="/imaging/registration">Registration</a></li> <li><a href="/imaging/segmentation">Segmentation</a></li> <li><a href="/imaging/stack-slice-manipulations">Stack-slice Manipulations</a></li> <li><a href="/imaging/t-functions">T-functions</a></li> <li><a href="/imaging/tracking">Tracking</a></li> <li><a href="/imaging/visualization">Visualization</a></li> <li><a href="/imaging/z-functions">Z-functions</a></li> </ul></details></li> <!-- Learn/Scientific Imaging --> </ul></details></li> <!-- Learn --> <li><details><summary><a href="/plugins">Extend</a></summary><ul> <li><a href="/list-of-extensions">List of Extensions</a></li> <li><details><summary><a href="/update-sites">Update Sites</a></summary><ul> <li><a href="/list-of-update-sites">List of Update Sites</a></li> <li><a href="/update-sites/following">Following an Update Site</a></li> <li><a href="/update-sites/setup">Creating an Update Site</a></li> <li><a href="/update-sites/tos">Terms of Service</a></li> <li><a href="/update-sites/automatic-uploads">Automatic Upload</a></li> <li><a href="/update-sites/core-uploads">Uploading to Core Sites</a></li> <li><a href="/update-sites/faq">Update Sites FAQ</a></li> <li><a href="/update-sites/stats">Statistics</a></li> </ul></details></li> <!-- Extend/Update Sites --> <li><details><summary><a href="/scripting">Scripting</a></summary><ul> <li><a href="/scripting/basics">Scripting Basics</a></li> <li><a href="/scripting/script-editor">Script Editor</a></li> <li><a href="/scripting/parameters">Parameters</a></li> <li><a href="/scripting/user-input">User Input</a></li> <li><a href="/scripting/auto-imports">Auto Import</a></li> <li><a href="/scripting/templates">Templates</a></li> <li><a href="/scripting/batch">Batch Processing</a></li> <li><a href="/scripting/headless">Running Headlessly</a></li> <li><a href="/scripting/comparisons">Scripting Comparisons</a></li> <li><a href="/scripting/toolbox">Toolbox</a></li> <li><details><summary>Languages</summary><ul> <li><a href="/scripting/beanshell">BeanShell Scripting</a></li> <li><a href="/scripting/groovy">Groovy Scripting</a></li> <li><a href="/scripting/macro">ImageJ Macro</a></li> <li><a href="/scripting/javascript">JavaScript</a></li> <li><a href="/scripting/clojure">Lisp (Clojure)</a></li> <li><a href="/scripting/matlab">MATLAB</a></li> <li><a href="/scripting/jython">Python (Jython)</a></li> <li><a href="/scripting/python">Python (native)</a></li> <li><a href="/scripting/renjin">R (Renjin)</a></li> <li><a href="/scripting/jruby">Ruby (JRuby)</a></li> <li><a href="/scripting/scala">Scala Scripting</a></li> </ul></details></li> <!-- Extend/Scripting/Languages --> </ul></details></li> <!-- Extend/Scripting --> <li><details><summary><a href="/develop">Development</a></summary><ul> <li><a href="/develop/philosophy">Philosophy</a></li> <li><a href="/develop/architecture">Architecture</a></li> <li><a href="/develop/source">Source code</a></li> <li><a href="/develop/project-management">Project management</a></li> <li><a href="/develop/coding-style">Coding style</a></li> <li><a href="/develop/javadoc">Using Javadoc</a></li> <li><a href="/develop/debugging">Debugging</a></li> <li><a href="/develop/wish-list">Wish list</a></li> <li><details><summary>Tools</summary><ul> <li><a href="/develop/github">GitHub</a></li> <li><a href="/develop/maven">Maven</a></li> <li><a href="/develop/ci">CI/CD</a></li> <li><a href="/develop/dotfiles">Dotfiles</a></li> <li><details><summary><a href="/develop/ides">IDEs</a></summary><ul> <li><a href="/develop/eclipse">Eclipse</a></li> <li><a href="/develop/netbeans">NetBeans</a></li> <li><a href="/develop/intellij">IntelliJ IDEA</a></li> <li><a href="/develop/command-line">Command Line</a></li> </ul></details></li> </ul></details></li> <!-- Extend/Development/Tools --> <li><details><summary>Guides</summary><ul> <li><a href="/develop/plugins">Writing plugins</a></li> <li><a href="/develop/improving-the-code">Contributing to a plugin</a></li> <li><a href="/develop/releasing">Development lifecycle</a></li> <li><a href="/develop/building-a-pom">Building a POM</a></li> <li><a href="/develop/debugging-exercises">Hands-on debugging</a></li> <li><a href="/develop/writing-ops">Adding new ops</a></li> <li><a href="/develop/formats">Adding new formats</a></li> <li><a href="/develop/native-libraries">Using native libraries</a></li> <li><a href="/develop/tips">Tips for developers</a></li> <li><a href="/develop/cpp-tips">Tips for C++ developers</a></li> <li><a href="/develop/ij1-plugins">ImageJ 1.x plugins</a></li> <li><a href="/develop/versioning">Versioning</a></li> <li><a href="/develop/logging">Logging</a></li> <li><a href="/develop/uber-jars">Uber-JARs</a></li> </ul></details></li> <!-- Extend/Development/Guides --> <li><details><summary><a href="/develop/git">Git</a></summary><ul> <li><a href="/develop/git/eclipse">Git in Eclipse (EGit)</a></li> <li><a href="/develop/git/mini-howto">Git mini howto</a></li> <li><a href="/develop/git/workshop">Git workshop</a></li> <li><a href="/develop/git/conflicts">Git conflicts</a></li> <li><a href="/develop/git/topic-branches">Git topic branches</a></li> <li><a href="/develop/git/notes">Git notes</a></li> <li><a href="/develop/git/reflogs">Git reflogs</a></li> <li><a href="/develop/git/submodules">Git submodules</a></li> <li><a href="/develop/git/pinpoint-regressions">How to pinpoint regressions</a></li> <li><a href="/develop/git/publish-a-repository">How to publish a git repository</a></li> <li><a href="/develop/git/extract-a-subproject">How to extract a subproject</a></li> </ul></details></li> <!-- Extend/Development/Git --> </ul></details></li> <!-- Extend/Development --> </ul></details></li> <!-- Extend --> <li><details><summary><a href="/contribute">Contribute</a></summary><ul> <li><a href="/contribute/citing">Citing</a></li> <li><a href="/people">Contributors</a></li> <li><a href="/orgs">Organizations</a></li> <li><a href="/contribute/governance">Governance</a></li> <li><a href="/contribute/funding">Funding</a></li> <li><a href="/contribute/fiji">Contributing to Fiji</a></li> <li><details><summary><a href="/licensing">Licensing</a></summary><ul> <li><details><summary><a href="/licensing/open-source">Open Source</a></summary><ul> <li><a href="/licensing/apache">Apache</a></li> <li><a href="/licensing/bsd">BSD</a></li> <li><a href="/licensing/epl">EPL</a></li> <li><a href="/licensing/gpl">GPL</a></li> <li><a href="/licensing/lgpl">LGPL</a></li> <li><a href="/licensing/mit">MIT</a></li> <li><a href="/licensing/public-domain">Public domain</a></li> <li><a href="/licensing/big">BIG</a></li> </ul></details></li> <!-- Contribute/Licensing/Open Source --> <li><a href="/licensing/closed-source">Proprietary</a></li> </ul></details></li> <!-- Contribute/Licensing --> <li><details><summary><a href="/editing">Editing the Wiki</a></summary><ul> <li><a href="/editing/advanced">Advanced Editing</a></li> <li><a href="/editing/buttons">Buttons</a></li> <li><a href="/editing/citations">Citations</a></li> <li><a href="/editing/code">Source Code</a></li> <li><a href="/editing/debugging">Debugging</a></li> <li><a href="/editing/headers">Headers</a></li> <li><a href="/editing/icons">Icons</a></li> <li><a href="/editing/images">Images</a></li> <li><a href="/editing/keys">Keyboard Shortcuts</a></li> <li><a href="/editing/linking">Linking</a></li> <li><a href="/editing/math">Math Expressions</a></li> <li><a href="/editing/menu-paths">Menu Paths</a></li> <li><a href="/editing/navigation">Navigation</a></li> <li><a href="/editing/notices">Notices</a></li> <li><a href="/editing/people">People</a></li> <li><a href="/editing/pitfalls">Pitfalls</a></li> <li><a href="/editing/quizzes">Quizzes</a></li> <li><a href="/editing/statbox">Statbox</a></li> <li><a href="/editing/symbols">Symbols</a></li> <li><a href="/editing/tables">Tables</a></li> <li><a href="/editing/timelines">Timelines</a></li> <li><a href="/editing/tooltips">Tooltips</a></li> <li><a href="/editing/videos">Videos</a></li> <li><a href="/editing/whitespace">Whitespace</a></li> </ul></details></li> <!-- Contribute/Editing the Wiki --> </ul></details></li> <!-- Contribute --> <li><details><summary><a href="/discuss">Discuss</a></summary><ul> <li><a href="/discuss/bugs">Reporting Issues</a></li> <li><a href="/discuss/mailing-lists">Mailing Lists</a></li> <li><a href="/discuss/chat">Chat</a></li> </ul></details></li> <!-- Discuss --> <li><details open><summary>Explore</summary><ul> <li><a href="/news">News</a></li> <li><details><summary><a href="/events">Events</a></summary><ul> <li><a href="/events/presentations">Presentations</a></li> <li><a href="/events/conferences">Conferences</a></li> <li><a href="/events/hackathons">Hackathons</a></li> <li><a href="/events">More...</a></li> </ul></details></li> <!-- Discuss/Events --> <li><details open><summary><a href="/libs">Libraries</a></summary><ul> <li><a href="/libs/imagej-ops">ImageJ Ops</a></li> <li><a href="/libs/imagej-common">ImageJ Common</a></li> <li><a href="/libs/imagej-legacy">ImageJ Legacy</a></li> <li><a href="/libs/scijava">SciJava</a></li> <li><a href="/libs/scifio">SCIFIO</a></li> <li><details open><summary><a href="/libs/imglib2">ImgLib2</a></summary><ul> <li><a href="/libs/imglib2/getting-started">Getting Started</a></li> <li><a href="/libs/imglib2/accessors">Accessors</a></li> <li><a href="/libs/imglib2/accessibles">Accessibles</a></li> <li><a href="/libs/imglib2/examples">Examples</a></li> <li><a href="/libs/imglib2/workshop-introductory">Introductory Workshop</a></li> <li><a href="/libs/imglib2/workshop-advanced">Advanced Workshop</a></li> <li><a class="current-page">ImgLib2 images in MATLAB</a></li> <li><a href="/libs/imglib2/benchmarks">Benchmarks</a></li> <li><a href="/libs/imglib2/faq">FAQ</a></li> <li><a href="/libs/imglib2/developing">Developing ImgLib2</a></li> <li><a href="/libs/imglib2/discussion">ImgLib2 Discussion</a></li> </ul></details></li> <!-- Explore/Libraries/ImgLib2 --> <li><a href="/libs">More...</a></li> </ul></details></li> <!-- Explore/Libraries --> <li><details><summary><a href="/software">Software</a></summary><ul> <li><a href="/software/nih-image">NIH Image</a></li> <li><a href="/software/imagej">ImageJ</a></li> <li><a href="/software/imagej2">ImageJ2</a></li> <li><a href="/software/fiji">Fiji</a></li> <li><a href="/software">More...</a></li> </ul></details></li> <!-- Explore/Software --> </ul></details></li> <!-- Explore --> </ul> </div> </ul> </div> </nav> <div id="dock-overlay-left" class="dock-overlay" data-dock-target="left-column"></div> <div id="dock-overlay-right" class="dock-overlay" data-dock-target="right-column"></div> <!-- Search results --> <div id="search-results"> <div id="search-hits"></div> <div id="pagination"></div> </div> <!-- Scripts --> <!-- Libraries --> <script src="/assets/js/jquery.min.js"></script> <script src="/assets/js/jquery.scrolly.min.js"></script> <script src="/assets/js/browser.min.js"></script> <script src="/assets/js/breakpoints.min.js"></script> <script src="/assets/js/util.js"></script> <script src="/assets/js/jquery.toc.js"></script> <script src="/assets/js/lightbox.min.js"></script> <!-- Extensions --> <!-- Site code --> <script src="/assets/js/main.js"></script> <script src="/assets/js/dock.js"></script> <script src="/assets/js/code.js"></script> <!-- Anchors --> <script src="https://cdn.jsdelivr.net/npm/anchor-js/anchor.min.js"></script> <script>anchors.add('#page h1, #page h2, #page h3, #page h4, #page h5, #page h6');</script> <!-- Citations --> <script src="https://cdn.jsdelivr.net/npm/citation-js@0.4.0-9"></script> <script src="/assets/js/cite.js"></script> <!-- Search --> <script src="https://cdn.jsdelivr.net/npm/algoliasearch@4.13.0/dist/algoliasearch-lite.umd.js"></script> <script src="https://cdn.jsdelivr.net/npm/instantsearch.js@4.40.3/dist/instantsearch.production.min.js"></script> <script src="/assets/js/search.js"></script> <script src="/assets/js/search-tweaks.js"></script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10