<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mine Cuneyitoglu</title>
    <description>The latest articles on DEV Community by Mine Cuneyitoglu (@mine_cune).</description>
    <link>https://dev.to/mine_cune</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4003906%2Fa56572a7-8efb-4190-829c-b935d8c3af67.png</url>
      <title>DEV Community: Mine Cuneyitoglu</title>
      <link>https://dev.to/mine_cune</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mine_cune"/>
    <language>en</language>
    <item>
      <title>A Bug That Doesn't Crash Is Worse Than One That Does — Building a QUS Python Refresher</title>
      <dc:creator>Mine Cuneyitoglu</dc:creator>
      <pubDate>Mon, 24 Aug 2026 20:02:33 +0000</pubDate>
      <link>https://dev.to/mine_cune/a-bug-that-doesnt-crash-is-worse-than-one-that-does-building-a-qus-python-refresher-o1k</link>
      <guid>https://dev.to/mine_cune/a-bug-that-doesnt-crash-is-worse-than-one-that-does-building-a-qus-python-refresher-o1k</guid>
      <description>&lt;p&gt;I recently rebuilt my quantitative ultrasound (QUS) signal processing knowledge from scratch, in Python, as a five-notebook refresher repo. Along the way I reproduced a bug worth writing up on its own, because it never raised an exception — it just quietly returned zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Quantitative ultrasound tries to turn raw RF echo data into numbers that describe tissue — not just an image a radiologist reads, but a spectral slope or a backscatter coefficient that correlates with scatterer size, concentration, or fibrosis. The foundational method here is the Lizzi-Feleppa framework from 1983: fit a line to the log-power spectrum within a transducer's usable bandwidth, per depth window, and read off the slope, intercept, and midband value.&lt;/p&gt;

&lt;p&gt;To get this back into muscle memory, I built &lt;a href="https://github.com/minebyte/qus-python-refresher" rel="noopener noreferrer"&gt;&lt;code&gt;qus-python-refresher&lt;/code&gt;&lt;/a&gt; — five Jupyter notebooks that simulate an RF echo from point scatterers and walk through the full pipeline: pulse generation, envelope detection, moving-window spectral analysis, and Lizzi-Feleppa parameter estimation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug
&lt;/h2&gt;

