Skip to content

Commit

Permalink
Adding extension documentation.
Browse files Browse the repository at this point in the history
  • Loading branch information
zivy committed Sep 6, 2024
1 parent e3c4fe4 commit b122dba
Showing 1 changed file with 26 additions and 22 deletions.
48 changes: 26 additions & 22 deletions docs/XTChannelArithmetic.html
Original file line number Diff line number Diff line change
Expand Up @@ -97,78 +97,82 @@ <h1 id="basic-examples">Basic Examples</h1>
<blockquote>
<div class="sourceCode" id="cb2"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true"></a>[<span class="dv">4</span>] <span class="op">-</span> ([<span class="dv">0</span>]<span class="op">*</span>[<span class="dv">3</span>])</span></code></pre></div>
</blockquote></li>
<li><p>Duplicate the second channel (indexes are zero based, so second channel index is 1):</p>
<blockquote>
<div class="sourceCode" id="cb3"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true"></a>[<span class="dv">1</span>]</span></code></pre></div>
</blockquote></li>
<li><p>Duplicate all channels:</p>
<blockquote>
<div class="sourceCode" id="cb3"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true"></a>[i]</span></code></pre></div>
<div class="sourceCode" id="cb4"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true"></a>[i]</span></code></pre></div>
</blockquote></li>
<li><p>Subtract channel zero from all channels:</p>
<blockquote>
<div class="sourceCode" id="cb4"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true"></a>[i]<span class="op">-</span>[<span class="dv">0</span>]</span></code></pre></div>
<div class="sourceCode" id="cb5"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true"></a>[i]<span class="op">-</span>[<span class="dv">0</span>]</span></code></pre></div>
</blockquote></li>
<li><p>Invert channel intensity (new intensity values are the result of subtracting the current intensity value from the maximal possible value):</p>
<blockquote>
<div class="sourceCode" id="cb5"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true"></a>sitk.InvertIntensity([<span class="dv">1</span>])</span></code></pre></div>
<div class="sourceCode" id="cb6"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true"></a>sitk.InvertIntensity([<span class="dv">1</span>])</span></code></pre></div>
</blockquote></li>
<li><p>Threshold channel one using a value of 100, resulting image is binary with values in {0,1}:</p>
<blockquote>
<div class="sourceCode" id="cb6"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true"></a>[<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span></span></code></pre></div>
<div class="sourceCode" id="cb7"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true"></a>[<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span></span></code></pre></div>
</blockquote></li>
<li><p>Threshold a specific channel to create a binary result using the Otsu filter, resulting image is binary with values in {0,1}:</p>
<blockquote>
<div class="sourceCode" id="cb7"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true"></a>sitk.OtsuThreshold([<span class="dv">1</span>], <span class="dv">0</span>, <span class="dv">1</span>)</span></code></pre></div>
<div class="sourceCode" id="cb8"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true"></a>sitk.OtsuThreshold([<span class="dv">1</span>], <span class="dv">0</span>, <span class="dv">1</span>)</span></code></pre></div>
</blockquote></li>
<li><p>Gaussian blurring (variance specified in metric units, e.g. nm):</p>
<blockquote>
<div class="sourceCode" id="cb8"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true"></a><span class="co"># blur channel 3 using a Gaussian with variance of 0.245 for x, y and z</span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true"></a>sitk.DiscreteGaussian([<span class="dv">3</span>], <span class="fl">0.245</span>)</span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true"></a><span class="co"># blur channel 3 using a Gaussian with different variance per x=0.245, y=0.1, z=0.3</span></span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true"></a>sitk.DiscreteGaussian([<span class="dv">3</span>], [<span class="fl">0.245</span>, <span class="fl">0.1</span>, <span class="fl">0.3</span>])</span></code></pre></div>
<div class="sourceCode" id="cb9"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true"></a><span class="co"># blur channel 3 using a Gaussian with variance of 0.245 for x, y and z</span></span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true"></a>sitk.DiscreteGaussian([<span class="dv">3</span>], <span class="fl">0.245</span>)</span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true"></a><span class="co"># blur channel 3 using a Gaussian with different variance per x=0.245, y=0.1, z=0.3</span></span>
<span id="cb9-4"><a href="#cb9-4" aria-hidden="true"></a>sitk.DiscreteGaussian([<span class="dv">3</span>], [<span class="fl">0.245</span>, <span class="fl">0.1</span>, <span class="fl">0.3</span>])</span></code></pre></div>
</blockquote></li>
<li><p>Unsharp masking (variance specified in metric units, e.g. nm). This is actually a filter: that emphasizes edges, sharpens the image using a blurred version of the image.</p>
<blockquote>
<div class="sourceCode" id="cb9"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true"></a><span class="co"># sharpen channel 0 using an unsharp Gaussian mask with variance of 0.245 and</span></span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true"></a><span class="co"># sharpening increase of 0.5</span></span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true"></a>[<span class="dv">0</span>]<span class="op">+</span>([<span class="dv">0</span>]<span class="op">-</span>sitk.DiscreteGaussian([<span class="dv">0</span>], <span class="fl">0.245</span>))<span class="op">*</span><span class="fl">0.5</span></span></code></pre></div>
<div class="sourceCode" id="cb10"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true"></a><span class="co"># sharpen channel 0 using an unsharp Gaussian mask with variance of 0.245 and</span></span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true"></a><span class="co"># sharpening increase of 0.5</span></span>
<span id="cb10-3"><a href="#cb10-3" aria-hidden="true"></a>[<span class="dv">0</span>]<span class="op">+</span>([<span class="dv">0</span>]<span class="op">-</span>sitk.DiscreteGaussian([<span class="dv">0</span>], <span class="fl">0.245</span>))<span class="op">*</span><span class="fl">0.5</span></span></code></pre></div>
</blockquote></li>
<li><p>Median filtering using a radius of x=1, y=2 and z=3 (radius in which to compute the median per dimension, pixel units):</p>
<blockquote>
<div class="sourceCode" id="cb10"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true"></a>sitk.Median([<span class="dv">3</span>], [<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>])</span></code></pre></div>
<div class="sourceCode" id="cb11"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true"></a>sitk.Median([<span class="dv">3</span>], [<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>])</span></code></pre></div>
</blockquote></li>
<li><p>Linearly map the intensity values in the interval [windowMinimum, windowMaximum] to the interval [outputMinimum, outputMaximum]. Values lower than windowMinimum are mapped to outputMinimum. Values higher than windowMaximum are mapped to outputMaximum.</p>
<blockquote>
<div class="sourceCode" id="cb11"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true"></a>sitk.IntensityWindowing([<span class="dv">1</span>], windowMinimum<span class="op">=</span><span class="dv">20</span>, windowMaximum<span class="op">=</span><span class="dv">200</span>, outputMinimum<span class="op">=</span><span class="dv">0</span>, outputMaximum<span class="op">=</span><span class="dv">255</span>)</span></code></pre></div>
<div class="sourceCode" id="cb12"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true"></a>sitk.IntensityWindowing([<span class="dv">1</span>], windowMinimum<span class="op">=</span><span class="dv">20</span>, windowMaximum<span class="op">=</span><span class="dv">200</span>, outputMinimum<span class="op">=</span><span class="dv">0</span>, outputMaximum<span class="op">=</span><span class="dv">255</span>)</span></code></pre></div>
</blockquote></li>
</ol>
<h1 id="advanced-examples">Advanced Examples</h1>
<ol>
<li><p>Threshold a specific channel retaining the values above the threshold and setting all values equal or lower to zero:</p>
<blockquote>
<div class="sourceCode" id="cb12"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true"></a>sitk.Cast([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span>, sitk.sitkFloat32)<span class="op">*</span>[<span class="dv">1</span>]</span></code></pre></div>
<div class="sourceCode" id="cb13"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true"></a>sitk.Cast([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span>, sitk.sitkFloat32)<span class="op">*</span>[<span class="dv">1</span>]</span></code></pre></div>
</blockquote></li>
<li><p>Threshold a specific channel retaining the values above the threshold and setting all values equal or lower to the threshold to an arbitrary value (20 in this example):</p>
<blockquote>
<div class="sourceCode" id="cb13"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true"></a>sitk.Cast([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span>, sitk.sitkFloat32)<span class="op">*</span>[<span class="dv">1</span>] <span class="op">+</span> sitk.Cast([<span class="dv">1</span>]<span class="op">&lt;=</span><span class="dv">100</span>, sitk.sitkFloat32)<span class="op">*</span><span class="dv">20</span></span></code></pre></div>
<div class="sourceCode" id="cb14"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true"></a>sitk.Cast([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span>, sitk.sitkFloat32)<span class="op">*</span>[<span class="dv">1</span>] <span class="op">+</span> sitk.Cast([<span class="dv">1</span>]<span class="op">&lt;=</span><span class="dv">100</span>, sitk.sitkFloat32)<span class="op">*</span><span class="dv">20</span></span></code></pre></div>
</blockquote></li>
<li><p>Threshold a specific channel, get all connected components, then sort the components according to size, discarding those smaller than a minimum size and create a binary mask corresponding to the largest component, which is the first label(second largest component label is 2 etc.):</p>
<blockquote>
<div class="sourceCode" id="cb14"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true"></a>sitk.RelabelComponent(sitk.ConnectedComponent([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span>), minimumObjectSize <span class="op">=</span> <span class="dv">50</span>)<span class="op">==</span><span class="dv">1</span></span></code></pre></div>
<div class="sourceCode" id="cb15"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true"></a>sitk.RelabelComponent(sitk.ConnectedComponent([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span>), minimumObjectSize <span class="op">=</span> <span class="dv">50</span>)<span class="op">==</span><span class="dv">1</span></span></code></pre></div>
</blockquote></li>
<li><p>Create a binary mask representing the colocalization of two channels, intensity values below 20 are considred noise:</p>
<blockquote>
<div class="sourceCode" id="cb15"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true"></a>([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">20</span>)<span class="op">*</span>([<span class="dv">2</span>]<span class="op">&gt;</span><span class="dv">20</span>)</span></code></pre></div>
<div class="sourceCode" id="cb16"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true"></a>([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">20</span>)<span class="op">*</span>([<span class="dv">2</span>]<span class="op">&gt;</span><span class="dv">20</span>)</span></code></pre></div>
</blockquote></li>
<li><p>Create a binary mask representing the colocalization of two channels. We are interested in all pixels in channel 2 that have a value above 20 and that are less than 1.0um away from pixels in channel 1 that have a value above 100 (<strong>note</strong>: this operation yields different results when run using a slice-by-slice approach vs. a volumetric approach):</p>
<blockquote>
<div class="sourceCode" id="cb16"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true"></a>(sitk.Cast([<span class="dv">2</span>]<span class="op">&gt;</span><span class="dv">20</span>, sitk.sitkFloat32) <span class="op">*</span></span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true"></a>sitk.Abs(sitk.SignedMaurerDistanceMap([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span>, insideIsPositive<span class="op">=</span><span class="va">False</span>, squaredDistance<span class="op">=</span><span class="va">False</span>, useImageSpacing<span class="op">=</span><span class="va">True</span>)))<span class="op">&lt;=</span><span class="fl">1.0</span></span></code></pre></div>
<div class="sourceCode" id="cb17"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true"></a>(sitk.Cast([<span class="dv">2</span>]<span class="op">&gt;</span><span class="dv">20</span>, sitk.sitkFloat32) <span class="op">*</span></span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true"></a>sitk.Abs(sitk.SignedMaurerDistanceMap([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span>, insideIsPositive<span class="op">=</span><span class="va">False</span>, squaredDistance<span class="op">=</span><span class="va">False</span>, useImageSpacing<span class="op">=</span><span class="va">True</span>)))<span class="op">&lt;=</span><span class="fl">1.0</span></span></code></pre></div>
</blockquote></li>
<li><p>Create a binary mask using thresholding and then perform morphological closing (dilation followed by erosion) with distance maps, useful for filling holes:</p>
<blockquote>
<div class="sourceCode" id="cb17"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true"></a>sitk.SignedMaurerDistanceMap(sitk.SignedMaurerDistanceMap([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span>, insideIsPositive<span class="op">=</span><span class="va">False</span>, squaredDistance<span class="op">=</span><span class="va">False</span>, useImageSpacing<span class="op">=</span><span class="va">True</span>) <span class="op">&lt;</span> <span class="fl">1.0</span>, insideIsPositive<span class="op">=</span><span class="va">False</span>, squaredDistance<span class="op">=</span><span class="va">False</span>, useImageSpacing<span class="op">=</span><span class="va">True</span>)<span class="op">&lt;-</span><span class="fl">1.0</span></span></code></pre></div>
<div class="sourceCode" id="cb18"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true"></a>sitk.SignedMaurerDistanceMap(sitk.SignedMaurerDistanceMap([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span>, insideIsPositive<span class="op">=</span><span class="va">False</span>, squaredDistance<span class="op">=</span><span class="va">False</span>, useImageSpacing<span class="op">=</span><span class="va">True</span>) <span class="op">&lt;</span> <span class="fl">1.0</span>, insideIsPositive<span class="op">=</span><span class="va">False</span>, squaredDistance<span class="op">=</span><span class="va">False</span>, useImageSpacing<span class="op">=</span><span class="va">True</span>)<span class="op">&lt;-</span><span class="fl">1.0</span></span></code></pre></div>
</blockquote></li>
<li><p>Create a binary mask using thresholding and then perform morphological opening (erosion followed by dilation) with distance maps, useful for removing small islands:</p>
<blockquote>
<div class="sourceCode" id="cb18"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true"></a>sitk.SignedMaurerDistanceMap(sitk.SignedMaurerDistanceMap([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span>, insideIsPositive<span class="op">=</span><span class="va">False</span>, squaredDistance<span class="op">=</span><span class="va">False</span>, useImageSpacing<span class="op">=</span><span class="va">True</span>) <span class="op">&lt;</span> <span class="op">-</span><span class="fl">0.2</span>, insideIsPositive<span class="op">=</span><span class="va">False</span>, squaredDistance<span class="op">=</span><span class="va">False</span>, useImageSpacing<span class="op">=</span><span class="va">True</span>)<span class="op">&lt;</span><span class="fl">0.2</span></span></code></pre></div>
<div class="sourceCode" id="cb19"><pre class="sourceCode Python"><code class="sourceCode python"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true"></a>sitk.SignedMaurerDistanceMap(sitk.SignedMaurerDistanceMap([<span class="dv">1</span>]<span class="op">&gt;</span><span class="dv">100</span>, insideIsPositive<span class="op">=</span><span class="va">False</span>, squaredDistance<span class="op">=</span><span class="va">False</span>, useImageSpacing<span class="op">=</span><span class="va">True</span>) <span class="op">&lt;</span> <span class="op">-</span><span class="fl">0.2</span>, insideIsPositive<span class="op">=</span><span class="va">False</span>, squaredDistance<span class="op">=</span><span class="va">False</span>, useImageSpacing<span class="op">=</span><span class="va">True</span>)<span class="op">&lt;</span><span class="fl">0.2</span></span></code></pre></div>
</blockquote></li>
</ol>
</body>
Expand Down

0 comments on commit b122dba

Please sign in to comment.