<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MARCO RISTUCCIA</title>
	<atom:link href="https://photography.marcoristuccia.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://photography.marcoristuccia.com/</link>
	<description>Photographer</description>
	<lastBuildDate>Fri, 14 Aug 2026 14:31:07 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.7</generator>

<image>
	<url>https://photography.marcoristuccia.com/wp-content/uploads/2019/02/elementor/thumbs/Logo_100px-oxheoicj20tn38skeddnl6dvzfp44hake6njdhjq4g.jpg</url>
	<title>MARCO RISTUCCIA</title>
	<link>https://photography.marcoristuccia.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>RWMono &#8211; Non-demosaiced Monochrome Conversion for CFA Camera Sensors</title>
		<link>https://photography.marcoristuccia.com/rwmono-an-experiment-raw-bw-conversion/</link>
					<comments>https://photography.marcoristuccia.com/rwmono-an-experiment-raw-bw-conversion/#respond</comments>
		
		<dc:creator><![CDATA[Marco Ristuccia]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 17:35:04 +0000</pubDate>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[black-and-white]]></category>
		<category><![CDATA[hasselblad]]></category>
		<category><![CDATA[raw]]></category>
		<guid isPermaLink="false">https://photography.marcoristuccia.com/?p=4146</guid>

					<description><![CDATA[<p>Monochrome Raw Conversion Without Demosaicing Design, implementation, and a measured comparison against demosaic-based B&#38;W conversion and a true monochrome sensor<span class="more-dots">...</span></p>
<p>The post <a href="https://photography.marcoristuccia.com/rwmono-an-experiment-raw-bw-conversion/">RWMono &#8211; Non-demosaiced Monochrome Conversion for CFA Camera Sensors</a> appeared first on <a href="https://photography.marcoristuccia.com">MARCO RISTUCCIA</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading is-style-decor2">Monochrome Raw Conversion Without Demosaicing</h2>



<p class="has-normal-font-size"><em>Design, implementation, and a measured comparison against demosaic-based B&amp;W conversion and a true monochrome sensor</em></p>



<p class="is-style-small-text has-small-font-size"><em>by Marco Ristuccia (with a huge help of Claude Fable</em>!)</p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>RWMono v1.0 for macOS with Intel or Apple Silicon (<a href="https://www.marcoristuccia.com/downloads/rwmono-macos.zip" type="link" id="https://www.marcoristuccia.com/downloads/rwmono-macos.zip">click to download</a>)</td><td><a href="https://github.com/mristuccia/rwmono" type="link" id="https://github.com/mristuccia/rwmono" target="_blank" rel="noreferrer noopener">GitHub Repo (click to open)</a></td></tr></tbody></table></figure>



<h1 class="wp-block-heading"><a></a><a id="_Toc236496850">Abstract</a></h1>



<p>The typical black &amp; white conversion we all do for RAW files produced by Bayer-sensor cameras happens by first demosaicing — interpolating three color values at every photosite — and then discarding the color. This estimates values that were never measured, and for monochrome output the color estimation could be avoided. <strong><em>RWMono</em></strong> is a command-line tool that converts Bayer raw files (developed against <strong><em>Hasselblad</em> .3FR</strong>; <strong>any <em>LibRaw</em>-supported Bayer format works</strong>, including <em><strong>Fujifilm GFX</strong></em>, <strong><em>Canon</em></strong>, <strong><em>Nikon</em></strong>, etc&#8230;) directly into monochrome linear DNG files using three interpolation-free strategies: <strong>2×2 super-pixel binning</strong>, <strong>full-resolution channel equalization</strong>, and <strong>quincunx re-indexing of the green lattice</strong>. </p>



<p>This article describes the science behind each strategy, the implementation (including a from-scratch lossless-JPEG DNG writer), and a quantitative comparison of resolution and noise against conventional demosaic-plus-BW conversion and against a simulated true monochrome sensor. </p>



<p>The headline results: on neutral subjects demosaicing retains <em>more</em> detail than green-only methods (every CFA pixel is a valid luminance sample there), and the equalized-mosaic mode is exact; the quincunx mode delivers about 85 % of demosaiced horizontal/vertical resolution with zero invented pixels; binning matches a monochrome sensor’s per-pixel SNR at half resolution; and a true monochrome sensor of the same area retains an unbeatable 1.5–2 stop noise advantage at matched output scale that no CFA processing can recover.</p>



<h1 class="wp-block-heading"><a></a><a id="_Toc236496851">1. Background and motivation</a></h1>



<p>A Bayer color filter array (CFA) samples the scene through a mosaic of red, green, and blue filters — one color per photosite, greens on a checkerboard occupying half the sites (Bayer, 1976). Demosaicing reconstructs the missing two channels per pixel by interpolation, exploiting cross-channel correlation. It is a guess — a well-informed one, but a guess — and its failure modes (zipper artifacts, false color, hallucinated texture beyond Nyquist) survive into a B&amp;W conversion as <em>luminance</em> errors.</p>



<p>For photographers whose target is monochrome, an alternative exists: skip reconstruction entirely and treat the measured photosite values as the image. The closest prior art is <strong>Monochrome2DNG</strong> (FastRawViewer/LibRaw team), which serves cameras whose CFA has been physically removed; there, every photosite is a valid luminance sample. With the CFA still in place, the core obstacle is that equally-illuminated photosites of different channels record different values — the strategies below are three ways of dealing with exactly that.</p>



<p>The academic framing is <em>luminance estimation directly from CFA data</em>, a sub-problem of demosaicing theory: in the spatial-frequency domain a Bayer image separates into baseband luminance plus chrominance modulated at high frequencies (Alleysson et al., 2005; Dubois, 2005), and the green quincunx lattice has well-studied reconstruction properties. <em>RWMono</em> deliberately uses only the simplest, fully transparent members of this family — nothing the pixel data cannot directly justify.</p>



<h1 class="wp-block-heading"><a></a><a id="_Toc236496852">2. The three strategies and the science behind them</a></h1>



<h2 class="wp-block-heading"><a></a><a id="_Toc236496853">2.1 </a>bin — 2×2 super-pixel binning</h2>



<p>Each RGGB quad collapses to one output pixel. Two weightings are provided:</p>



<ul class="wp-block-list">
<li class="v-spacer"><strong>G weighting</strong> (default): <math data-latex="(G_1 + G_2)/2"><semantics><mrow><mo form="prefix" stretchy="false">(</mo><msub><mi>G</mi><mn>1</mn></msub><mo>+</mo><msub><mi>G</mi><mn>2</mn></msub><mo form="postfix" stretchy="false">)</mo><mi>/</mi><mn>2</mn></mrow><annotation encoding="application/x-tex">(G_1 + G_2)/2</annotation></semantics></math>   — a pure green-channel image. This is the classic B&amp;W green-filter rendering (pleasing skin, lively foliage), using only the two most densely sampled, identically-filtered photosites.</li>



<li class="v-spacer"><strong>Luma weighting</strong>: <math data-latex="(R'+G_1+G_2+B')/4 "><semantics><mrow><mo form="prefix" stretchy="false">(</mo><msup><mi>R</mi><mo lspace="0em" rspace="0em" class="tml-prime">′</mo></msup><mo>+</mo><msub><mi>G</mi><mn>1</mn></msub><mo>+</mo><msub><mi>G</mi><mn>2</mn></msub><mo>+</mo><msup><mi>B</mi><mo lspace="0em" rspace="0em" class="tml-prime">′</mo></msup><mo form="postfix" stretchy="false">)</mo><mi>/</mi><mn>4</mn></mrow><annotation encoding="application/x-tex">(R&#8217;+G_1+G_2+B&#8217;)/4 </annotation></semantics></math>  where R&#8217; and B&#8217; are equalized to green via white-balance gains and clipped at green’s saturation. All four measured photons contribute; noise is lowest.<br></li>
</ul>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b5a8a&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b5a8a" class="wp-block-image size-large is-resized wp-lightbox-container"><img fetchpriority="high" decoding="async" width="1024" height="530" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/bin_superpixel-1024x530.png" alt="" class="wp-image-4162" style="width:1138px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/bin_superpixel-1024x530.png 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/bin_superpixel-300x155.png 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/bin_superpixel-768x397.png 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/bin_superpixel-1536x794.png 1536w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/bin_superpixel-2048x1059.png 2048w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/bin_superpixel-1140x590.png 1140w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The bin strategy. Left: the native mosaic partitioned into 2×2 RGGB quads. Right: each quad collapses to one monochrome output pixel at twice the native pitch — no value is ever interpolated (<strong>click to enlarge</strong>).</figcaption></figure>



<p class="has-text-align-left">Output is half the linear resolution and a quarter of the pixels; nothing is interpolated. This is the “super-pixel” mode long used in astrophotography stacking. The effective sampling aperture is the 2×2 quad, whose box-filter MTF rolls off smoothly toward the bin Nyquist of 0.25 cycles/native-pixel.</p>



<h2 class="wp-block-heading"><a></a><a id="_Toc236496854">2.2 </a>flat — full-resolution mosaic with channel equalization</h2>



<p>Keep every photosite at native position and apply per-channel gains <math data-latex="g_R=m_R/m_G"><semantics><mrow><msub><mi>g</mi><mi>R</mi></msub><mo>=</mo><msub><mi>m</mi><mi>R</mi></msub><mi>/</mi><msub><mi>m</mi><mi>G</mi></msub></mrow><annotation encoding="application/x-tex">g_R=m_R/m_G</annotation></semantics></math>, <math data-latex="g_B=m_B/m_G"><semantics><mrow><msub><mi>g</mi><mi>B</mi></msub><mo>=</mo><msub><mi>m</mi><mi>B</mi></msub><mi>/</mi><msub><mi>m</mi><mi>G</mi></msub></mrow><annotation encoding="application/x-tex">g_B=m_B/m_G</annotation></semantics></math>&nbsp;(from the as-shot white-balance multipliers, or user-supplied) — i.e.&nbsp;white-balance the <em>mosaic itself</em>. For a neutral (gray) subject, an R photosite then reads the same as its G neighbors, and the mosaic <em>is</em> the luminance image at full native resolution: no reconstruction error at all, because there is nothing to reconstruct.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b5e63&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b5e63" class="wp-block-image size-large is-resized wp-lightbox-container"><img decoding="async" width="1024" height="530" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/flat_equalization-1024x530.png" alt="" class="wp-image-4164" style="aspect-ratio:1.932101053969599;width:1140px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/flat_equalization-1024x530.png 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/flat_equalization-300x155.png 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/flat_equalization-768x397.png 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/flat_equalization-1536x794.png 1536w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/flat_equalization-2048x1059.png 2048w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/flat_equalization-1140x590.png 1140w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The flat strategy. Left: one gain per CFA channel, from the white-balance multipliers. Right: after equalization a neutral subject reads identically at every photosite — the mosaic itself becomes the monochrome image, still at native pitch (<strong>click to enlarge</strong>).</figcaption></figure>



<p>The catch is scene-dependent: wherever the <em>scene</em> is saturated in color, R and B photosites legitimately disagree with G, and the disagreement renders as a pixel-level checkerboard lattice. No global gain can fix this — it is chrominance aliasing, the same energy a demosaicer routes into its chroma channels. Highlights are protected by clipping all channels at green’s saturation so they clip together.</p>



<h2 class="wp-block-heading"><a></a><a id="_Toc236496855">2.3 </a>quincunx — the green checkerboard as a rotated square grid</h2>



<p>The green photosites form a quincunx (checkerboard) lattice. That lattice <em>is</em> a square grid — rotated 45°, with pitch <math data-latex="√2"><semantics><mrow><mtext>√</mtext><mn>2</mn></mrow><annotation encoding="application/x-tex">√2</annotation></semantics></math> native pixels. Re-indexing along the diagonal basis <math data-latex="e_1=(1,1)"><semantics><mrow><msub><mi>e</mi><mn>1</mn></msub><mo>=</mo><mo form="prefix" stretchy="false">(</mo><mn>1,1</mn><mo form="postfix" stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">e_1=(1,1)</annotation></semantics></math>, <math data-latex="e_2=(-1,1)"><semantics><mrow><msub><mi>e</mi><mn>2</mn></msub><mo>=</mo><mo form="prefix" stretchy="false">(</mo><mo form="prefix" stretchy="false">−</mo><mn>1,1</mn><mo form="postfix" stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">e_2=(-1,1)</annotation></semantics></math> maps every green sample to exactly one pixel of an upright image; the scene content appears rotated 45° inside a diamond. <strong>Zero interpolation, zero non-green data</strong> — the purest software approximation of a monochrome sensor a Bayer chip can offer.</p>



<p>Sampling theory gives this lattice an interesting anisotropy: its Brillouin zone is the diamond <math data-latex="|f_x |+|f_y |≤0.5"><semantics><mrow><mi>|</mi><msub><mi>f</mi><mi>x</mi></msub><mi>|</mi><mo>+</mo><mi>|</mi><msub><mi>f</mi><mi>y</mi></msub><mi>|</mi><mo>≤</mo><mn>0.5</mn></mrow><annotation encoding="application/x-tex">|f_x |+|f_y |≤0.5</annotation></semantics></math>, so horizontal and vertical gratings are supported all the way to the native Nyquist of 0.5 cycles/pixel, while diagonal gratings alias beyond 0.354. Since man-made scenes are dominated by horizontal/vertical structure, the practical cost is lower than the “half the pixels” arithmetic suggests.<br></p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b61c9&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b61c9" class="wp-block-image size-large is-resized wp-lightbox-container"><img decoding="async" width="1024" height="530" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/quincunx_rotation-1024x530.png" alt="" class="wp-image-4160" style="width:1140px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/quincunx_rotation-1024x530.png 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/quincunx_rotation-300x155.png 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/quincunx_rotation-768x397.png 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/quincunx_rotation-1536x794.png 1536w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/quincunx_rotation-2048x1059.png 2048w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/quincunx_rotation-1140x590.png 1140w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The quincunx re-indexing. Left: the native Bayer mosaic — the green photosites (highlighted) sit on a square lattice rotated 45°, traced by the diagonal lines, with pitch √2·p.&nbsp;Right: the same mosaic rotated 45° — every green sample now owns exactly one pixel of an upright square grid (outlined); red and blue (faded) are discarded (<strong>click to enlarge</strong>).</figcaption></figure>



<p>Two practical additions:</p>



<ul class="wp-block-list">
<li class="v-spacer"><strong>Gr/Gb equalization.</strong> The two greens of each quad can differ slightly (crosstalk from neighboring red vs.&nbsp;blue rows). On the rotated grid they occupy alternating diagonals, so an imbalance renders as a lattice. <em><em><em>RWMono</em></em></em> measures the global Gr/Gb ratio per file and equalizes it (on the test camera: 1.00283, i.e.&nbsp;0.28 %).</li>



<li><strong>&#8211;derotate.</strong> One bicubic (Catmull-Rom) resample maps the rotated grid back to an upright frame of <math data-latex="W/√2×H/√2 "><semantics><mrow><mi>W</mi><mi>/</mi><mtext>√</mtext><mn>2</mn><mo>×</mo><mi>H</mi><mi>/</mi><mtext>√</mtext><mn>2</mn></mrow><annotation encoding="application/x-tex">W/√2×H/√2 </annotation></semantics></math> pixels — the same pixel count as the number of green samples, so no fake resolution is created. This is the single spatial (never chromatic) interpolation a user can opt into; the lattice-faithful mapping preserves the anisotropic frequency support described above.</li>
</ul>



<h2 class="wp-block-heading"><a></a><a id="_Toc236496856">2.4 What none of these can do</a></h2>



<p>A green-only image is the scene <em>through a green filter</em>, not scene luminance. A CFA photosite also discards roughly half the photons a filterless one would collect (one stop), and the green-only modes discard half the photosites on top of that (a second stop). Section 5 quantifies both points.</p>



<h1 class="wp-block-heading"><a id="_Toc236496858">4. Using <em><em>RWMono</em></em></a></h1>



<p><em>RWMono</em> is a standalone command-line application that can run on macos. Both Intel and Apple Silicon architectures are supported.<br>Once you’ve downloaded the archive (link provided at the beginning of this article), unzip it and save it in a folder of your choice. Ideally, you may want to add this folder to your PATH variable in your .bash_profile file so that you can run the archive without having to type the entire path.</p>



<pre class="wp-block-code"><code>$ &lt;rwmono-path&gt;/rwmono

usage: rwmono &lt;bin|flat|quincunx&gt; &lt;input raw&gt; &#91;options]
&nbsp; -o &lt;file&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output DNG path (default: input name + _&lt;mode&gt;.dng)
&nbsp; --weights &lt;g|luma&gt;&nbsp;&nbsp; bin mode: G-only or (R+2G+B)/4 luma (default g)
&nbsp; --wb &lt;asshot|R,G,B&gt;&nbsp; channel gains for equalization (default asshot)
&nbsp; --no-grgb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; quincunx: skip Gr/Gb equalization
&nbsp; --derotate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; quincunx: bicubic resample back to an upright frame
&nbsp; --autocrop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; quincunx: tag the largest inscribed rectangle as
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultCrop (crops away most of the frame)
&nbsp; --uncompressed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disable lossless JPEG compression</code></pre>



<p>All commands below were run against the reference capture used throughout this paper — a Hasselblad CFV-100c / 907X .3FR (11 904 × 8 842 photosites, 11 664 × 8 750 active, RGGB, ISO 64, f/8, 1/250 s, 203 MB):</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td>Command</td><td>Output</td><td>Size</td><td>Notes</td></tr></thead><tbody><tr><td>rwmono bin IMG.3FR</td><td>5 832 × 4 375</td><td>32 MB</td><td>green-filter look, zero interpolation</td></tr><tr><td>rwmono bin IMG.3FR &#8211;weights luma</td><td>5 832 × 4 375</td><td>30 MB</td><td>all photons, lowest noise</td></tr><tr><td>rwmono flat IMG.3FR</td><td>11 664 × 8 750</td><td>168 MB</td><td>native res; neutral scenes only</td></tr><tr><td>rwmono quincunx IMG.3FR</td><td>10 207 × 10 206</td><td>91 MB</td><td>45°-rotated diamond, purest mode</td></tr><tr><td>rwmono quincunx IMG.3FR &#8211;derotate</td><td>8 246 × 6 186</td><td>60 MB</td><td>upright, one spatial resample</td></tr></tbody></table></figure>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b6667&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b6667" class="wp-block-image size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="768" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-1024x768.jpeg" alt="" class="wp-image-4151" style="width:1140px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-1024x768.jpeg 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-300x225.jpeg 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-768x576.jpeg 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-1536x1152.jpeg 1536w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-1140x855.jpeg 1140w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1.jpeg 2000w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Example conversion: bin mode of the reference capture (Berlin, CFV-100c) (<strong>click to enlarge</strong>).</figcaption></figure>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b6945&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b6945" class="wp-block-image size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="1024" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1024x1024.jpeg" alt="" class="wp-image-4149" style="width:1140px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1024x1024.jpeg 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-300x300.jpeg 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-150x150.jpeg 150w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-768x768.jpeg 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1536x1536.jpeg 1536w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-855x855.jpeg 855w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-800x800.jpeg 800w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image.jpeg 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">quincunx mode: every green sample mapped, uninterpolated, onto the rotated grid — the diamond framing is inherent to the geometry <br>(<strong>click to enlarge</strong>).</figcaption></figure>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b6caf&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b6caf" class="wp-block-image size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="768" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2-1024x768.jpeg" alt="" class="wp-image-4158" style="width:1140px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2-1024x768.jpeg 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2-300x225.jpeg 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2-768x576.jpeg 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2-1536x1152.jpeg 1536w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2-1140x855.jpeg 1140w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2.jpeg 2000w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">quincunx &#8211;derotate: the same data resampled upright (8 246 × 6 186) (<strong>click to enlarge</strong>).</figcaption></figure>



<h1 class="wp-block-heading"><a></a><a id="_Toc236496859">5. Measured comparison</a></h1>



<h2 class="wp-block-heading"><a></a><a id="_Toc236496860">5.1 Methodology</a></h2>



<p><strong>Resolution.</strong> A synthetic zone plate (all spatial frequencies to beyond Nyquist, all orientations, analytically known ground truth) was rendered as a neutral scene with 2×2-supersampled pixel aperture, mosaicked with Hasselblad-like channel sensitivities (R = 1/2.63, B = 1/1.62 of G), and written as a Bayer DNG. Both pipelines consumed the same file: rwmono’s three modes on one side; LibRaw’s AHD and DHT demosaicers followed by Rec. 709 luma conversion on the other. A <strong>simulated monochrome sensor</strong> — every native photosite sampling scene luminance directly, no CFA — was added as reference. Because each method’s output-grid-to-scene mapping is known exactly, the retained contrast at each frequency is measured as the least-squares gain of the output against the analytic reference per frequency band (a matched filter: blur lowers it, aliasing junk decorrelates to ~0), normalized at low frequency. The neutral scene is deliberately demosaicing’s <em>best</em> case.</p>



<p><strong>Noise.</strong> Uniform patches at 2 %, 18 %, and 50 % of full scale were simulated with Poisson shot noise (50 000 e⁻ full well at G saturation) and 3 e⁻ RMS read noise at identical exposure, mosaicked with the same sensitivities, and pushed through every real pipeline. The monochrome sensor collects the summed pass-bands of the three CFA channels — 2.0× a green photosite’s photons, consistent with the white-balance data and the folklore “about one stop.” That factor is <em>per photosite</em>; the system-level gap is larger, because the green-only modes additionally use only half the photosites (§ 5.3). SNR (mean/std) is reported per output pixel at each method’s native output scale, and again with every output box-resampled to the bin grid (matched display scale), which credits full-resolution outputs for their downsampling headroom. Stops are quoted throughout in the photographic sense — one stop is twice the light, hence a factor <math data-latex="√2"><semantics><mrow><mtext>√</mtext><mn>2</mn></mrow><annotation encoding="application/x-tex">√2</annotation></semantics></math> in SNR, so a measured SNR ratio <math data-latex="k"><semantics><mi>k</mi><annotation encoding="application/x-tex">k</annotation></semantics></math> corresponds to <math data-latex="2log_2 k"><semantics><mrow><mn>2</mn><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mi>k</mi></mrow><annotation encoding="application/x-tex">2log_2 k</annotation></semantics></math> stops.</p>



<h2 class="wp-block-heading"><a></a><a id="_Toc236496861">5.2 Resolution results</a></h2>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b7084&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b7084" class="wp-block-image size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="410" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/mtf_chart-1024x410.png" alt="" class="wp-image-4170" style="aspect-ratio:2.4976037244967824;width:1140px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/mtf_chart-1024x410.png 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/mtf_chart-300x120.png 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/mtf_chart-768x307.png 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/mtf_chart-1536x614.png 1536w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/mtf_chart-1140x456.png 1140w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/mtf_chart.png 1840w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Zone-plate frequency response. Dashed segments lie beyond that method’s sampling-grid Nyquist: response there is aliasing, not real detail <br>(<strong>click to enlarge</strong>).</figcaption></figure>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td>Method</td><td>MTF50</td><td>MTF10</td><td>MTF50 H/V</td><td>MTF50 diag</td><td>Grid Nyquist</td></tr></thead><tbody><tr><td>mono sensor (simulated)</td><td>exact*</td><td>exact*</td><td>exact*</td><td>exact*</td><td>0.50</td></tr><tr><td>AHD demosaic + BW</td><td>0.51</td><td>0.61</td><td>—</td><td>—</td><td>0.50</td></tr><tr><td>DHT demosaic + BW</td><td>0.45</td><td>0.59</td><td>0.49</td><td>0.43</td><td>0.50</td></tr><tr><td>flat (equalized mosaic)</td><td>exact*</td><td>exact*</td><td>exact*</td><td>exact*</td><td>0.50</td></tr><tr><td>quincunx derotated</td><td>0.39</td><td>0.55</td><td>0.41</td><td>0.37</td><td>0.354–0.50</td></tr><tr><td>bin 2×2 (g ≡ luma here)</td><td>0.35</td><td>0.51</td><td>0.35</td><td>0.37</td><td>0.25</td></tr></tbody></table></figure>



<p class="has-text-align-center"><em><strong>Frequencies in cycles/native pixel. “exact*”: response ≈ 1.0 across the measured range — on a neutral scene these methods reproduce the sampled scene with no reconstruction error. For flat this guarantee only holds on neutral content (§ 5.4).</strong></em></p>



<p>Key observations:</p>



<ol class="wp-block-list">
<li class="v-spacer"><strong>Demosaicing does not lose luminance detail on neutral subjects.</strong> After white balance, every photosite — red, green, and blue — is a valid luminance sample there, and demosaicers exploit it, resolving essentially to the native Nyquist. The response demosaicers show <em>beyond</em> 0.5 (the bump near 0.55) is manufactured false detail: real artifacts, not real information.</li>



<li class="v-spacer"><strong>flat</strong><strong> is exact on neutral content and identical to the monochrome sensor there</strong> — the strongest possible result, with a hard scene-dependence caveat.</li>



<li class="v-spacer"><strong>quincunx</strong><strong> is orientation-smart:</strong> MTF50 of 0.41 horizontal/vertical (85 % of DHT’s 0.49) falling to 0.37 diagonal, exactly as lattice theory predicts. Everything it shows is measured, never invented.</li>



<li class="v-spacer"><strong>bin</strong><strong> is clean to its Nyquist</strong> and degrades gracefully into honest aliasing beyond.</li>
</ol>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b748e&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b748e" class="wp-block-image size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="219" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-1024x219.png" alt="" class="wp-image-4150" style="aspect-ratio:4.676023841568929;width:1140px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-1024x219.png 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-300x64.png 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-768x164.png 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-1536x328.png 1536w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-2048x437.png 2048w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1-1140x243.png 1140w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Zone-plate patches around 0.24–0.43 cycles/native pixel (near-vertical gratings). Note the demosaicer’s near-perfect reconstruction on this neutral target, bin’s moiré rings beyond its Nyquist, and quincunx’s clean horizontal axis with diagonal-region moiré (<strong>click to enlarge</strong>).</figcaption></figure>



<h2 class="wp-block-heading"><a></a><a id="_Toc236496862">5.3 Noise results</a></h2>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b77c8&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b77c8" class="wp-block-image size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="356" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1024x356.png" alt="" class="wp-image-4147" style="width:1140px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1024x356.png 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-300x104.png 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-768x267.png 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1536x534.png 1536w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-1140x397.png 1140w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image.png 1840w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">SNR on a uniform 18 % gray patch under identical exposure. <br>Left: per output pixel at native output scale. Right: all outputs resampled to the bin grid (<strong>click to enlarge</strong>).</figcaption></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td>Method</td><td>SNR @2 %</td><td>SNR @18 %</td><td>SNR @50 %</td><td>@18 % matched scale</td></tr></thead><tbody><tr><td>mono sensor (simulated)</td><td>44.6</td><td>133.7</td><td>223.5</td><td><strong>268.1</strong></td></tr><tr><td>bin luma (R+2G+B)/4</td><td>50.1</td><td>150.3</td><td>253.4</td><td>150.3</td></tr><tr><td>bin G (G1+G2)/2</td><td>44.4</td><td>133.2</td><td>223.9</td><td>133.2</td></tr><tr><td>quincunx derotated</td><td>38.7</td><td>116.0</td><td>194.3</td><td>138.8</td></tr><tr><td>DHT demosaic + BW</td><td>31.9</td><td>95.5</td><td>159.7</td><td>157.6</td></tr><tr><td>flat (equalized mosaic)</td><td>25.1</td><td>75.6</td><td>126.4</td><td>150.3</td></tr></tbody></table></figure>



<p>Reading the table:</p>



<ul class="wp-block-list">
<li class="v-spacer"><strong>Binning buys back the monochrome sensor’s per-pixel SNR.</strong> bin G matches the mono sensor per pixel (133 vs 134) — at half the resolution. bin luma exceeds it slightly by averaging all four photosites. Read this claim precisely: it compares bin’s 25 MP pixels against the mono sensor’s 100 MP pixels. A mono sensor <em>of the same output resolution</em> — same area, photosites twice as wide — collects every photon of the 2×2 quad unfiltered and is 2 stops ahead (next bullet).</li>



<li class="v-spacer"><strong>At matched display scale the monochrome sensor wins by 1.5–2.0 stops over everything</strong> (268.1 vs 157.6 for the best CFA method, vs 133.2 for bin G). The photon budget explains it exactly: over one 2×2 quad the mono sensor collects 8.0 units against the quad’s total CFA yield of 3.0 (R 0.38 + G 1 + G 1 + B 0.62) and bin G’s green-only 2.0. bin G therefore gives up one stop to the green passband and a second stop to using half the photosites; the luma and demosaic pipelines recover part of the second stop by using all four sites, at a further small cost from the white-balance gain weighting. This is physics — the CFA never collected the photons — and no processing recovers it.</li>



<li class="v-spacer"><strong>These gaps are scale-invariant.</strong> Resampling every output to quincunx’s grid instead of bin’s multiplies each figure by the same √2, so the ratios, and the stop counts above, are unchanged. The choice of common output resolution does not favour any method.</li>



<li class="v-spacer"><strong>flat has the worst per-pixel noise</strong> (−1.64 stops vs mono): red photosites are amplified 2.63× by equalization, so noise is both higher and <em>spatially patterned</em> (a gain checkerboard). Downsampled to the bin grid it becomes exactly bin luma (150.3) — the two are the same measurement at different scales.</li>



<li class="v-spacer"><strong>Demosaic+BW sits between</strong>: interpolation averages neighboring samples, trading its resolution advantage for noise smoothing; at matched scale it is marginally the best CFA option (157.6) because it uses all photons at full grid density.</li>



<li>Read noise is negligible above 2 % here; at very low signal all CFA methods converge toward the same photon-starved penalty vs.&nbsp;mono.</li>
</ul>



<h2 class="wp-block-heading"><a></a><a id="_Toc236496863">5.4 Real-image verification (Hasselblad CFV-100c capture)</a></h2>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b7c0d&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b7c0d" class="wp-block-image size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="982" height="1024" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-3-982x1024.png" alt="" class="wp-image-4153" style="aspect-ratio:0.9589877351684333;width:1140px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-3-982x1024.png 982w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-3-288x300.png 288w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-3-768x801.png 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-3-820x855.png 820w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-3.png 1224w" sizes="(max-width: 982px) 100vw, 982px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Matched 100 % crops (a common display tone curve is applied to all panels; measurements in this paper always use the linear data). DHT and flat are indistinguishable on the neutral wall; flat shows its chroma checkerboard on the colored foliage and hat; quincunx is close to DHT with slightly softer diagonals; bin is visibly but gracefully softer (<strong>click to enlarge</strong>).</figcaption></figure>



<p>Quantitative spot checks on the same capture: per-CFA-phase means in a <em>neutral gray pavement</em> patch of flat output agree within <strong>3.1 %</strong> (the mode works); in <em>saturated blue sky</em> they spread <strong>76.7 %</strong> (R = 5 081, G = 7 240, B = 10 923) — the checkerboard below, which no global gain can remove. The measured Gr/Gb imbalance was 1.00283 (0.28 %), corrected automatically in quincunx mode.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b7f48&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b7f48" class="wp-block-image aligncenter size-full is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="800" height="800" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-4.png" alt="" class="wp-image-4154" style="width:546px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-4.png 800w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-4-300x300.png 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-4-150x150.png 150w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-4-768x768.png 768w" sizes="(max-width: 800px) 100vw, 800px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Flat output in saturated blue sky at 200 % (nearest-neighbor zoom, contrast-stretched): the scene-induced chroma checkerboard <br>(<strong>click to enlarge</strong>).</figcaption></figure>



<p>A note on this test’s scope: the zone-plate study is neutral-only — demosaicing’s best case. On strongly colored high-frequency content, demosaicers additionally hallucinate luminance artifacts from chroma edges after BW conversion, while the green-only modes (bin g, quincunx) are immune by construction; flat degrades as shown above. Section 7 demonstrates and quantifies this on a purpose-built chroma target.</p>



<h1 class="wp-block-heading"><a></a><a id="_Toc236496864">6. Conclusions and recommendations</a></h1>



<p>The honest conclusion first: <strong>for general-purpose real-world B&amp;W photography, demosaicing followed by conversion is the rational default, and this project’s own measurements say so.</strong> On neutral content demosaic+BW retains more detail than any green-only method (§ 5.2) and flat merely ties it, with a scene-dependent failure mode demosaicing does not have. At matched viewing scale demosaic+BW is also the best-noise CFA option (§ 5.3). Above all, it keeps the color information alive: the classic red/orange/yellow/green filter renderings remain a slider in post, whereas every rwmono mode commits to one spectral rendering — the green-filter look — irreversibly, at conversion time. The project’s founding intuition, that skipping demosaicing preserves <em>more</em> detail, is refuted by our own data for typical scenes.</p>



<p>What survives that concession is specific, and worth stating precisely:</p>



<ol class="wp-block-list">
<li class="v-spacer"><strong>The filter-in-post flexibility has a hidden asymmetry.</strong> A simulated color filter mixes <em>demosaiced estimates</em>. Green-heavy mixes rest on the well-sampled quincunx and are solid; but a strong red-filter mix leans on the R channel — sampled at quarter density, true Nyquist 0.25 cycles/pixel, exactly bin’s — presented at native resolution with interpolation filling the gap, plus the chroma aliasing of § 7. “Any filter at full resolution” overstates what the mosaic measured; the rwmono modes make the same sampling limits explicit instead of hiding them.</li>



<li class="v-spacer"><strong>Moiré-prone subjects are a real niche, not a philosophy.</strong> Fine textiles, distant brick and signage, halftone print, and LED screens do reach the R/B Nyquist on a 100 MP AA-filterless sensor. In a color image, chroma moiré is visible <em>as color</em> and treatable; after a B&amp;W conversion it is indistinguishable from scene texture and unremovable. § 7 measures the effect and § 7.1 shows where it lives in real content. For large B&amp;W prints of such subjects, bin G or quincunx is a remedy demosaicing cannot offer.</li>



<li class="v-spacer"><strong>Archival economics.</strong> A capture already committed to monochrome and to the green rendering keeps a 30 MB bin DNG instead of a 203 MB raw — still linear, still with highlight headroom, openable anywhere. That “already committed” is doing real work, and it is the honest boundary of the use case.</li>



<li><strong>Measurement-grade imaging.</strong> Where pixel values must be measurements rather than estimates (astronomical stacking, reprography, technical documentation), super-pixel binning is standard practice for exactly the guarantees rwmono provides.</li>
</ol>



<p>Within those niches the recommendations stand: <strong>bin</strong><strong> G</strong> as the default (bulletproof, monochrome-sensor per-pixel SNR, quarter-size files, chroma-immune), <strong>quincunx &#8211;derotate</strong> when resolution matters (~85 % of demosaiced H/V resolution, zero chromatic guessing), <strong>bin</strong><strong> luma</strong> only for scenes without high-frequency color (§ 7), and <strong>flat</strong> as an expert option for low-saturation scenes. A true monochrome back of the same sensor area retains a 1.5–2.0 stop noise advantage at matched viewing scale that no CFA processing — rwmono’s or a demosaicer’s — can recover. That is physics, not software.</p>



<p>Bottom line:</p>



<p class="has-main-color has-text-color has-link-color wp-elements-851d49afc1802430918c0dda12fc990f"><strong>▎ bin G and quincunx reach a real monochrome sensor&#8217;s resolution at their output size, and quincunx&#8217;s lattice is arguably better oriented than a square grid of the same pixel count. They do not reach its (lower) noise: at matched output scale they sit ~2 stops behind, and they render through a green filter rather than panchromatically. A mono back&#8217;s advantage is light collection, and that is bought at capture time.</strong><br><br><strong>The only way to recover the light collection of a true monochrome sensor, if possible, is by taking four identical shots and averaging them together. Once this is achieved, bin G at</strong> <math data-latex="\frac{1}{4}"><semantics><mfrac><mn>1</mn><mn>4</mn></mfrac><annotation encoding="application/x-tex">\frac{1}{4}</annotation></semantics></math><strong> megapixels and quincunx at </strong><math data-latex="\frac{1}{2}"><semantics><mfrac><mn>1</mn><mn>2</mn></mfrac><annotation encoding="application/x-tex">\frac{1}{2}</annotation></semantics></math><strong> megapixels can effectively replace a real monochrome sensor having their respective resolution, the original sensor size and a green filter covering the lens.</strong></p>



<h1 class="wp-block-heading"><a></a><a id="_Toc236496865">7. Addendum: chroma-induced luminance hallucination</a></h1>



<p>Section 5 measured demosaicing at its best — neutral content, where cross-channel correlation holds perfectly. This addendum constructs the opposite case and shows what each pipeline does with it.</p>



<p><strong>Test scene.</strong> Vertical red↔blue stripes whose frequency is chirped from 0.03 to 0.50 cycles/pixel left to right — shown below in color as the camera would see it. The green channel is strictly constant, and R + B is constant (the stripes swap red for blue, never brightness in the sum). The true Rec. 709 luminance therefore carries only a small real ripple (~9 % of its mean, from the different R and B luma weights) at <em>every</em> frequency — the analytic ground truth in the top strip of the B&amp;W panel. Crucially, red and blue photosites each sample the scene at a pitch of 2 pixels, so their Nyquist limit is <strong>0.25 cycles/pixel</strong>: beyond it, no pipeline can measure the stripes from R/B data — it can only guess, alias, or ignore.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b84ba&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b84ba" class="wp-block-image size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="107" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-5-1024x107.png" alt="" class="wp-image-4155" style="aspect-ratio:9.570746350115977;width:1140px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-5-1024x107.png 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-5-300x31.png 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-5-768x80.png 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-5-1536x161.png 1536w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-5-1140x119.png 1140w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-5.png 1548w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The test scene in color: red↔blue stripes at constant summed brightness, frequency rising left to right. Everything below is a B&amp;W rendering of this pattern (<strong>click to enlarge</strong>).</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b87a2&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b87a2" class="wp-block-image size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="619" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-6-1024x619.png" alt="" class="wp-image-4156" style="aspect-ratio:1.6542982144968665;width:1140px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-6-1024x619.png 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-6-300x181.png 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-6-768x464.png 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-6-1536x929.png 1536w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-6-1140x689.png 1140w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-6.png 1548w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Chroma stripe chirp (frequency increases left to right; each panel normalized to its own mean, common display mapping). Demosaicers reproduce the ripple correctly at low frequency, then beyond ≈0.3 cyc/px render bold, wide bands at entirely wrong frequencies and roughly double the true amplitude. bin G and quincunx render the chroma-only pattern flat, as a green filter sees it. bin luma aliases hardest — its R/B quarter-samples fold the pattern down with only a box filter to protect them (<strong>click the to enlarge</strong>).</figcaption></figure>



<p>Measured ripple amplitude (std of the detrended horizontal profile, % of each output’s mean):</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td>Pipeline</td><td>f = 0.05–0.20 (measurable)</td><td>f = 0.30–0.45 (beyond R/B Nyquist)</td></tr></thead><tbody><tr><td>ground truth (Rec. 709 luma)</td><td>8.9 %</td><td>9.0 %</td></tr><tr><td>DHT demosaic + BW</td><td>8.2 %</td><td><strong>15.3 %</strong></td></tr><tr><td>AHD demosaic + BW</td><td>8.2 %</td><td><strong>15.3 %</strong></td></tr><tr><td>bin G (G1+G2)/2</td><td>0.0 %</td><td>0.0 %</td></tr><tr><td>bin luma (R+2G+B)/4</td><td>12.5 %</td><td><strong>28.6 %</strong></td></tr><tr><td>quincunx derotated</td><td>0.0 %</td><td>0.0 %</td></tr></tbody></table></figure>



<p>Three distinct behaviors emerge:</p>



<ol class="wp-block-list">
<li class="v-spacer"><strong>Demosaicers hallucinate.</strong> Below 0.25 cyc/px both AHD and DHT track the true ripple (8.2 % vs 8.9 %). Beyond it they render ~1.9× their own correct level and ~1.7× the truth — and, worse than the amplitude, the <em>structure</em> is wrong: the panel shows broad, high-contrast bands at frequencies the scene does not contain. In a real photograph (fine textiles, distant colored signage, foliage against sky) this is luminance detail that was never there, permanently baked into a B&amp;W conversion.</li>



<li class="v-spacer"><strong>Green-only modes are immune by construction.</strong> bin G and quincunx render the chroma-only pattern as a uniform field (0.0 %) — exactly what a green-filtered monochrome capture of this scene would record. This is a <em>rendering stance</em>, not a free lunch: real luminance variation that happens to hide in R/B alone is rendered flat too. It is, however, never <em>false</em> detail.</li>



<li><strong>bin</strong><strong> luma inherits the CFA’s chroma aliasing — amplified.</strong> Its R and B quarter-density samples fold high-frequency chroma straight into the output with only the 2×2 box average as protection: 28.6 % ripple in the aliased band, the worst of all pipelines tested, and visible in the panel as hard dark banding. Its low-band figure (12.5 %) is not an error — it is the legitimate ripple of its own equal-weight BW mix — but the high band is pure aliasing.</li>
</ol>



<p>The practical guidance follows directly: <strong>on subjects with fine saturated-color detail, prefer </strong><strong>bin</strong><strong> G or </strong><strong>quincunx</strong><strong> over both </strong><strong>bin</strong><strong> luma and demosaic-based conversion</strong>; reserve bin luma’s noise advantage (§ 5.3) for scenes without high-frequency chroma. This sharpens, rather than changes, the recommendations of § 6.</p>



<h2 class="wp-block-heading"><a></a><a id="_Toc236496866">7.1 Where this lives in real photographs</a></h2>



<p>The chirp target isolates the mechanism; this subsection asks how much of it survives in ordinary photographic content. To get a real-world test <em>with known ground truth</em>, the demosaiced Berlin capture was box-downsampled 3× — at the new scale it is simply a fully known RGB scene (any demosaic residue in it becomes legitimate scene content) — then re-mosaicked with the same channel sensitivities and pushed through every pipeline again.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b8bec&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b8bec" class="wp-block-image size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="721" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2-1024x721.png" alt="" class="wp-image-4152" style="width:1118px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2-1024x721.png 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2-300x211.png 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2-768x541.png 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2-1140x803.png 1140w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-2.png 1352w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Real-world reconstruction test. Top left: the color scene (known ground truth). The remaining panels are the B&amp;W renderings. Note the red shirt: the luma pipelines render it mid-gray, the green-only modes render it distinctly darker — the green-filter rendering stance made visible, and a concrete illustration of the irreversibility discussed in § 6 (<strong>click to enlarge</strong>).</figcaption></figure>



<p>Measured against each pipeline’s own target rendering (Rec. 709 luma for the luma pipelines, the green channel for bin G and quincunx), normalized RMS errors on this scene are small and comparable: DHT 1.9 %, bin G 1.9 %, bin luma 1.7 %, quincunx 2.6 %. That is an honest and important negative result: <strong>on ordinary content, even with saturated colors present, demosaicing’s errors are modest</strong> — most photographs simply do not put chroma at the sampling limit, which is exactly why demosaic+BW is a good general default (§ 6). Note the figures are not directly rankable across the two target renderings; they describe each method’s fidelity to its own goal.</p>



<p>The <em>nature</em> of the errors, not their magnitude, is what separates the pipelines. Zooming into the region where the errors concentrate — fine foliage behind a parapet — and mapping each output’s deviation from its target:</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b8f34&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b8f34" class="wp-block-image size-large is-resized wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="557" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-7-1024x557.png" alt="" class="wp-image-4157" style="width:1120px;height:auto" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-7-1024x557.png 1024w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-7-300x163.png 300w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-7-768x418.png 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-7-1536x836.png 1536w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-7-1140x620.png 1140w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/image-7.png 1720w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Zoom into the highest-error region, with per-method error maps (darker = larger deviation, amplified 5×). DHT’s errors are structured false texture concentrated in the fine colored foliage — small-scale luminance invented from chroma. The no-demosaic modes’ errors concentrate at high-contrast edges and are pure softening — resolution honestly lost, never detail invented (<strong>click to enlarge</strong>).</figcaption></figure>



<p>This is the practical summary of the whole section: demosaicing errs by <strong>inventing</strong>, no-demosaic errs by <strong>blurring</strong>, and on typical content both err little. Subjects that push chroma toward the sampling limit — where the invention becomes visible and permanent in B&amp;W — include fine textiles and knits (houndstooth, tweed), distant colored signage and traffic markings, brick and roof-tile courses, printed halftones, LED/LCD screens, feathers, and backlit foliage edges. Photographers of such subjects are the audience for whom bin G and quincunx exist.</p>



<h2 class="wp-block-heading"><a id="_Toc236496866">7.2 Real-world comparisons between demosaiced and non-demosaiced monochrome conversion</a></h2>



<p>The following comparison shows two very magnified crops of the same image treated into the following ways:</p>



<ol start="1" class="wp-block-list">
<li class="v-spacer"><strong>Top Crop</strong> : 3FR 100mpxl raw image opened in Photoshop, treated in ACR at default settings, converted into monochrome with PS Channel Mixer (red: 0%, green: 100%, blue: 0%) to simulate a green-filtered monochrome image. Magnification: 428% to match the bottom crop.</li>



<li><strong>Bottom Crop</strong>: Linear monochrome DNG produced by RWMono quincunx + de-rotate, treated in ACR at default settings. Magnification: 600% to match the top crop.</li>
</ol>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7f2be7b9311&quot;}" data-wp-interactive="core/image" data-wp-key="6a7f2be7b9311" class="wp-block-image aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="733" height="1024" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/real_sample_1-733x1024.jpg" alt="" class="wp-image-4258" srcset="https://photography.marcoristuccia.com/wp-content/uploads/2026/08/real_sample_1-733x1024.jpg 733w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/real_sample_1-215x300.jpg 215w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/real_sample_1-768x1072.jpg 768w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/real_sample_1-1100x1536.jpg 1100w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/real_sample_1-1467x2048.jpg 1467w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/real_sample_1-612x855.jpg 612w, https://photography.marcoristuccia.com/wp-content/uploads/2026/08/real_sample_1-scaled.jpg 1833w" sizes="(max-width: 733px) 100vw, 733px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Real-world image comparison. High magnified crops of the same image with two different monochrome conversions: TOP: usual demosaicing, 100mpxl image, 428% magnification. BOTTOM: RWMono Quincunx + Derotate, 50mpxl image, 500% magnificationenshot (<strong>click to enlarge</strong>).</figcaption></figure>



<p>This comparison clearly shows two advantages of the non-demosaiced process:</p>



<ul class="wp-block-list">
<li class="v-spacer">Lower noise and less wormy pattern in the sky area.</li>



<li>Absence of demosaicing artifacts around the white stick/antenna.</li>
</ul>



<h1 class="wp-block-heading"><a></a><a id="_Toc236496867">References</a></h1>



<ul class="wp-block-list">
<li>B. E. Bayer, “Color imaging array,” U.S. Patent 3,971,065 (1976).</li>



<li>D. Alleysson, S. Süsstrunk, J. Hérault, “Linear demosaicing inspired by the human visual system,” <em>IEEE Trans. Image Processing</em> 14(4), 2005.</li>



<li>E. Dubois, “Frequency-domain methods for demosaicking of Bayer-sampled color images,” <em>IEEE Signal Processing Letters</em> 12(12), 2005.</li>



<li>ITU-T Recommendation T.81 (JPEG), Annex H (lossless processes) and Annex K (Huffman table generation), 1992.</li>



<li>Adobe Systems, <em>Digital Negative (DNG) Specification</em>, version 1.4.</li>



<li>LibRaw LLC, <em>LibRaw</em> raw decoding library; <em>Monochrome2DNG</em> converter, FastRawViewer.</li>
</ul>



<p></p>
<p>The post <a href="https://photography.marcoristuccia.com/rwmono-an-experiment-raw-bw-conversion/">RWMono &#8211; Non-demosaiced Monochrome Conversion for CFA Camera Sensors</a> appeared first on <a href="https://photography.marcoristuccia.com">MARCO RISTUCCIA</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://photography.marcoristuccia.com/rwmono-an-experiment-raw-bw-conversion/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