&lt;p&gt;Point-scatterer echo simulation needs two separate time axes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;short&lt;/strong&gt; axis just long enough to hold the transmit pulse (&lt;code&gt;t_pulse&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;long&lt;/strong&gt; axis covering the full imaging depth (&lt;code&gt;t&lt;/code&gt;), onto which delayed, scaled copies of the pulse get summed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building the pulse on the wrong axis — reusing &lt;code&gt;t&lt;/code&gt; instead of &lt;code&gt;t_pulse&lt;/code&gt; — is an easy mistake. The Gaussian envelope still decays to numerical zero away from its center, so if you plot the "pulse" it looks completely normal. The array itself, though, is now the same length as the full echo instead of a few dozen samples.&lt;/p&gt;

&lt;p&gt;The consequence shows up in the placement loop's bounds check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pulse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rf&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;rf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pulse&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pulse&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With a pulse the same length as &lt;code&gt;rf&lt;/code&gt;, &lt;code&gt;idx + len(pulse) &amp;gt;= len(rf)&lt;/code&gt; for every &lt;code&gt;idx &amp;gt;= 0&lt;/code&gt; — the condition can never be true. In a 200-scatterer test I ran to confirm this: &lt;strong&gt;0 out of 200&lt;/strong&gt; scatterers get placed with the buggy pulse, versus 200 out of 200 with the correctly-scoped one. &lt;code&gt;rf&lt;/code&gt; comes back as a normal, correctly-shaped, all-zero array. No exception. No warning. Just silence.&lt;/p&gt;

&lt;p&gt;That's the failure mode worth internalizing: shape mismatches that happen to broadcast are more dangerous than the ones that crash loudly. A flat line in a B-mode image would be an easy bug to notice; buried a few layers deep in a larger pipeline, it isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the repo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;01 — RF Pulse and Envelope.&lt;/strong&gt; A single transmit pulse, Hilbert transform, envelope, phase, log compression. No scatterers yet, on purpose — isolates the RF-to-B-mode pipeline before the second time axis shows up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;02 — Scatterer Echo Simulation.&lt;/strong&gt; The bug above, reproduced with real numbers. Also: diffuse (Rayleigh-regime) vs. specular scattering, and frequency-dependent attenuation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;03 — Moving-Window Spectral Analysis.&lt;/strong&gt; &lt;code&gt;scipy.signal.spectrogram&lt;/code&gt;'s default window is Tukey(0.25), not rectangular — easy to assume otherwise if you never pass &lt;code&gt;window=&lt;/code&gt; explicitly. This notebook compares window lengths (1/3/10 µs — a real axial-resolution-vs-frequency-resolution trade-off) and window types (rectangular vs. Hann, and the leakage difference between them).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;04 — Lizzi-Feleppa Slope Estimation.&lt;/strong&gt; Slope, intercept, midband fit, per depth window. The interesting result here: scaling echo amplitude by 5x shifts intercept and midband by very close to the theoretical &lt;code&gt;20·log10(5) = 13.98 dB&lt;/code&gt; — but only once you exclude depth windows that sit before the first scatterer, where both runs are noise-floor-dominated and the shift is 0 dB regardless of gain. Averaging over the full depth range without that exclusion gave a misleading ~9.9 dB, and figuring out why was a good reminder to sanity-check estimator behavior against a known-zero baseline before trusting a summary statistic. Slope itself, unlike intercept/midband, comes out essentially unchanged by the gain — which is exactly why reference phantom normalization exists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;05 — Attenuation and Spectral Downshift.&lt;/strong&gt; Why an uncompensated spectral slope is depth-biased: attenuation removes high frequencies faster than low ones, so the local spectrum's shape — not just its amplitude — shifts with depth. Includes a spectral-centroid-vs-depth demo (the observable the spectral shift method is built on), without implementing the full reference-phantom-based compensation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shared numerics (pulse generation, scatterer field simulation, attenuation, spectral fitting) live in a small &lt;code&gt;src/qus_refresher&lt;/code&gt; package rather than being copy-pasted across notebooks, so a fix in one place doesn't drift out of sync elsewhere. Each notebook is stored twice — a &lt;a href="https://jupytext.readthedocs.io/" rel="noopener noreferrer"&gt;jupytext&lt;/a&gt; "percent format" &lt;code&gt;.py&lt;/code&gt; as the reviewable source, and an executed &lt;code&gt;.ipynb&lt;/code&gt; with real, embedded plot outputs.&lt;/p&gt;

&lt;p&gt;There's also a standalone &lt;a href="https://github.com/minebyte/qus-python-refresher/blob/master/NOMENCLATURE.md" rel="noopener noreferrer"&gt;&lt;code&gt;NOMENCLATURE.md&lt;/code&gt;&lt;/a&gt; — a working reference on RF/QUS terminology, formulas, and trade-offs, and a reading list starting from Oelze &amp;amp; Mamou's 2016 IEEE TUFFC review, through the original Lizzi et al. 1983 JASA paper, to Yao/Zagzebski's work on reference-phantom backscatter coefficient extraction. I also wrote it up as its own post — &lt;a href="https://dev.to/mine_cune/ultrasound-rf-qus-nomenclature-and-concepts-26g5"&gt;Ultrasound RF &amp;amp; QUS — Nomenclature and Concepts&lt;/a&gt; — if you'd rather read the reference on its own, independent of this repo's code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not in scope yet:&lt;/strong&gt; reference phantom normalization / backscatter coefficient extraction — most of the background papers behind this repo are specifically about that method, and it's the natural next notebook rather than something I decided to skip.&lt;/p&gt;

&lt;h2&gt;
  
  
  On how this got built
&lt;/h2&gt;

&lt;p&gt;I built this with Claude doing a lot of the actual scaffolding and notebook-writing in a pair-programming style — I described the physics and the pedagogical structure I wanted, reviewed and pushed back on the design (the shared &lt;code&gt;src/&lt;/code&gt; package split, the notebook boundaries, catching that misleading 9.9 dB average above), and every notebook was actually executed end-to-end rather than hand-assembled, so the numbers and plots in the repo are real outputs, not illustrative guesses. It's a genuinely useful way to work through this kind of refresher fast, as long as you're willing to interrogate the numbers it hands you back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/minebyte/qus-python-refresher" rel="noopener noreferrer"&gt;qus-python-refresher&lt;/a&gt; — public. &lt;code&gt;environment.yml&lt;/code&gt; + &lt;code&gt;pip install -e .&lt;/code&gt; gets you a working environment; each notebook runs standalone once the shared package is installed. Feedback, issues, and "actually your slope-invariance argument is wrong because..." are all welcome.&lt;/p&gt;

</description>
      <category>python</category>
      <category>signalprocessing</category>
      <category>opensource</category>
      <category>medicalimaging</category>
    </item>
    <item>
      <title>Ultrasound RF &amp; QUS — Nomenclature and Concepts</title>
      <dc:creator>Mine Cuneyitoglu</dc:creator>
      <pubDate>Mon, 24 Aug 2026 19:55:32 +0000</pubDate>
      <link>https://dev.to/mine_cune/ultrasound-rf-qus-nomenclature-and-concepts-26g5</link>
      <guid>https://dev.to/mine_cune/ultrasound-rf-qus-nomenclature-and-concepts-26g5</guid>
      <description>&lt;p&gt;A reference document for RF-domain ultrasound signal processing, beamforming, and quantitative ultrasound (QUS). Written as a compact, working manual for research engineers moving between the envelope and RF signal domains.&lt;/p&gt;

&lt;p&gt;Companion document to &lt;a href="https://github.com/minebyte/qus-python-refresher" rel="noopener noreferrer"&gt;&lt;code&gt;qus-python-refresher&lt;/code&gt;&lt;/a&gt;, a five-notebook Python refresher that implements the RF pulse → echo → moving-window spectral analysis → Lizzi-Feleppa pipeline this document describes. I wrote up the repo itself in a separate post — &lt;a href="https://dev.to/mine_cune/a-bug-that-doesnt-crash-is-worse-than-one-that-does-building-a-qus-python-refresher-o1k"&gt;A Bug That Doesn't Crash Is Worse Than One That Does&lt;/a&gt; — if you want the worked code and a genuinely silent bug alongside this reference.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Fundamental principles and trade-offs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 Time-frequency uncertainty (Heisenberg-Gabor)
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;Δ&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;Δ&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≥&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord mathnormal"&gt;π&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Time and frequency are dual domains; sharpness in one implies uncertainty in the other. This physical constraint underlies most ultrasound design trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short pulse ↔ wide bandwidth.&lt;/strong&gt; Broadband transducers require short pulses at the cost of transmitted energy and penetration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long spectral window ↔ coarse axial localization.&lt;/strong&gt; FFT bin width is &lt;code&gt;fs / N_window&lt;/code&gt;. Shorter windows yield finer axial resolution but coarser spectral resolution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High center frequency ↔ shallow penetration.&lt;/strong&gt; Frequency-dependent attenuation limits depth reach at higher f₀.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.2 Nyquist and aliasing
&lt;/h3&gt;

&lt;p&gt;Sampling rate must exceed &lt;code&gt;2 × f_max&lt;/code&gt;. RF signals typically sampled at 40-60 MHz; IQ (baseband) sampling requires only &lt;code&gt;&amp;gt; BW&lt;/code&gt; due to complex sampling. Aliasing manifests as spectral folding and is the most common silent error in prototyping — the code runs, the result is wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.3 Born approximation (single scattering)
&lt;/h3&gt;

&lt;p&gt;Most QUS models assume single scattering. Multiple scattering regimes (fatty liver, tissues with many interfaces) violate this assumption and complicate clinical interpretation.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.4 Ergodicity assumption
&lt;/h3&gt;

&lt;p&gt;Regional statistics computed from a single image assume time-averaging equals ensemble-averaging. Rarely validated in practice.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Spatial resolution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Axial resolution
&lt;/h3&gt;

&lt;p&gt;Resolution along the beam axis, set by pulse duration:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;x&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;ia&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;l&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;τ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;where τ is pulse duration. Short pulses improve axial resolution. Typical values: ~0.6 mm at 5 MHz with a 2-cycle pulse.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Lateral resolution
&lt;/h3&gt;

&lt;p&gt;Resolution perpendicular to the beam axis, set by beam width:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;D&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;λ&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;λ&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;F&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;mb&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;er&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;where z is focal depth and D is aperture width. F-number is defined as z/D. Small F-number implies wide aperture and improved lateral resolution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frs1p5ycc1i43y9w3t0ge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frs1p5ycc1i43y9w3t0ge.png" alt="Lateral beam profile narrowing toward the focus and widening beyond it, at 10/20/30/40 mm depth, with the -6 dB level marked" width="520" height="698"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: Lateral beam profile narrowing toward the focus and widening beyond it, shown at 10/20/30/40 mm depth, with the −6 dB level marked.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2.3 Elevational resolution
&lt;/h3&gt;

&lt;p&gt;Slice thickness of the imaging plane. In 1D arrays, determined by physical lens design (typically 3-5 mm). 2D matrix probes improve this through electronic focusing.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.4 Resolution cell (resolution volume)
&lt;/h3&gt;

&lt;p&gt;Intersection of axial, lateral, and elevational resolutions. The number of scatterers within the resolution cell determines the local speckle statistics regime:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many scatterers (&amp;gt;10) → fully developed speckle, Rayleigh (Nakagami m ≈ 1)&lt;/li&gt;
&lt;li&gt;Few scatterers + specular components → sub-Rayleigh, Nakagami m &amp;lt; 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F22po81sw7r4ffc786bo9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F22po81sw7r4ffc786bo9.png" alt="Ultrasound image axes, resolution cell, and full-width-half-maximum (FWHM)" width="800" height="246"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: Ultrasound image axes, resolution cell, and full-width-half-maximum (FWHM). Previously published in Cüneyitoğlu Özkul &amp;amp; Mumcuoğlu, 2018.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2.5 Full Width Half Maximum (FWHM)
&lt;/h3&gt;

&lt;p&gt;Standard measure of beam profile or PSF width, taken at half of maximum amplitude (approximately −6 dB). Used for cross-comparison of resolution across systems.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.6 Depth of field (DOF)
&lt;/h3&gt;

&lt;p&gt;Length of the focal zone. Scales with F-number squared:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;D&lt;/span&gt;&lt;span class="mord mathnormal"&gt;OF&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;7.1&lt;/span&gt;&lt;span class="mord mathnormal"&gt;λ&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;F&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;mb&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;er&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;This approximation is for a &lt;strong&gt;linear (1D) array&lt;/strong&gt;; curvilinear and phased arrays have different beam geometry (diverging aperture, sector scanning) and DOF does not follow the same F-number scaling without modification.&lt;/p&gt;

&lt;p&gt;Small F-number improves lateral resolution but reduces DOF — a fundamental trade-off in fixed-focus systems and one motivation for plane-wave imaging.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Transmit chain
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Center frequency (f₀)
&lt;/h3&gt;

&lt;p&gt;Peak frequency of the transducer response. Typical clinical range 2-15 MHz. Higher f₀ yields better resolution but reduced penetration; lower f₀ is used for deep applications (cardiac, obstetric).&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Fractional bandwidth
&lt;/h3&gt;

&lt;p&gt;Spectral width around f₀ expressed as a fraction. BW = 0.6 means −6 dB points span 60% of f₀. Broadband transducers (BW &amp;gt; 0.7) benefit two &lt;em&gt;independent&lt;/em&gt; things, not one dependent on the other: harmonic imaging (needs enough sensitivity at both f₀ and 2f₀ to transmit and receive on the same element) and reliable QUS spectral fitting (needs enough usable bandwidth for a stable slope/intercept/midband estimate — see section 7.1-7.3). QUS itself is ordinarily performed entirely at the fundamental frequency; it does not require harmonic content.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Pulse duration
&lt;/h3&gt;

&lt;p&gt;Clinical pulses typically span 1-3 cycles; &lt;code&gt;τ ≈ n_cycles / f₀&lt;/code&gt;. Short duration yields wide bandwidth and improved axial resolution.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 Transmit apodization
&lt;/h3&gt;

&lt;p&gt;Weighting of array elements during transmission (Hamming, Hann, Tukey windows) to shape the beam pattern and suppress side lobes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.5 Transmit focus
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DAS (Delay-and-Sum):&lt;/strong&gt; Focused to a specific depth via TX delay pattern — see section 4.1 for the full beamforming description.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plane wave imaging:&lt;/strong&gt; No transmit focus; the entire field of view is insonified by a plane (or diverging) wavefront. Focusing is deferred to receive-side software beamforming.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Beamforming approaches
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Delay-and-Sum (DAS)
&lt;/h3&gt;

&lt;p&gt;Classical approach. Applies element-wise delays and sums the received signals per image line. Focused TX and RX give line-by-line images. Frame rate is limited by the number of scan lines and pulse repetition time.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 Plane wave / Synthetic aperture
&lt;/h3&gt;

&lt;p&gt;TX is unfocused (plane or diverging wave); the entire volume is reconstructed simultaneously via receive-side software beamforming. Frame rates exceed 5000 Hz. Enables ultrafast imaging modalities like shear wave elastography.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coherent compounding.&lt;/strong&gt; Combining RF responses from multiple plane-wave angles by complex (pre-envelope) summation, preserving phase. Introduced to clinical practice by SuperSonic Imagine.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3 Adaptive beamforming
&lt;/h3&gt;

&lt;p&gt;Data-dependent element weights instead of uniform apodization. Improves contrast and resolution at higher computational cost.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MVDR / Capon:&lt;/strong&gt; Minimum variance criterion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DAX:&lt;/strong&gt; Dual apodization with cross-correlation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Predominantly research-domain at present.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.4 Receive apodization
&lt;/h3&gt;

&lt;p&gt;Element weighting on reception to shape the acceptance pattern. Trade-off between resolution and sensitivity to off-axis signals.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.5 F-number
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;F# = focal_depth / aperture_width&lt;/code&gt;. Standard descriptor of beam narrowness.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Signal chain (RF to B-mode)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 RF (radiofrequency)
&lt;/h3&gt;

&lt;p&gt;Raw ADC output. Real-valued, zero-mean, carries the carrier frequency and phase information. Typically sampled at 40-60 MHz. &lt;strong&gt;Phase carries diagnostic information that is lost in later stages of the chain.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 IQ / baseband / analytic signal
&lt;/h3&gt;

&lt;p&gt;Complex baseband representation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Z(t) = I(t) + jQ(t)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Envelope: &lt;code&gt;|Z|&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Phase: &lt;code&gt;angle(Z)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obtained via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quadrature demodulation:&lt;/strong&gt; Multiply by &lt;code&gt;cos(2πf₀t)&lt;/code&gt; and &lt;code&gt;sin(2πf₀t)&lt;/code&gt;, then low-pass filter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hilbert transform:&lt;/strong&gt; &lt;code&gt;Z = RF + j·H{RF}&lt;/code&gt;, then frequency shift to baseband.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Complex sampling reduces required rate to &lt;code&gt;&amp;gt; BW&lt;/code&gt;, decreasing data volume by a factor of 3-4.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 Envelope detection
&lt;/h3&gt;

&lt;p&gt;Magnitude of the analytic signal. Discards phase, retaining only amplitude modulation. Envelope statistics (Rayleigh, Rician, Nakagami) are defined at this stage.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.4 Log compression
&lt;/h3&gt;

&lt;p&gt;Logarithmic mapping of envelope for display:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bmode = 20·log₁₀(envelope / max_envelope), clipped to [-60, 0] dB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Compresses the 60+ dB dynamic range for visualization. Must generally be inverted for downstream QUS analysis.&lt;/p&gt;
&lt;h3&gt;
  
  
  5.5 Scan conversion
&lt;/h3&gt;

&lt;p&gt;Coordinate transformation from acquisition geometry (polar for sector/curvilinear probes) to Cartesian display grid.&lt;/p&gt;
&lt;h3&gt;
  
  
  5.6 Time Gain Compensation (TGC)
&lt;/h3&gt;

&lt;p&gt;Depth-dependent gain applied at reception to compensate for attenuation. Operator-adjustable in clinical systems. Must be characterized and removed for quantitative measurements.&lt;/p&gt;


&lt;h2&gt;
  
  
  6. Attenuation and tissue properties
&lt;/h2&gt;
&lt;h3&gt;
  
  
  6.1 Attenuation coefficient (α)
&lt;/h3&gt;

&lt;p&gt;Units: dB/cm/MHz. Approximate values in soft tissue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fat: 0.6&lt;/li&gt;
&lt;li&gt;Liver: 0.5-0.7&lt;/li&gt;
&lt;li&gt;Muscle: 1.0-1.5&lt;/li&gt;
&lt;li&gt;Bone: &amp;gt;10&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Attenuation increases approximately linearly with frequency, producing a depth-dependent spectral downshift that must be compensated in QUS.&lt;/p&gt;
&lt;h3&gt;
  
  
  6.2 Backscatter coefficient (BSC)
&lt;/h3&gt;

&lt;p&gt;Scattered energy per unit volume per unit solid angle, as a function of frequency. The central quantity in QUS, extracted via reference phantom normalization.&lt;/p&gt;
&lt;h3&gt;
  
  
  6.3 Speed of sound (c)
&lt;/h3&gt;

&lt;p&gt;Clinical convention: 1540 m/s. Actual values vary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fat: ~1450 m/s&lt;/li&gt;
&lt;li&gt;Soft tissue: 1540 m/s&lt;/li&gt;
&lt;li&gt;Bone: ~4000 m/s&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deviations impact beamforming accuracy and elastography interpretation.&lt;/p&gt;
&lt;h3&gt;
  
  
  6.4 Scattering regimes (ka dependence)
&lt;/h3&gt;

&lt;p&gt;Ratio of scatterer size (a) to wavelength (λ) governs the scattering behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ka &amp;lt;&amp;lt; 1 (Rayleigh):&lt;/strong&gt; σ_bs ∝ f⁴, isotropic scattering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ka ~ 1 (Mie / resonance):&lt;/strong&gt; Oscillatory frequency dependence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ka &amp;gt;&amp;gt; 1 (geometric):&lt;/strong&gt; Specular reflection, tissue interfaces.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most soft-tissue scatterers fall in the Rayleigh regime for clinical ultrasound frequencies.&lt;/p&gt;
&lt;h3&gt;
  
  
  6.5 Acoustic impedance mismatch
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Z = ρ·c&lt;/code&gt;. Reflection coefficient at an interface:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;Z&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;Z&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;Z&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;Z&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;p&gt;Typical values: ~1% at soft tissue interfaces, ~50%+ at soft tissue/bone, ~100% at soft tissue/air.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. QUS parameters (Lizzi-Feleppa framework)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 Spectral slope (dB/MHz)
&lt;/h3&gt;

&lt;p&gt;Slope of a linear fit to the calibrated log-power spectrum within the usable transducer bandwidth. Sensitive to scatterer size, attenuation, and depth.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.2 Spectral intercept (dB)
&lt;/h3&gt;

&lt;p&gt;Extrapolated fit value at 0 MHz. Sensitive to effective scatterer concentration.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.3 Midband fit (dB)
&lt;/h3&gt;

&lt;p&gt;Fit value at f₀. Reflects total backscattered energy in the band.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.4 Effective scatterer diameter (ESD)
&lt;/h3&gt;

&lt;p&gt;Scatterer size estimate from spectral shape, using Gaussian or spherical form-factor models. Associated with the Insana-Wagner framework.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.5 Effective scatterer concentration (ESC)
&lt;/h3&gt;

&lt;p&gt;Number of scatterers per unit volume, derived from spectral amplitude.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.6 Reference phantom method
&lt;/h3&gt;

&lt;p&gt;To isolate tissue backscatter from system response (transducer response, TGC, beamforming), the in vivo spectrum is normalized by that of a phantom with known backscatter properties, imaged with identical acquisition parameters. This is a required step in quantitative QUS.&lt;/p&gt;

&lt;p&gt;Key references: Yang &amp;amp; Zagzebski 1990; Yao &amp;amp; Zagzebski 1990.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.7 Attenuation compensation
&lt;/h3&gt;

&lt;p&gt;Correction for depth-dependent spectral downshift. Common methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spectral shift method&lt;/li&gt;
&lt;li&gt;Spectral difference method&lt;/li&gt;
&lt;li&gt;Hybrid method (Kim &amp;amp; Varghese 2007)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. Envelope statistics
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8.1 Rayleigh distribution
&lt;/h3&gt;

&lt;p&gt;Envelope of a zero-mean complex Gaussian process. Corresponds to fully developed speckle from many independent scatterers:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter"&gt;&lt;span class="delimsizing size3"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter"&gt;&lt;span class="delimsizing size3"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  8.2 Rician (Rice) distribution
&lt;/h3&gt;

&lt;p&gt;Rayleigh with an added coherent component. Characterized by the K-factor:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;K = coherent_power / diffuse_power&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  8.3 K distribution
&lt;/h3&gt;

&lt;p&gt;Envelope model for sub-Rayleigh regimes with few effective scatterers per resolution cell.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.4 Nakagami distribution
&lt;/h3&gt;

&lt;p&gt;Generalized envelope model. The shape parameter m spans:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;m &amp;lt; 1&lt;/code&gt;: pre-Rayleigh clustering (sub-Rayleigh)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;m = 1&lt;/code&gt;: Rayleigh (fully developed)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;m &amp;gt; 1&lt;/code&gt;: post-Rayleigh (coherent structures)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.5 Homodyned-K distribution
&lt;/h3&gt;

&lt;p&gt;Two-parameter model capturing coherent, diffuse, and sub-Rayleigh regimes. Preferred in modern QUS envelope statistics.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.6 Speckle
&lt;/h3&gt;

&lt;p&gt;Coherent interference pattern from unresolved scatterers within the resolution cell. Not stochastic noise: repeat imaging of the same region reproduces the same pattern. Carries diagnostic information exploitable via statistical modeling.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Simulation tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9.1 Field II (Jensen 1996)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Approach:&lt;/strong&gt; Linear systems using spatial impulse response (Tupholme-Stepanishen).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Covers:&lt;/strong&gt; Transducer geometry, focused/phased-array beamforming, point scatterer response, B-mode imaging simulation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does not cover:&lt;/strong&gt; Nonlinearity, refraction, reflection at heterogeneous boundaries, wave-medium interaction beyond linear scattering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typical runtime:&lt;/strong&gt; Seconds to minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use for:&lt;/strong&gt; B-mode phantom simulation, beamformer development, QUS pipeline testing, teaching.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.2 k-Wave (Treeby &amp;amp; Cox 2010)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Approach:&lt;/strong&gt; Full-wave PDE solver on a k-space pseudospectral grid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Covers:&lt;/strong&gt; Nonlinearity (Westervelt equation), heterogeneous attenuation, refraction, reflection, complex boundary geometries, photoacoustic sources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; Computationally intensive; overkill for simple point-scatterer B-mode simulation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typical runtime:&lt;/strong&gt; Minutes to hours (accelerated with GPU).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use for:&lt;/strong&gt; Photoacoustic reconstruction, HIFU treatment planning, aberration studies, nonlinear harmonic imaging, situations requiring full wave physics.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.3 Selection guide
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Preferred tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;B-mode phantom simulation&lt;/td&gt;
&lt;td&gt;Field II&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QUS pipeline testing&lt;/td&gt;
&lt;td&gt;Field II&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beamformer development&lt;/td&gt;
&lt;td&gt;Field II&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HIFU / therapeutic ultrasound&lt;/td&gt;
&lt;td&gt;k-Wave&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Photoacoustic imaging&lt;/td&gt;
&lt;td&gt;k-Wave&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aberration correction&lt;/td&gt;
&lt;td&gt;k-Wave&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nonlinear harmonic imaging&lt;/td&gt;
&lt;td&gt;k-Wave&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rapid prototyping&lt;/td&gt;
&lt;td&gt;Custom NumPy/SciPy pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  9.4 Python ecosystem
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;k-wave-python&lt;/strong&gt; — Official Python port of k-Wave (waltsims/k-wave-python). Provides both a pure NumPy/CuPy solver and an interface to the compiled C++/CUDA k-Wave binaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;jwave&lt;/strong&gt; — JAX-based, differentiable acoustic simulation. Suited to machine-learning integrated workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stride&lt;/strong&gt; — Medical ultrasound tomography framework.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;USBMD&lt;/strong&gt; — PyTorch-based differentiable beamforming library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PICMUS dataset&lt;/strong&gt; — Plane-wave imaging benchmark with reference beamformer implementations.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. Frequently overlooked considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  10.1 Log-domain estimation bias
&lt;/h3&gt;

&lt;p&gt;Applying &lt;code&gt;log(S + noise)&lt;/code&gt; is nonlinear; bias grows as SNR decreases. The order of averaging and log transformation affects the result. Reference: Alam &amp;amp; Lizzi, UMB 2006.&lt;/p&gt;

&lt;h3&gt;
  
  
  10.2 Focal zone dependence
&lt;/h3&gt;

&lt;p&gt;Beam width varies with depth. Outside the focal zone, lateral resolution degrades, and QUS parameters become depth-biased — see Figure 1 (section 2.2) for the beam-width-vs-depth behavior this is describing.&lt;/p&gt;

&lt;h3&gt;
  
  
  10.3 Scattering anisotropy
&lt;/h3&gt;

&lt;p&gt;Most QUS models assume isotropic scatterers. Real tissue (muscle fibers, collagen) is anisotropic, so imaging angle influences spectral slope estimates.&lt;/p&gt;

&lt;h3&gt;
  
  
  10.4 Noise distribution across the chain
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;RF domain: approximately Gaussian&lt;/li&gt;
&lt;li&gt;Envelope: Rayleigh (envelope of Gaussian)&lt;/li&gt;
&lt;li&gt;Log domain: approximately Gumbel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estimator design should reflect the distribution at the analysis stage.&lt;/p&gt;

&lt;h3&gt;
  
  
  10.5 Window boundary effects
&lt;/h3&gt;

&lt;p&gt;Rectangular windowing produces spectral leakage. Hann or Hamming windows are generally preferred for QUS spectral estimation.&lt;/p&gt;

&lt;h3&gt;
  
  
  10.6 Log-domain windowing bias
&lt;/h3&gt;

&lt;p&gt;Shorter windows reduce local SNR, amplifying log-domain bias in slope estimation. Both mean and variance of the estimator can shift with window size.&lt;/p&gt;

&lt;h3&gt;
  
  
  10.7 Silent IQ demodulation errors
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Incorrect LPF cutoff causing spectral leakage&lt;/li&gt;
&lt;li&gt;Baseband sampling below Nyquist causing aliasing&lt;/li&gt;
&lt;li&gt;Hardware amplitude/phase imbalance between I and Q channels&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  11. Reading list (recommended order)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Oelze &amp;amp; Mamou (2016).&lt;/strong&gt; "Review of Quantitative Ultrasound: Envelope Statistics and Backscatter Coefficient Imaging and Contributions to Diagnostic Ultrasound." &lt;em&gt;IEEE TUFFC&lt;/em&gt;. Bridges envelope statistics and RF spectral analysis; most efficient starting point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lizzi, Greenebaum, Feleppa, Elbaum, Coleman (1983).&lt;/strong&gt; "Theoretical framework for spectrum analysis in ultrasonic tissue characterization." &lt;em&gt;JASA&lt;/em&gt; 73:1366-1373. Foundational reference for the Lizzi-Feleppa method.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yao, Zagzebski, Madsen (1990).&lt;/strong&gt; "Backscatter coefficient measurements using a reference phantom to extract depth-dependent instrumentation factors." &lt;em&gt;Ultrasonic Imaging&lt;/em&gt;. Practical protocol for reference phantom normalization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alam &amp;amp; Lizzi (2006).&lt;/strong&gt; "On the statistics of ultrasonic spectral parameters." &lt;em&gt;UMB&lt;/em&gt;. Log-domain bias analysis; relevant to Bayesian estimation workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bercoff, Tanter, Fink (2004).&lt;/strong&gt; "Supersonic shear imaging: a new technique for soft tissue elasticity mapping." &lt;em&gt;IEEE TUFFC&lt;/em&gt;. Foundational for plane wave imaging with coherent compounding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mamou &amp;amp; Oelze (eds.) (2013).&lt;/strong&gt; &lt;em&gt;Quantitative Ultrasound in Soft Tissues.&lt;/em&gt; Springer. Comprehensive treatment; chapters 1-2 are the most efficient overview.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;This started as a personal working reference, updated as new concepts and experimental observations get incorporated. The runnable side of it — pulse simulation, the moving-window spectral analysis, the Lizzi-Feleppa fits — lives in &lt;a href="https://github.com/minebyte/qus-python-refresher" rel="noopener noreferrer"&gt;qus-python-refresher&lt;/a&gt;, written up separately &lt;a href="https://dev.to/mine_cune/a-bug-that-doesnt-crash-is-worse-than-one-that-does-building-a-qus-python-refresher-o1k"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ultrasound</category>
      <category>medicalimaging</category>
      <category>signalprocessing</category>
      <category>reference</category>
    </item>
    <item>
      <title>US Speckle Models — Part 4: Correlated Speckle and Why iid Breaks</title>
      <dc:creator>Mine Cuneyitoglu</dc:creator>
      <pubDate>Thu, 30 Jul 2026 16:44:09 +0000</pubDate>
      <link>https://dev.to/mine_cune/us-speckle-models-part-4-correlated-speckle-and-why-iid-breaks-od5</link>
      <guid>https://dev.to/mine_cune/us-speckle-models-part-4-correlated-speckle-and-why-iid-breaks-od5</guid>
      <description>&lt;p&gt;Part 3 ended on a specific claim: local Nakagami m estimation turns speckle statistics into a tissue characterization map. The math is elegant, the interpretation is clinically motivated, and the parameter maps look convincing when you plot them.&lt;/p&gt;

&lt;p&gt;There is a second problem, independent of the log-compression issue we discussed in Part 3, and it's the one that quietly determines how much you can trust the m maps you produce.&lt;/p&gt;

&lt;p&gt;The problem: &lt;strong&gt;the standard estimator treats pixels as independent samples. They are not.&lt;/strong&gt; The point spread function of the imaging system couples every pixel to its neighbors, and the correlation length of that coupling is often comparable to the analysis window you're estimating m over. When that happens, the estimator you're using doesn't measure what you think it measures.&lt;/p&gt;

&lt;p&gt;This is the part of the story my PhD thesis actually addressed. Everything up to this point was setup. This is the payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  The independence assumption, stated cleanly
&lt;/h2&gt;

&lt;p&gt;Any local statistics estimator — method of moments, maximum likelihood, or anything derived from them — carries an implicit assumption that the samples inside the analysis window are drawn independently from the same distribution. The Nakagami moment estimator from Part 3:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;Var&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;E&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ω&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;E&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;works exactly when the samples 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="minner"&gt;…&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 inside the window are iid. Under iid, the sample moments converge to the population moments at the standard 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1/&lt;/span&gt;&lt;span class="mord sqrt"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span class="svg-align"&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="hide-tail"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 rate, and the estimator inherits that convergence.

&lt;p&gt;Ultrasound violates the iid assumption in a structural way. The received signal at each pixel is the convolution of the underlying tissue reflectivity with the imaging system's point spread function. Neighboring pixels are not independent draws — they are overlapping weighted sums of the same underlying scatterer contributions.&lt;/p&gt;

&lt;p&gt;Effective sample size drops. The estimator sees far fewer independent observations than the window contains. The variance of 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is systematically underestimated, and the mean of 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 carries a bias whose shape depends on the PSF.
&lt;h2&gt;
  
  
  What the correlation actually looks like
&lt;/h2&gt;

&lt;p&gt;Take a real B-mode frame. Pick a window inside a visually homogeneous region — parenchyma, no boundaries, no obvious structural transitions. Compute the 2D autocorrelation function of the intensity, normalized to unity at zero lag. Look at the result.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gsrxba89z9zb0ppxkdt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gsrxba89z9zb0ppxkdt.png" alt="Autocorrelation of a homogeneous parenchyma patch — the finite width is the PSF footprint" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Under an iid model, the autocorrelation would be a delta function: unity at zero lag, exactly zero everywhere else. What you actually see is a finite-width bump — anisotropic, tighter along the axial direction, wider along the lateral direction. That bump is the imaging system's PSF, imprinted directly into the statistics of the image.&lt;/p&gt;

&lt;p&gt;The Wiener–Khinchin theorem makes this exact, under a wide-sense stationary assumption for the local patch. The autocorrelation of the observation is the inverse Fourier transform of its power spectral density, and if the observation is a convolution of the underlying reflectivity with a linear PSF plus additive noise, the observation autocorrelation factors into contributions from each:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;τ&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;τ&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∗&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;h&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;τ&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;τ&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;where 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is the observation autocorrelation, 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is the underlying reflectivity autocorrelation, 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;h&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is the PSF autocorrelation, and 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is the additive noise autocorrelation (electronic noise, typically much smaller than the speckle-driven term). If the underlying reflectivity in a homogeneous region is approximately white and the additive noise is small, 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is a delta, and 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;h&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 — the autocorrelation of the image is essentially the autocorrelation of the PSF.

&lt;p&gt;Measure the half-width of the observation autocorrelation, and you have a lower bound on the PSF's spatial support. In the parenchyma patch here, that lower bound comes out to roughly 12 pixels laterally and 6 pixels axially — an anisotropic footprint on the order of a 70-pixel neighborhood of correlated area. If your Nakagami analysis window is 32×32 or smaller, the number of effectively independent samples inside it is very small.&lt;/p&gt;
&lt;h2&gt;
  
  
  What this costs a naive m estimator
&lt;/h2&gt;

&lt;p&gt;The consequences are concrete, and they show up as three specific failure modes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Underestimated uncertainty.&lt;/strong&gt; Confidence intervals derived from the iid assumption are too narrow. A significance test on regional m differences will reject the null too often — false positives on tissue characterization, and downstream decisions built on those false positives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Smoothed boundaries.&lt;/strong&gt; The PSF integrates across boundaries between statistically distinct regions. Windows that straddle a boundary produce m estimates that are neither the m of one side nor the other — they are a PSF-weighted mixture. Boundaries in the m map blur exactly as a function of PSF width. The tissue characterization loses spatial resolution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. PSF-shaped bias.&lt;/strong&gt; In regions with strong PSF-scale intensity variation (near boundaries, near strong reflectors), the correlation between neighboring pixels systematically distorts the moment ratio the estimator relies on. The bias isn't random — it's a shape imprinted by the PSF onto the m map, and it can be mistaken for real tissue variation if you don't know what to look for. (I made this mistake myself early on — for a while I was reading PSF footprints as tissue heterogeneity in my own parametric maps, and it took actually measuring the correlation to see it wasn't real.)&lt;/p&gt;

