<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Vision on RawCull</title><link>https://techrawcull.netlify.app/tags/vision/</link><description>Recent content in Vision on RawCull</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 30 Jul 2026 08:19:52 +0200</lastBuildDate><atom:link href="https://techrawcull.netlify.app/tags/vision/index.xml" rel="self" type="application/rss+xml"/><item><title>How PhotoAnalysisKit Is Constructed</title><link>https://techrawcull.netlify.app/docs/packages/photoanalysiskit/</link><pubDate>Thu, 30 Jul 2026 00:00:00 +0000</pubDate><guid>https://techrawcull.netlify.app/docs/packages/photoanalysiskit/</guid><description>&lt;h1 id="how-photoanalysiskit-is-constructed"&gt;How PhotoAnalysisKit Is Constructed&lt;a class="td-heading-self-link" href="#how-photoanalysiskit-is-constructed" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;PhotoAnalysisKit is the reusable measurement layer extracted from RawCull. It
turns a decoded &lt;code&gt;CGImage&lt;/code&gt; plus neutral capture metadata into sharpness,
saliency, focus evidence, and an optional focus-mask image. It can also create
opaque Apple Vision feature prints.&lt;/p&gt;
&lt;p&gt;The package measures a photo; it does not decide whether to keep it. That
distinction prevents image-processing code from becoming coupled to RawCull&amp;rsquo;s
files, settings, views, caches, or culling policy.&lt;/p&gt;</description></item><item><title>Focus Mask and Sharpness</title><link>https://techrawcull.netlify.app/docs/focusmask/</link><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><guid>https://techrawcull.netlify.app/docs/focusmask/</guid><description>&lt;h1 id="focus-mask-and-sharpness"&gt;Focus Mask and Sharpness&lt;a class="td-heading-self-link" href="#focus-mask-and-sharpness" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;RawCull&amp;rsquo;s focus system does two related jobs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;produce a visible focus mask for image inspection,&lt;/li&gt;
&lt;li&gt;compute a scalar sharpness score for sorting, burst ranking, and saved scoring.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both jobs use the same core engine, but the UI overlay and the numeric score are not identical. The overlay tries to show useful focus evidence. The score tries to rank files fairly across a catalog or burst.&lt;/p&gt;</description></item><item><title>Detailed Sharpness Scoring</title><link>https://techrawcull.netlify.app/docs/detailsharpnessscoring/</link><pubDate>Wed, 15 Jul 2026 00:00:00 +0000</pubDate><guid>https://techrawcull.netlify.app/docs/detailsharpnessscoring/</guid><description>&lt;h1 id="detailed-sharpness-scoring"&gt;Detailed Sharpness Scoring&lt;a class="td-heading-self-link" href="#detailed-sharpness-scoring" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This page explains, step by step, where RawCull computes sharpness scores, what code is involved, what the score means, and which factors can move the result up or down.&lt;/p&gt;
&lt;p&gt;The short version: RawCull does not ask &amp;ldquo;is the whole image contrasty?&amp;rdquo;. It asks &amp;ldquo;how much reliable edge detail exists in the useful part of the image, especially around the subject or the camera AF point?&amp;rdquo;. The score is then used for sharpness sorting, burst ranking, saved scoring results, and inspection badges.&lt;/p&gt;</description></item><item><title>Detailed Focus Mask Computation</title><link>https://techrawcull.netlify.app/docs/detailsfocusmask/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid>https://techrawcull.netlify.app/docs/detailsfocusmask/</guid><description>&lt;h1 id="detailed-focus-mask-computation"&gt;Detailed Focus Mask Computation&lt;a class="td-heading-self-link" href="#detailed-focus-mask-computation" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This page explains, step by step, how RawCull computes the visible focus mask: where the work starts in the UI, which model and engine methods run, how the bitmap overlay is produced, what the intermediate values mean, and which factors can change the final result.&lt;/p&gt;
&lt;p&gt;The short version: the focus mask is not a camera focus-point display. It is a computed overlay built from local edge energy. RawCull first finds useful regions to inspect, then computes a Laplacian edge-energy image, ranks local patches, thresholds the strongest evidence, colorizes it, clips it to the selected patch areas, and finally draws the result over the photo.&lt;/p&gt;</description></item><item><title>Burst Groups</title><link>https://techrawcull.netlify.app/docs/burstgroup/</link><pubDate>Wed, 15 Jul 2026 00:00:00 +0000</pubDate><guid>https://techrawcull.netlify.app/docs/burstgroup/</guid><description>&lt;h1 id="burst-groups"&gt;Burst Groups&lt;a class="td-heading-self-link" href="#burst-groups" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Burst analysis turns a flat catalog into groups of adjacent, visually similar frames. It ranks each multi-frame group, presents review queues, and supports culling decisions such as keeping the best frame, keeping the top two, deferring a group, or setting a manual pick.&lt;/p&gt;
&lt;p&gt;The implementation separates orchestration, Vision feature-print indexing, pure grouping and ranking engines, cache persistence, and the review UI.&lt;/p&gt;
&lt;h2 id="source-map"&gt;Source Map&lt;a class="td-heading-self-link" href="#source-map" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Area&lt;/th&gt;
					&lt;th&gt;Main files&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Analysis orchestration and user actions&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;sourcecode/RawCull/RawCull/Model/ViewModels/RawCullViewModel+BurstGrouping.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Similarity indexing and grouping state&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;sourcecode/RawCull/RawCull/Model/ViewModels/SimilarityScoringModel.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Pure grouping and ranking&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;sourcecode/RawCullCore/Sources/RawCullCore/BurstGroupingEngine.swift&lt;/code&gt;, &lt;code&gt;BurstRankingEngine.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Shared models&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;sourcecode/RawCullCore/Sources/RawCullCore/BurstAnalysisModels.swift&lt;/code&gt;, app &lt;code&gt;BurstAnalysisModels.swift&lt;/code&gt;, &lt;code&gt;BurstReviewQueueModels.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cache&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;sourcecode/RawCull/RawCull/Actors/BurstAnalysisCache.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Ratings and manual overrides&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;CullingModel.swift&lt;/code&gt;, &lt;code&gt;SavedFiles.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Burst home and review list&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;BurstGroupsHomeView.swift&lt;/code&gt;, &lt;code&gt;SimilarityGridSelectionView.swift&lt;/code&gt;, &lt;code&gt;CullingGridView.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Single-burst workspace and comparison&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;BurstCullingWorkspaceView.swift&lt;/code&gt;, &lt;code&gt;ComparisonGridView.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Tests&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;RawCullCore/Tests/RawCullCoreTests/BurstGroupingEngineTests.swift&lt;/code&gt;, &lt;code&gt;BurstRankingEngineTests.swift&lt;/code&gt;, app burst/culling tests&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="end-to-end-flow"&gt;End-to-End Flow&lt;a class="td-heading-self-link" href="#end-to-end-flow" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 A[&amp;#34;Analyze Bursts&amp;#34;] --&amp;gt; B[&amp;#34;RawCullViewModel.analyzeBursts&amp;#34;]
 B --&amp;gt; C{&amp;#34;Valid BurstAnalysisCache?&amp;#34;}
 C --&amp;gt;|&amp;#34;yes&amp;#34;| D[&amp;#34;Remap cached IDs and apply snapshot&amp;#34;]
 C --&amp;gt;|&amp;#34;no&amp;#34;| E{&amp;#34;Sharpness scores missing?&amp;#34;}
 E --&amp;gt;|&amp;#34;yes&amp;#34;| F[&amp;#34;Calibrate and score target files&amp;#34;]
 E --&amp;gt;|&amp;#34;no&amp;#34;| G[&amp;#34;Reuse scores&amp;#34;]
 F --&amp;gt; H{&amp;#34;Similarity embeddings missing?&amp;#34;}
 G --&amp;gt; H
 H --&amp;gt;|&amp;#34;yes&amp;#34;| I[&amp;#34;Index Vision feature prints&amp;#34;]
 H --&amp;gt;|&amp;#34;no&amp;#34;| J[&amp;#34;Reuse embeddings&amp;#34;]
 I --&amp;gt; K[&amp;#34;Group adjacent frames&amp;#34;]
 J --&amp;gt; K
 K --&amp;gt; L[&amp;#34;Rank multi-frame groups&amp;#34;]
 L --&amp;gt; M[&amp;#34;Apply manual winner overrides&amp;#34;]
 M --&amp;gt; N[&amp;#34;Save cache and review-state snapshots&amp;#34;]
 N --&amp;gt; O[&amp;#34;Show home dashboard and review queues&amp;#34;]&lt;/pre&gt;
&lt;p&gt;Every awaited phase is protected by the analysis generation and selected catalog. A cancelled or superseded run cannot publish late results into a newer catalog.&lt;/p&gt;</description></item></channel></rss>