Skip to content

Commit 5def91f

Browse files
committed
Deploying to pages from @ 8f996e7 🚀
1 parent 726d5e4 commit 5def91f

File tree

9 files changed

+448
-77
lines changed

9 files changed

+448
-77
lines changed

_modules/src/cytodataframe/frame.html

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,7 @@ <h1>Source code for src.cytodataframe.frame</h1><div class="highlight"><pre>
439439
<span class="n">adjust_with_adaptive_histogram_equalization</span><span class="p">,</span>
440440
<span class="n">draw_outline_on_image_from_mask</span><span class="p">,</span>
441441
<span class="n">draw_outline_on_image_from_outline</span><span class="p">,</span>
442+
<span class="n">get_pixel_bbox_from_offsets</span><span class="p">,</span>
442443
<span class="p">)</span>
443444

444445
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
@@ -535,6 +536,13 @@ <h1>Source code for src.cytodataframe.frame</h1><div class="highlight"><pre>
535536
<span class="sd"> - &#39;center_dot&#39;: Whether to draw a red dot at the compartment center</span>
536537
<span class="sd"> None will default to display a center dot.</span>
537538
<span class="sd"> e.g. {&#39;center_dot&#39;: True} to draw a red dot at the compartment center.</span>
539+
<span class="sd"> - &#39;offset_bounding_box&#39;: declare a relative bounding box using</span>
540+
<span class="sd"> the nuclei center xy coordinates to dynamically crop all images</span>
541+
<span class="sd"> by offsets from the center of the bounding box.</span>
542+
<span class="sd"> (overriding the bounding box data from the dataframe).</span>
543+
<span class="sd"> e.g. {&#39;bounding_box&#39;:</span>
544+
<span class="sd"> {&#39;x_min&#39;: -100, &#39;y_min&#39;: -100, &#39;x_max&#39;: 100, &#39;y_max&#39;: 100}</span>
545+
<span class="sd"> }</span>
538546
<span class="sd"> **kwargs:</span>
539547
<span class="sd"> Additional keyword arguments to pass to the pandas read functions.</span>
540548
<span class="sd"> &quot;&quot;&quot;</span>
@@ -1437,7 +1445,42 @@ <h1>Source code for src.cytodataframe.frame</h1><div class="highlight"><pre>
14371445

14381446
<span class="c1"># Step 6: Crop the image based on the bounding box and encode it to PNG format</span>
14391447
<span class="k">try</span><span class="p">:</span>
1440-
<span class="n">x_min</span><span class="p">,</span> <span class="n">y_min</span><span class="p">,</span> <span class="n">x_max</span><span class="p">,</span> <span class="n">y_max</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">bounding_box</span><span class="p">)</span> <span class="c1"># Ensure integers</span>
1448+
<span class="c1"># set a default bounding box</span>
1449+
<span class="n">x_min</span><span class="p">,</span> <span class="n">y_min</span><span class="p">,</span> <span class="n">x_max</span><span class="p">,</span> <span class="n">y_max</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">bounding_box</span><span class="p">)</span>
1450+
1451+
<span class="c1"># if we have custom offset bounding box information, use it</span>
1452+
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_attrs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;display_options&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_attrs</span><span class="p">[</span>
1453+
<span class="s2">&quot;display_options&quot;</span>
1454+
<span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;offset_bounding_box&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
1455+
<span class="k">try</span><span class="p">:</span>
1456+
<span class="c1"># note: this will default to the nuclei centers based</span>
1457+
<span class="c1"># on earlier input for this parameter.</span>
1458+
<span class="n">center_x</span><span class="p">,</span> <span class="n">center_y</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">compartment_center_xy</span><span class="p">)</span>
1459+
1460+
<span class="n">offset_bounding_box</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_attrs</span><span class="p">[</span><span class="s2">&quot;display_options&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
1461+
<span class="s2">&quot;offset_bounding_box&quot;</span>
1462+
<span class="p">)</span>
1463+
<span class="c1"># generate offset bounding box positions</span>
1464+
<span class="n">x_min</span><span class="p">,</span> <span class="n">y_min</span><span class="p">,</span> <span class="n">x_max</span><span class="p">,</span> <span class="n">y_max</span> <span class="o">=</span> <span class="n">get_pixel_bbox_from_offsets</span><span class="p">(</span>
1465+
<span class="n">center_x</span><span class="o">=</span><span class="n">center_x</span><span class="p">,</span>
1466+
<span class="n">center_y</span><span class="o">=</span><span class="n">center_y</span><span class="p">,</span>
1467+
<span class="n">rel_bbox</span><span class="o">=</span><span class="p">(</span>
1468+
<span class="n">offset_bounding_box</span><span class="p">[</span><span class="s2">&quot;x_min&quot;</span><span class="p">],</span>
1469+
<span class="n">offset_bounding_box</span><span class="p">[</span><span class="s2">&quot;y_min&quot;</span><span class="p">],</span>
1470+
<span class="n">offset_bounding_box</span><span class="p">[</span><span class="s2">&quot;x_max&quot;</span><span class="p">],</span>
1471+
<span class="n">offset_bounding_box</span><span class="p">[</span><span class="s2">&quot;y_max&quot;</span><span class="p">],</span>
1472+
<span class="p">),</span>
1473+
<span class="p">)</span>
1474+
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
1475+
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span>
1476+
<span class="p">(</span>
1477+
<span class="s2">&quot;Bounding box </span><span class="si">%s</span><span class="s2"> is out of bounds for image </span><span class="si">%s</span><span class="s2"> .&quot;</span>
1478+
<span class="s2">&quot; Defaulting to use bounding box from data.&quot;</span>
1479+
<span class="p">),</span>
1480+
<span class="p">(</span><span class="n">x_min</span><span class="p">,</span> <span class="n">y_min</span><span class="p">,</span> <span class="n">x_max</span><span class="p">,</span> <span class="n">y_max</span><span class="p">),</span>
1481+
<span class="n">image_path</span><span class="p">,</span>
1482+
<span class="p">)</span>
1483+
14411484
<span class="n">cropped_img_array</span> <span class="o">=</span> <span class="n">prepared_image</span><span class="p">[</span>
14421485
<span class="n">y_min</span><span class="p">:</span><span class="n">y_max</span><span class="p">,</span> <span class="n">x_min</span><span class="p">:</span><span class="n">x_max</span>
14431486
<span class="p">]</span> <span class="c1"># Perform slicing</span>

_modules/src/cytodataframe/image.html

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,50 @@ <h1>Source code for src.cytodataframe.image</h1><div class="highlight"><pre>
679679
<span class="k">else</span><span class="p">:</span>
680680
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unsupported image format. Use grayscale, RGB, or RGBA.&quot;</span><span class="p">)</span></div>
681681

682+
683+
684+
<div class="viewcode-block" id="get_pixel_bbox_from_offsets">
685+
<a class="viewcode-back" href="../../../python-api.html#src.cytodataframe.image.get_pixel_bbox_from_offsets">[docs]</a>
686+
<span class="k">def</span> <span class="nf">get_pixel_bbox_from_offsets</span><span class="p">(</span>
687+
<span class="n">center_x</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span> <span class="n">center_y</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span> <span class="n">rel_bbox</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span>
688+
<span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]:</span>
689+
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
690+
<span class="sd"> Compute a pixel bbox given a center point and pixel offsets.</span>
691+
692+
<span class="sd"> Args:</span>
693+
<span class="sd"> center_x: Center x-coordinate in pixels.</span>
694+
<span class="sd"> center_y: Center y-coordinate in pixels.</span>
695+
<span class="sd"> rel_bbox: 4-tuple of pixel offsets:</span>
696+
<span class="sd"> (dx_min, dy_min, dx_max, dy_max)</span>
697+
698+
<span class="sd"> Returns:</span>
699+
<span class="sd"> A 4-tuple (x_min, x_max, y_min, y_max), where x_min and y_min</span>
700+
<span class="sd"> are clamped to be ≥ 0. x_max and y_max are returned as-is.</span>
701+
<span class="sd"> &quot;&quot;&quot;</span>
702+
<span class="n">dx_min</span><span class="p">,</span> <span class="n">dy_min</span><span class="p">,</span> <span class="n">dx_max</span><span class="p">,</span> <span class="n">dy_max</span> <span class="o">=</span> <span class="n">rel_bbox</span>
703+
704+
<span class="c1"># apply offsets</span>
705+
<span class="n">x_min</span> <span class="o">=</span> <span class="n">center_x</span> <span class="o">+</span> <span class="n">dx_min</span>
706+
<span class="n">x_max</span> <span class="o">=</span> <span class="n">center_x</span> <span class="o">+</span> <span class="n">dx_max</span>
707+
<span class="n">y_min</span> <span class="o">=</span> <span class="n">center_y</span> <span class="o">+</span> <span class="n">dy_min</span>
708+
<span class="n">y_max</span> <span class="o">=</span> <span class="n">center_y</span> <span class="o">+</span> <span class="n">dy_max</span>
709+
710+
<span class="c1"># clamp lower bounds to zero and round to int</span>
711+
<span class="n">x_min</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">round</span><span class="p">(</span><span class="n">x_min</span><span class="p">))</span>
712+
<span class="n">y_min</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">round</span><span class="p">(</span><span class="n">y_min</span><span class="p">))</span>
713+
714+
<span class="c1"># round upper bounds to int (no max-image clamp)</span>
715+
<span class="n">x_max</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">x_max</span><span class="p">)</span>
716+
<span class="n">y_max</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">y_max</span><span class="p">)</span>
717+
718+
<span class="c1"># guard against inverted boxes (just in case)</span>
719+
<span class="k">if</span> <span class="n">x_max</span> <span class="o">&lt;</span> <span class="n">x_min</span><span class="p">:</span>
720+
<span class="n">x_min</span><span class="p">,</span> <span class="n">x_max</span> <span class="o">=</span> <span class="n">x_max</span><span class="p">,</span> <span class="n">x_min</span>
721+
<span class="k">if</span> <span class="n">y_max</span> <span class="o">&lt;</span> <span class="n">y_min</span><span class="p">:</span>
722+
<span class="n">y_min</span><span class="p">,</span> <span class="n">y_max</span> <span class="o">=</span> <span class="n">y_max</span><span class="p">,</span> <span class="n">y_min</span>
723+
724+
<span class="k">return</span> <span class="n">x_min</span><span class="p">,</span> <span class="n">y_min</span><span class="p">,</span> <span class="n">x_max</span><span class="p">,</span> <span class="n">y_max</span></div>
725+
682726
</pre></div>
683727

684728
</article>

0 commit comments

Comments
 (0)