&lt;p&gt;Most Nakagami-based QUS papers publish local m maps without measuring the correlation length of the data they estimated on. That's not a small omission. The difference between a tissue map and a PSF-shaped bias is exactly the thing you're supposed to be measuring.&lt;/p&gt;
&lt;h2&gt;
  
  
  The fix isn't post-hoc
&lt;/h2&gt;

&lt;p&gt;The wrong move — and the tempting one — is to treat this as a denoising problem. Take the raw m map, apply some smoothing that assumes correlated observations, and call the result cleaner. This does not work, because the PSF footprint is already baked into the observation before you started estimating. Smoothing the estimate doesn't unsmooth what the PSF did to the samples.&lt;/p&gt;

&lt;p&gt;The right move is to fold the PSF into the observation model before you estimate anything. Restoration is not a post-processing step applied to the parameter map — it is a re-formulation of what you are estimating in the first place.&lt;/p&gt;

&lt;p&gt;Concretely: model the observation as&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;D&lt;/span&gt;&lt;span class="mord mathnormal"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;where 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is the observed image (in vectorized form), 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is the underlying high-resolution reflectivity, 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is the blur matrix representing the PSF, 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;D&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is a decimation matrix, and 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is additive noise with a known correlation structure. On log-compressed B-mode data the additive Gaussian assumption for 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is a workable simplification — not exact, but appropriate enough that the algebra stays tractable and the recovered images look right on tissue.

&lt;p&gt;The estimator becomes the maximum-a-posteriori solution:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mop"&gt;ar&lt;span&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord accent mtight"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay mtight"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop"&gt;max&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∣&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;The likelihood carries the PSF and the noise correlation structure. Under a correlated Gaussian noise model with covariance matrix 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
, the likelihood is a multivariate Gaussian, and the exponent of the negative log-posterior comes out to:


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;C&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;λ&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;Φ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;where 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;Φ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is a prior penalizing local dissimilarities in the reflectivity, and 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;λ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 controls the tradeoff.

&lt;p&gt;The PSF is not a nuisance in this formulation — it is inside 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
. The pixel correlations are not ignored — they are inside 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;C&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
. Every pixel in the analysis window contributes to the estimate without pretending it is independent of its neighbors.

&lt;p&gt;The practical challenge is inverting 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 for a full image. It is a large matrix, and a naive inversion is not tractable. But 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 is banded and sparse — the correlation dies off quickly with distance — and the operation you actually need in gradient descent is 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;C&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;r&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 for the current residual, which can be computed by an inner iterative solve. On a GPU this becomes feasible.

&lt;h2&gt;
  
  
  What my thesis actually built
&lt;/h2&gt;

&lt;p&gt;The full formulation is in &lt;a href="https://doi.org/10.1177/0161734619865961" rel="noopener noreferrer"&gt;Ultrasonic Imaging, 2019&lt;/a&gt;. The short summary, in one paragraph:&lt;/p&gt;

&lt;p&gt;I built a Bayesian restoration framework for freehand B-mode ultrasound that folds three ingredients into a single observation model: a measured PSF (not one assumed from theoretical beam geometry), a spatially correlated speckle noise model (with correlation structure estimated from data), and an image prior appropriate for tissue-like reflectivity. The framework produces two things: a single-image restoration (BR-CG) that recovers the underlying reflectivity from one B-mode acquisition given the measured system model, and a multi-image super-resolution extension (BSRR-CG) that combines several freehand frames with estimated sub-pixel displacements to produce a higher-resolution reconstruction. Both were validated against classical methods (Wiener, anisotropic diffusion, bilateral filtering) on tissue-mimicking phantoms and on clinical images evaluated by five radiologists in a visual grading study.&lt;/p&gt;

&lt;p&gt;The framework was validated on log-compressed data from a commercial hospital scanner, not on lab RF or simulated envelope data. That constraint shaped every choice in the formulation, and it is what makes the method transfer to real clinical acquisitions — the domain the published QUS literature quietly avoids.&lt;/p&gt;

&lt;p&gt;Three things about that formulation are worth flagging, because they are not obvious from the abstract:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The PSF was measured, not assumed.&lt;/strong&gt; A tissue-mimicking phantom with a single high-echogenicity nylon wire target — approximately a point reflector at known depth — was imaged with the same scanner and settings used for the clinical acquisitions. The PSF was extracted by dividing the Fourier transform of the observed small blurred image by the Fourier transform of the expected ideal (a one-pixel dot), and transforming back. Nine axial by seventeen lateral pixels of extent, measured, not modelled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The correlated noise model was estimated from data, using the same frequency-domain logic.&lt;/strong&gt; Large uniform regions of the tissue-mimicking phantom were treated as approximately white reflectivity, so their observed autocorrelation is dominated by the PSF autocorrelation — exactly the Wiener–Khinchin relationship laid out above. The autocorrelation was measured over forty-nine non-overlapping patches for statistical stability. Correlation lengths came out to three axial and eight lateral pixels at 10% of peak. In the same phantom the PSF measurement and the noise correlation measurement are two views of the same physical system — one direct (the impulse response), one energetic (the autocorrelation). Folding both into the observation model closes the loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The restoration was single-image before it was multi-image.&lt;/strong&gt; Multi-frame super-resolution is a natural extension once you have a single-frame observation model, but the single-frame case is where the correlated-noise likelihood actually does its work. The multi-frame case adds a sub-pixel registration problem on top; it doesn't remove the need for the correlated observation model. In practice, BSRR-CG — the multi-image correlated-Gaussian formulation — was the only method in the study that consistently improved contrast-to-noise ratio across all target sizes on the tissue-mimicking phantom, and it received the highest scores from the radiologists in the visual grading study.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next: how do you measure a PSF you can't calculate from first principles
&lt;/h2&gt;

&lt;p&gt;The observation-model reformulation is only as good as the PSF you fold into it. If you assume a PSF and estimate parameters, you inherit every error in your PSF assumption as a bias in your parameter map. If you measure a PSF, you inherit the measurement error — but the measurement error is usually much smaller than a first-principles guess, especially for commercial scanners whose beam-forming details are not published.&lt;/p&gt;

&lt;p&gt;The next mini-series is about measuring a PSF you can't calculate. A phantom, a point target, an FFT, and a series of decisions about what to do when the measurement doesn't match the beautiful separable Gaussian your theory wanted. It turns out that's its own story.&lt;/p&gt;




&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The full formulation and validation: &lt;a href="https://doi.org/10.1177/0161734619865961" rel="noopener noreferrer"&gt;Ultrasonic Imaging, 2019&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ORCID (all publications): &lt;a href="https://orcid.org/0000-0003-2633-9371" rel="noopener noreferrer"&gt;0000-0003-2633-9371&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;I take on selective remote consulting on medical imaging and adjacent systems engineering problems — particularly on data from commercial hospital scanners rather than research-grade RF, and on system-level integration where imaging meets motion control. Reach out via LinkedIn if that's the kind of problem you're working on.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ultrasound</category>
      <category>medicalimaging</category>
      <category>signalprocessing</category>
      <category>math</category>
    </item>
    <item>
      <title>US Speckle Models — Part 3: m as a Tissue Map</title>
      <dc:creator>Mine Cuneyitoglu</dc:creator>
      <pubDate>Sat, 25 Jul 2026 06:46:01 +0000</pubDate>
      <link>https://dev.to/mine_cune/part-3-m-is-not-just-a-parameter-its-a-tissue-map-4e7h</link>
      <guid>https://dev.to/mine_cune/part-3-m-is-not-just-a-parameter-its-a-tissue-map-4e7h</guid>
      <description>&lt;p&gt;Two posts ago I argued that ultrasound speckle isn't random noise — it's the interference pattern of many sub-resolution scatterers, and its statistics carry information about the tissue that produced it. Rayleigh distribution was the classical model: mathematically elegant, physically motivated, but built on assumptions that break in real tissue.&lt;/p&gt;

&lt;p&gt;Nakagami generalized Rayleigh. Same physical intuition, one extra parameter, and the freedom to adapt to whatever scatterer density the tissue actually has.&lt;/p&gt;

&lt;p&gt;Last post I laid out the Nakagami PDF and what each term does. This post is where it stops being a math exercise and starts being clinically useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  From distribution to map
&lt;/h2&gt;

&lt;p&gt;The Nakagami PDF is:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mpunct"&gt;;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ω&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;Γ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;ω&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;m&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;m&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;/&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;ω&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≥&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Two parameters carry the tissue information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;m&lt;/strong&gt; — shape parameter. Low m spreads the distribution out (few scatterers, high uncertainty in the envelope amplitude). High m sharpens the peak (many scatterers, predictable behavior).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ω&lt;/strong&gt; — scale parameter, equal to 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;E&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
. Sets the local mean intensity, normalizes for depth attenuation and gain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At m = 1, the whole expression collapses to Rayleigh. Nakagami includes Rayleigh as a single point in a continuum, then extends both directions — sub-Rayleigh (fewer scatterers, edges and boundaries) and super-Rayleigh (denser, more organized tissue).&lt;/p&gt;

&lt;p&gt;Here's the pivot that makes it clinically useful: &lt;strong&gt;m can be estimated locally&lt;/strong&gt;. Slide a small window across the image, compute the method-of-moments estimator inside it:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;Var&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;E&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ω&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;E&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;The output isn't a denoised image. It's a map — one m value per window, spatially varying, tracking whatever tissue characteristic changes as you move across the scan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Canonical envelope-domain values
&lt;/h2&gt;

&lt;p&gt;Published literature converges on a rough three-regime interpretation, all measured on &lt;strong&gt;raw envelope amplitude&lt;/strong&gt; before any display processing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;m ≈ 0.5&lt;/strong&gt; — lesion boundaries, cyst walls, tissue interfaces. Few scatterers per resolution cell, high variance in the envelope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;m ≈ 1.0&lt;/strong&gt; — fully developed speckle. What Rayleigh assumed everywhere. Homogeneous soft tissue at sufficient depth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;m &amp;gt; 1.5&lt;/strong&gt; — dense parenchyma, fibrous tissue, structured collagen. Many scatterers, predictable statistics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same image, three regimes, one model. That's the promise.&lt;/p&gt;

&lt;h2&gt;
  
  
  From the thesis: real B-mode, real fit
&lt;/h2&gt;

&lt;p&gt;Here's what happens when you actually run this on a real hospital scan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fur3sev7cam1yjhpbr8kz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fur3sev7cam1yjhpbr8kz.png" alt="Real B-mode from thesis, with three windowed regions and their Nakagami fits" width="800" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three 64×64 windows on a B-mode frame from my PhD data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A&lt;/strong&gt; — inside a dense, near-uniform lesion. High m: histogram is narrow, PDF nearly Gaussian-looking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B&lt;/strong&gt; — a homogeneous parenchyma region. Mid-range m, classic developed-speckle shape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C&lt;/strong&gt; — a heterogeneous zone with varying intensity. Low m, right-skewed distribution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The relative ordering matches the canonical interpretation: dense → high m, heterogeneous → low m. But the absolute m values are much higher than the 0.5–2 range the literature reports. The reason is what the image &lt;em&gt;is&lt;/em&gt;: this is not envelope amplitude. This is the display frame — log-compressed, gain-adjusted, gamma-corrected, 8-bit quantized.&lt;/p&gt;

&lt;p&gt;Log compression squashes the dynamic range. A distribution that looked broad and skewed in the envelope domain becomes narrower and more symmetric after compression. Method-of-moments picks that up as a higher m estimate. It's not wrong — it's just measuring m on a different variable than the textbook does.&lt;/p&gt;

&lt;p&gt;For most practical work, the &lt;strong&gt;relative&lt;/strong&gt; m ordering carries the tissue information. Absolute values shift with the specific compression curve of the scanner, but the ranking of regions doesn't.&lt;/p&gt;

&lt;p&gt;I'll come back to why this matters at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  For contrast: what the textbook world looks like
&lt;/h2&gt;

&lt;p&gt;If I simulate the same three regimes in the envelope domain — Nakagami-sampled directly, no compression, on a synthetic sector scan geometry — this is what I get:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fujxc03rx659rtxbk3ixi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fujxc03rx659rtxbk3ixi.png" alt="Synthetic sector scan with envelope-domain Nakagami sampling, showing three canonical m regimes" width="800" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two things worth noting from the contrast:&lt;/p&gt;

&lt;p&gt;First, the m values here (0.5, 1.0, 1.7) sit exactly where the canonical literature puts them. That's because this &lt;strong&gt;is&lt;/strong&gt; synthetic envelope amplitude, drawn directly from Nakagami distributions with those m values. No log compression, no display processing in between. The values are the ground truth, not an estimate contaminated by a display pipeline.&lt;/p&gt;

&lt;p&gt;Second, the PDF shapes are visibly cleaner — sharper mode separation, less overlap between regimes. Real clinical data doesn't look like this. Once you go through display processing, distributions compress toward each other, m estimates shift, and the model has to accommodate what the scanner actually outputs, not what a textbook assumes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where a lot of QUS quietly breaks
&lt;/h2&gt;

&lt;p&gt;This is where a lot of published quantitative ultrasound work quietly breaks when it hits real hospital data.&lt;/p&gt;

&lt;p&gt;Most method development happens on simulated envelope data or on lab-grade research scanners that expose raw RF or beamformed envelope. That's the world where the canonical m values live. It's a clean world, and the math works there.&lt;/p&gt;

&lt;p&gt;Real clinics don't run research scanners. They run commercial systems that output DICOM images with log compression, dynamic range mapping, and a proprietary post-processing pipeline you don't have access to. If you take a method validated on envelope-domain simulation and drop it on a hospital scanner's video output, three things happen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Absolute m values shift out of the calibration range the method assumes&lt;/li&gt;
&lt;li&gt;Distributions overlap more than the training data, so region classification degrades&lt;/li&gt;
&lt;li&gt;The relationship between m and underlying tissue reflectivity is no longer direct — there's a monotonic-but-nonlinear display curve sitting in between&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The math is right. The domain assumption isn't.&lt;/p&gt;

&lt;p&gt;You can still do useful QUS on log-compressed data. But you have to design for it — pick estimators that are compression-tolerant, work with relative rather than absolute m, and calibrate on the specific scanner's output curve. That's a different research program than "assume envelope, apply Nakagami."&lt;/p&gt;

&lt;h2&gt;
  
  
  Next: the other thing Nakagami by itself misses
&lt;/h2&gt;

&lt;p&gt;There's a second problem, independent of log compression. Nakagami models the amplitude distribution &lt;em&gt;at each pixel&lt;/em&gt;. It says nothing about the relationship &lt;em&gt;between&lt;/em&gt; pixels. And in ultrasound, that relationship is never zero: the PSF spreads every scatterer's signal across a neighborhood, and neighboring pixels are always weighted combinations of overlapping scatterer sets.&lt;/p&gt;

&lt;p&gt;Standard local m estimation treats those pixels as if they were independent samples. They aren't. Next post: why the iid assumption breaks, what it costs you, and what you have to fold into the observation model to fix it.&lt;/p&gt;




&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;My paper on Bayesian restoration for B-mode ultrasound, accounting for correlated speckle noise: &lt;a href="https://doi.org/10.1177/0161734619865961" rel="noopener noreferrer"&gt;Ultrasonic Imaging, 2019&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ORCID (all publications): &lt;a href="https://orcid.org/0000-0003-2633-9371" rel="noopener noreferrer"&gt;0000-0003-2633-9371&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;I take on selective remote consulting on ultrasound image quality, quantitative ultrasound, and restoration problems — particularly the messy real-clinical-data variety this post is about. Reach out via LinkedIn if that's the kind of problem you're working on.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ultrasound</category>
      <category>medicalimaging</category>
      <category>signalprocessing</category>
      <category>math</category>
    </item>
    <item>
      <title>US Speckle Models — Part 2: The Nakagami Distribution</title>
      <dc:creator>Mine Cuneyitoglu</dc:creator>
      <pubDate>Thu, 16 Jul 2026 17:53:20 +0000</pubDate>
      <link>https://dev.to/mine_cune/us-speckle-models-part-2-nakagami-distribution-3iio</link>
      <guid>https://dev.to/mine_cune/us-speckle-models-part-2-nakagami-distribution-3iio</guid>
      <description>&lt;p&gt;Part 1 argued that Rayleigh is the right model for one specific regime — many independent scatterers, homogeneous tissue, no interest in absolute quantitative recovery — and breaks in three important ways when tissue doesn't satisfy those conditions. This part is about the generalization that fixes the first two of those problems (scatterer count assumptions and the fixed-shape constraint) while explicitly &lt;em&gt;not&lt;/em&gt; fixing the third (pixel correlation). That last one waits until Part 4.&lt;/p&gt;

&lt;p&gt;The generalization is the Nakagami distribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it comes from
&lt;/h2&gt;

&lt;p&gt;The Nakagami distribution wasn't invented for ultrasound. Minoru Nakagami developed it in the 1940s to model the amplitude of received radio signals in HF propagation, where the received envelope showed variability the Rayleigh model couldn't capture — sometimes more, sometimes less. He wanted one flexible family that could sit anywhere along the spread-vs-concentration axis, with a single shape parameter to move between regimes.&lt;/p&gt;

&lt;p&gt;Medical ultrasound picked it up several decades later for the same reason: the envelope of the backscattered signal doesn't always look Rayleigh, and a single flexible family beats switching between separate models for boundaries, parenchyma, and fibrous tissue.&lt;/p&gt;

&lt;p&gt;The PDF:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mpunct"&gt;;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ω&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;Γ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;ω&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;m&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;m&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;/&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;ω&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≥&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Two parameters, one normalizing constant, one exponential kernel. Each piece is doing specific work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the terms
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;x — envelope amplitude.&lt;/strong&gt; The variable being modeled. This is what the scanner reconstructs from the beamformed complex signal and hands off as a pixel intensity, up to whatever post-processing sits between envelope detection and display. In the raw envelope domain, x is real and non-negative. In the display domain, x is the pixel value after log compression, gain, and gamma — related to the true envelope amplitude but not identical to it. Part 3 gets into what that difference costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;m — shape parameter.&lt;/strong&gt; This is the term that made Nakagami interesting for tissue characterization. It's dimensionless, non-negative, and controls how concentrated the distribution is around its mode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Low m (m &amp;lt; 1) → distribution spreads out, heavy tail, mode close to zero. Physically: few scatterers per resolution cell, high uncertainty in the envelope amplitude. Boundaries, interfaces, sparsely-scattering regions.&lt;/li&gt;
&lt;li&gt;m = 1 → Rayleigh case (details below). Fully developed speckle regime.&lt;/li&gt;
&lt;li&gt;High m (m &amp;gt; 1) → sharp peak, tight distribution, mode moves away from zero. Physically: many scatterers, more organized structure, predictable statistics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;m is not fixed by physics — it's estimated from the data. Give it a homogeneous parenchyma window and it comes back near 1. Give it a boundary or cyst wall and it comes back below 1. Give it dense fibrous tissue and it comes back above 1. The distribution adapts to what's actually there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ω — scale parameter.&lt;/strong&gt; Equal to 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;E&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
, the mean squared envelope amplitude. It sets the intensity level of the distribution — think of it as absorbing depth-dependent attenuation, gain settings, and any global scaling of the image. When you compare m between regions, ω is what you normalize by to strip out those global effects.

&lt;p&gt;&lt;strong&gt;Γ(m) — the gamma function.&lt;/strong&gt; The normalizing constant. It ensures the PDF integrates to 1 across all valid x. For integer m, 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;Γ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
; for non-integer m it interpolates smoothly. Its role here is structural — nothing physical, just what makes the math a proper probability distribution.

&lt;p&gt;&lt;strong&gt;exp(−mx²/ω) — the exponential kernel.&lt;/strong&gt; This is where the shape work happens. As m increases, this term penalizes large deviations from the mean more aggressively, which is what makes high-m distributions look tightly concentrated. As m decreases, the penalty softens, and the distribution spreads. All the intuition about "few scatterers → high uncertainty → wide distribution" and "many scatterers → predictable → tight distribution" is carried by this single term.&lt;/p&gt;

&lt;p&gt;The prefactor 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;m&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 shapes the low-x behavior — pulls the distribution away from zero as m grows, allows density at zero when m is small.
&lt;h2&gt;
  
  
  Rayleigh as a special case
&lt;/h2&gt;

&lt;p&gt;The claim that Nakagami reduces to Rayleigh at m = 1 is often stated but rarely shown. It's worth doing explicitly, because the substitution reveals how 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ω&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 and Rayleigh's 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 relate.

&lt;p&gt;Set m = 1 in the Nakagami PDF. Since 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;Γ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
:


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mpunct"&gt;;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ω&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;ω&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mclose"&gt;!&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter"&gt;&lt;span class="delimsizing size3"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;ω&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter"&gt;&lt;span class="delimsizing size3"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Compare to the Rayleigh PDF from Part 1:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mpunct"&gt;;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mclose"&gt;!&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter"&gt;&lt;span class="delimsizing size3"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter"&gt;&lt;span class="delimsizing size3"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;These match if 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ω&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
. So Nakagami's scale parameter is exactly twice the variance of the Gaussian I/Q components — the same physical quantity, written in a different convention.

&lt;p&gt;The offset issue from Part 1 carries through: at m = 1, the Nakagami mean is still 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="mord sqrt"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span class="svg-align"&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;π&lt;/span&gt;&lt;span class="mord"&gt;/2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="hide-tail"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 in the underlying units, and the envelope-to-scatterer-strength mapping still has that 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord sqrt"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span class="svg-align"&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;π&lt;/span&gt;&lt;span class="mord"&gt;/2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="hide-tail"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 factor sitting in the middle. Nakagami doesn't fix that — it wasn't designed to. What Nakagami fixes is the &lt;em&gt;shape rigidity&lt;/em&gt;.
&lt;h2&gt;
  
  
  What Nakagami buys you, and what it doesn't
&lt;/h2&gt;

&lt;p&gt;The right way to describe Nakagami is that it has no built-in &lt;em&gt;assumptions&lt;/em&gt; about scatterer count. Both parameters, m and ω, are free — estimated from the local data — and the model adapts to whatever regime the tissue is in. This is different from a model that has a hand-tuned hyperparameter you have to pick a priori.&lt;/p&gt;

&lt;p&gt;The standard estimator is method of moments:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;Var&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;E&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ω&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;E&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Both quantities come directly from the sample. There's a maximum-likelihood variant that's slightly more efficient in small windows, but for most practical purposes moment-based estimation is what the literature uses and what tools implement.&lt;/p&gt;

&lt;p&gt;What Nakagami does &lt;em&gt;not&lt;/em&gt; buy you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pixel independence.&lt;/strong&gt; The estimator above assumes samples inside the window are i.i.d. In ultrasound they aren't — the PSF spreads every scatterer's contribution across a neighborhood, and pixels are correlated by construction. Local m estimates carry a PSF-shaped bias that grows with the ratio of PSF width to window size. Part 4 is about this.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A separation between distribution and display.&lt;/strong&gt; Nakagami models the envelope amplitude. If your data has gone through log compression, gain adjustment, and gamma correction — which is what every commercial hospital scanner does before writing DICOM — the pixel values aren't envelope amplitudes anymore. You can still fit Nakagami, but the m you get is a pseudo-m on the display domain, not the true envelope-domain m. Part 3 is about this.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A guarantee that m corresponds to a specific tissue property.&lt;/strong&gt; m tracks the scatterer density in a statistical sense, but the mapping isn't one-to-one with any single clinical variable. Interpreting m maps as diagnostic requires calibration against ground truth for the specific tissue and scanner combination.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below are the visuals that accompanied the original discussion — Nakagami PDFs at several m values, and a formulation diagram tying the model to the physical scattering setup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frlwok6k0uthg4a34mspr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frlwok6k0uthg4a34mspr.png" alt="Nakagami PDF at several m values" width="600" height="404"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Nakagami probability density function shown for a range of shape parameter m values.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7rpi8bx7cuxiuircvobq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7rpi8bx7cuxiuircvobq.png" alt="Physical formulation of the Nakagami model in the ultrasound scattering setup" width="601" height="508"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Physical formulation tying the Nakagami model to the underlying scattering setup.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next
&lt;/h2&gt;

&lt;p&gt;Nakagami models the amplitude distribution at each pixel. What it doesn't model is the relationship between pixels — and that relationship is never zero in ultrasound, because the PSF couples them.&lt;/p&gt;

&lt;p&gt;Before we get to correlation, though, there's a step in between: what happens when you estimate m &lt;em&gt;locally&lt;/em&gt; across the image, sliding a window and producing a spatial map of the shape parameter. That's Part 3 — where Nakagami stops being a noise model and becomes a tissue characterization tool.&lt;/p&gt;




&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;My paper on Bayesian restoration for B-mode ultrasound, using a system model that folds in both Nakagami-like envelope statistics and correlated noise: &lt;a href="https://doi.org/10.1177/0161734619865961" rel="noopener noreferrer"&gt;Ultrasonic Imaging, 2019&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ORCID (all publications): &lt;a href="https://orcid.org/0000-0003-2633-9371" rel="noopener noreferrer"&gt;0000-0003-2633-9371&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Previous in series: Part 1 — Rayleigh Distribution
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;I take on selective remote consulting on ultrasound image quality, quantitative ultrasound, and restoration problems — particularly on data from commercial hospital scanners rather than research-grade RF. Reach out via LinkedIn if that's the kind of problem you're working on.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ultrasound</category>
      <category>medicalimaging</category>
      <category>signalprocessing</category>
      <category>math</category>
    </item>
    <item>
      <title>US Speckle Models — Part 1: Rayleigh Distribution</title>
      <dc:creator>Mine Cuneyitoglu</dc:creator>
      <pubDate>Fri, 10 Jul 2026 18:27:38 +0000</pubDate>
      <link>https://dev.to/mine_cune/us-speckle-models-part-1-rayleigh-34gm</link>
      <guid>https://dev.to/mine_cune/us-speckle-models-part-1-rayleigh-34gm</guid>
      <description>&lt;p&gt;Ultrasound speckle isn't random noise. It's physics.&lt;/p&gt;

&lt;p&gt;The bright-and-dark grainy texture you see in every B-mode image is not a sensor artifact and not electronic noise. It's the deterministic interference pattern of many sub-resolution acoustic scatterers, imaged through a finite-aperture point spread function. If you scanned the exact same tissue twice with the exact same probe position and settings, you'd get the exact same speckle. It's a signal, not a nuisance.&lt;/p&gt;

&lt;p&gt;The reason speckle &lt;em&gt;looks&lt;/em&gt; random is that the underlying scatterer configuration is unknown to us — we can't resolve individual scatterers, and small changes in probe position redistribute the interference pattern in ways we can't track. So we treat it statistically, and the first statistical model anyone reaches for is Rayleigh.&lt;/p&gt;

&lt;p&gt;This is Part 1 of a series on statistical models for ultrasound speckle. Here I'll cover where the Rayleigh model comes from, why it's a natural starting point, and the three specific places it stops holding up in real tissue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Rayleigh comes from
&lt;/h2&gt;

&lt;p&gt;Consider a single resolution cell containing many independent scatterers. Each scatterer contributes a complex-valued backscatter with some amplitude and phase. The total received signal is the coherent sum of all these contributions.&lt;/p&gt;

&lt;p&gt;If we split that sum into in-phase (I) and quadrature (Q) components:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;S&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;I&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;j&lt;/span&gt;&lt;span class="mord mathnormal"&gt;Q&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;j&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;ϕ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;where the scatterers have random amplitudes and random phases uniformly distributed on 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord mathnormal"&gt;π&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
, and N is large.

&lt;p&gt;By the Central Limit Theorem, both I and Q converge to zero-mean Gaussian distributions with equal variance 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
. The envelope amplitude — what the B-mode reconstruction actually visualizes — is the magnitude:


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord sqrt"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span class="svg-align"&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;I&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;Q&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="hide-tail"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;The magnitude of two independent zero-mean Gaussians with equal variance follows a Rayleigh distribution:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="mpunct"&gt;;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mclose"&gt;!&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter"&gt;&lt;span class="delimsizing size3"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter"&gt;&lt;span class="delimsizing size3"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≥&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;One parameter, 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
, related to the underlying scatterer population. Mathematically elegant, physically motivated, and analytically tractable. This is why the model has stayed in textbooks for decades.
&lt;h2&gt;
  
  
  Where it breaks
&lt;/h2&gt;

&lt;p&gt;Real tissue satisfies the CLT assumption in some places, and violates it in others. Three specific ways this shows up in practice:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Scatterer count isn't always "many"
&lt;/h3&gt;

&lt;p&gt;The CLT argument assumes N is large enough for the Gaussian limit to hold — in practice, on the order of 10 or more scatterers per resolution cell. In homogeneous parenchyma at sufficient depth, this is a reasonable assumption. At lesion boundaries, cyst walls, tissue interfaces, and structured collagen, it isn't.&lt;/p&gt;

&lt;p&gt;When N is small, the sum in the equation above doesn't converge to a Gaussian, and the envelope doesn't converge to Rayleigh. What you get instead is a &lt;strong&gt;sub-Rayleigh&lt;/strong&gt; distribution — broader, with heavier tails and more variance in the low-amplitude region. The Rician distribution captures the case of few strong scatterers plus diffuse background; the Nakagami distribution generalizes further and covers both sub- and super-Rayleigh cases with a single shape parameter.&lt;/p&gt;

&lt;p&gt;This isn't a small correction. Regions where Rayleigh breaks are exactly the regions clinicians care about — boundaries, lesions, structural changes — and forcing a Rayleigh fit there systematically misrepresents the tissue statistics.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Envelope detection has a built-in offset
&lt;/h3&gt;

&lt;p&gt;The mean of a Rayleigh distribution is:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;E&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="mord sqrt"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span class="svg-align"&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;π&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="hide-tail"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1.253&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;This creates a subtle but important issue for quantitative work. If you want to recover the underlying scatterer strength parameter 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 from an image, you can't just take the local pixel mean and use it directly — the envelope detection operation inflates the mean by a factor of 
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord sqrt"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span class="svg-align"&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;π&lt;/span&gt;&lt;span class="mord"&gt;/2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="hide-tail"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 relative to the parameter that actually characterizes the tissue.

&lt;p&gt;For qualitative B-mode viewing this doesn't matter — the image still looks like tissue. For quantitative analysis, it matters a lot. Any metric that treats pixel intensity as a direct proxy for scatterer density carries this systematic offset. It's not measurement error, it's not noise — it's a consequence of how the envelope operator maps the underlying complex signal to a positive real amplitude.&lt;/p&gt;

&lt;p&gt;You can compensate for it if you know Rayleigh holds locally. You can't compensate for it cleanly when Rayleigh doesn't hold — because the relationship between pixel mean and scatterer strength changes with the underlying distribution.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pixels aren't independent samples
&lt;/h3&gt;

&lt;p&gt;Every scatterer's contribution is spread across a small spatial neighborhood by the point spread function. Neighboring pixels aren't independent samples of the same distribution — they're weighted combinations of overlapping scatterer sets. Even if the underlying distribution were perfectly Rayleigh at every location, the observed pixels would be correlated.&lt;/p&gt;

&lt;p&gt;Standard estimators for 
&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
 — or for any distribution parameter, Rayleigh or otherwise — assume i.i.d. samples. When pixels are correlated, those estimators become biased, and their variance is systematically underestimated. Confidence intervals shrink, false-discovery rates rise, and the resulting parameter maps carry the PSF footprint mixed in with the tissue signal.

&lt;p&gt;Most published QUS work on Rayleigh-based analysis quietly assumes independence and hopes the correlation is small enough not to matter. Sometimes it is. Often it isn't. This is a topic in its own right, and I'll come back to it in a later post in the series.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the series goes from here
&lt;/h2&gt;

&lt;p&gt;Rayleigh isn't wrong. It's the right model for a specific regime — many independent scatterers, homogeneous tissue, no interest in absolute quantitative recovery of scatterer strength. That regime exists, and Rayleigh describes it accurately. What it isn't is a &lt;em&gt;general&lt;/em&gt; model for ultrasound speckle.&lt;/p&gt;

&lt;p&gt;Later parts of the series work through what to reach for when the Rayleigh assumptions break:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Part 2&lt;/strong&gt; — Nakagami as a generalization, its shape parameter, and what each term in the PDF actually does&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 3&lt;/strong&gt; — Local m estimation and the shift from noise modeling to tissue characterization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 4&lt;/strong&gt; — Correlated speckle, the PSF signature in the autocorrelation function, and what has to go into the observation model to handle it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below are two visuals from the original discussion — Rayleigh compared to Nakagami PDFs at a few shape parameters, and a stylized picture of the "fully developed speckle" regime the CLT argument assumes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fohw0djhk72m2myjbq4k3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fohw0djhk72m2myjbq4k3.png" alt="Rayleigh vs Nakagami PDF" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5t96tookw2hw6fx2yred.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5t96tookw2hw6fx2yred.png" alt="Tissue Scatterer Density - Fully Developed Speckle" width="800" height="603"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;My paper on Bayesian restoration for B-mode ultrasound, including the correlated speckle noise model previewed in point (3) above: &lt;a href="https://doi.org/10.1177/0161734619865961" rel="noopener noreferrer"&gt;Ultrasonic Imaging, 2019&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ORCID (all publications): &lt;a href="https://orcid.org/0000-0003-2633-9371" rel="noopener noreferrer"&gt;0000-0003-2633-9371&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;I take on selective remote consulting on ultrasound image quality, quantitative ultrasound, and restoration problems — particularly on data from commercial hospital scanners rather than research-grade RF. Reach out via LinkedIn if that's the kind of problem you're working on.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ultrasound</category>
      <category>medicalimaging</category>
      <category>signalprocessing</category>
      <category>math</category>
    </item>
    <item>
      <title>US Speckle Reduction Part 2 — Classical vs DnCNN</title>
      <dc:creator>Mine Cuneyitoglu</dc:creator>
      <pubDate>Fri, 26 Jun 2026 15:49:01 +0000</pubDate>
      <link>https://dev.to/mine_cune/us-speckle-reduction-part-2-classical-vs-dncnn-1hl1</link>
      <guid>https://dev.to/mine_cune/us-speckle-reduction-part-2-classical-vs-dncnn-1hl1</guid>
      <description>&lt;h1&gt;
  
  
  Speckle Reduction on Ultrasound Images — Classical vs DnCNN
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;My PhD research focused on freehand B-mode ultrasound image quality —&lt;br&gt;
speckle noise, spatial correlation modeling, and super-resolution restoration.&lt;br&gt;
That was 8 years ago. This project is me rebuilding that work with modern tools.&lt;/p&gt;

&lt;p&gt;Starting point: a clean benchmark on the &lt;br&gt;
&lt;a href="https://www.kaggle.com/datasets/aryashah2k/breast-ultrasound-images-dataset" rel="noopener noreferrer"&gt;BUSI dataset&lt;/a&gt; &lt;br&gt;
(780 breast ultrasound images — benign, malignant, normal).&lt;/p&gt;


&lt;h2&gt;
  
  
  The Problem with Standard Benchmarks
&lt;/h2&gt;

&lt;p&gt;Most speckle reduction papers evaluate on the full image — background included.&lt;br&gt;
But in clinical practice, what matters is image quality &lt;em&gt;within the lesion&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So I added ROI-based evaluation using the segmentation masks provided in BUSI.&lt;br&gt;
For images with multiple lesions, masks were combined via union.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;evaluate_with_roi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;denoised&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;global_psnr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;psnr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;denoised&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data_range&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;global_ssim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ssim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;denoised&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data_range&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# ROI bounding box
&lt;/span&gt;        &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;cols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rmax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
        &lt;span class="n"&gt;cmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

        &lt;span class="nf"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rmax&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;rmin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmax&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;cmin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;roi_orig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;original&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rmin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rmax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cmax&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;roi_den&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;denoised&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rmin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rmax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cmax&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;roi_ssim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ssim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;roi_orig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;roi_den&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data_range&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Methods
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Noise model:&lt;/strong&gt; Additive Gaussian (σ=0.05) as speckle proxy
&lt;em&gt;(Note: not physically accurate — Nakagami or correlated models are more realistic.
PSF-aware correlated noise model is next on the list.)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Non-Local Means (NLM)&lt;/li&gt;
&lt;li&gt;Median Filter&lt;/li&gt;
&lt;li&gt;Gaussian Filter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DnCNN&lt;/strong&gt; — 17-layer residual CNN, trained from scratch on BUSI&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  DnCNN — A Note on Training
&lt;/h2&gt;

&lt;p&gt;Training was not straightforward.&lt;/p&gt;

&lt;p&gt;Initial run with &lt;code&gt;lr=1e-3&lt;/code&gt; plateaued immediately after epoch 2:&lt;br&gt;
Epoch [ 2/30] — Loss: 0.002472&lt;/p&gt;

&lt;p&gt;Epoch [10/30] — Loss: 0.002408&lt;/p&gt;

&lt;p&gt;Epoch [20/30] — Loss: 0.002383&lt;/p&gt;

&lt;p&gt;Epoch [30/30] — Loss: 0.002363  ← barely moved&lt;/p&gt;

&lt;p&gt;Dropping to &lt;code&gt;lr=1e-4&lt;/code&gt; with step decay fixed it:&lt;br&gt;
Epoch [ 5/50] — Loss: 0.001487&lt;/p&gt;

&lt;p&gt;Epoch [20/50] — Loss: 0.001023&lt;/p&gt;

&lt;p&gt;Epoch [50/50] — Loss: 0.000899&lt;/p&gt;

&lt;p&gt;This is worth noting: &lt;strong&gt;DnCNN is sensitive to initialization and learning rate.&lt;/strong&gt;&lt;br&gt;
Results varied across runs (PSNR range ~31.2–31.7 dB). Single-run DL benchmarks&lt;br&gt;
should be interpreted with some caution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Results (780 images)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;PSNR Global&lt;/th&gt;
&lt;th&gt;SSIM Global&lt;/th&gt;
&lt;th&gt;PSNR ROI&lt;/th&gt;
&lt;th&gt;SSIM ROI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Noisy&lt;/td&gt;
&lt;td&gt;26.25&lt;/td&gt;
&lt;td&gt;0.649&lt;/td&gt;
&lt;td&gt;26.34&lt;/td&gt;
&lt;td&gt;0.681&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median Filter&lt;/td&gt;
&lt;td&gt;29.71&lt;/td&gt;
&lt;td&gt;0.810&lt;/td&gt;
&lt;td&gt;29.32&lt;/td&gt;
&lt;td&gt;0.811&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gaussian Filter&lt;/td&gt;
&lt;td&gt;29.99&lt;/td&gt;
&lt;td&gt;0.836&lt;/td&gt;
&lt;td&gt;29.76&lt;/td&gt;
&lt;td&gt;0.833&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NLM&lt;/td&gt;
&lt;td&gt;31.47&lt;/td&gt;
&lt;td&gt;0.827&lt;/td&gt;
&lt;td&gt;31.52&lt;/td&gt;
&lt;td&gt;0.842&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DnCNN&lt;/td&gt;
&lt;td&gt;31.24&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.847&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;31.17&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.860&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Key Findings
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. NLM vs DnCNN — it depends on the metric.&lt;/strong&gt;&lt;br&gt;
NLM wins on PSNR, DnCNN wins on SSIM. SSIM captures structural similarity&lt;br&gt;
better than pixel-level fidelity — arguably more relevant for diagnostic imaging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Global metrics can mislead.&lt;/strong&gt;&lt;br&gt;
Median filter looks decent globally (29.71 dB) but drops in ROI (29.32 dB) —&lt;br&gt;
edge blurring at lesion boundaries. A paper reporting only global metrics&lt;br&gt;
would miss this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Dataset-scale evaluation matters.&lt;/strong&gt;&lt;br&gt;
On individual images, NLM sometimes outperforms DnCNN. The pattern only&lt;br&gt;
stabilizes at dataset scale. Single-image comparisons in this field are unreliable.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Super-resolution: Real-ESRGAN / SwinIR fine-tuned on ultrasound&lt;/li&gt;
&lt;li&gt;Realistic noise model: PSF-aware correlated speckle from phantom data
(I actually collected this data during my PhD — time to revisit it)&lt;/li&gt;
&lt;li&gt;Thyroid nodule segmentation with SAM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code on GitHub 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/minebyte/us-speckle-reduction-benchmark" rel="noopener noreferrer"&gt;https://github.com/minebyte/us-speckle-reduction-benchmark&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftj6i6x99hql6d5hrgptq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftj6i6x99hql6d5hrgptq.png" alt=" " width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Classical Speckle Reduction Benchmark</title>
      <dc:creator>Mine Cuneyitoglu</dc:creator>
      <pubDate>Fri, 26 Jun 2026 12:42:06 +0000</pubDate>
      <link>https://dev.to/mine_cune/classical-speckle-reduction-benchmark-1hp</link>
      <guid>https://dev.to/mine_cune/classical-speckle-reduction-benchmark-1hp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi2yiflyasupfwp0yzm2m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi2yiflyasupfwp0yzm2m.png" alt=" " width="800" height="284"&gt;&lt;/a&gt;Classical speckle reduction benchmark on 780 breast ultrasound images (BUSI dataset).&lt;/p&gt;

&lt;p&gt;Compared Non-Local Means, Median, and Gaussian filtering — &lt;br&gt;
evaluated both globally and within lesion ROI using segmentation masks.&lt;/p&gt;

&lt;p&gt;Key finding: global metrics can be misleading :) (why proper masking is  important)&lt;/p&gt;

&lt;p&gt;Median filter scores well globally (PSNR: 29.71 dB) but drops notably &lt;br&gt;
within lesion boundaries (29.32 dB ROI) — clinically relevant edge blurring &lt;br&gt;
that global evaluation misses.&lt;/p&gt;

&lt;p&gt;NLM remains consistent across both evaluations — more reliable for diagnostic regions.&lt;/p&gt;

&lt;p&gt;Next: DnCNN and U-Net comparison.&lt;/p&gt;

&lt;p&gt;GitHub 👇&lt;br&gt;
&lt;a href="https://github.com/minebyte/us-speckle-reduction-benchmark" rel="noopener noreferrer"&gt;https://github.com/minebyte/us-speckle-reduction-benchmark&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  MedicalImaging #Ultrasound #ImageProcessing #ComputerVision #Python
&lt;/h1&gt;

</description>
      <category>algorithms</category>
      <category>computerscience</category>
      <category>datascience</category>
      <category>github</category>
    </item>
  </channel>
</rss>
