{"id":8026,"date":"2010-07-20T12:10:35","date_gmt":"2010-07-20T10:10:35","guid":{"rendered":"http:\/\/www.boscarol.com\/blog\/?p=8026"},"modified":"2017-10-27T19:45:22","modified_gmt":"2017-10-27T17:45:22","slug":"acr-algoritmo-di-formazione-dellimmagine","status":"publish","type":"post","link":"http:\/\/www.boscarol.com\/blog\/?p=8026","title":{"rendered":"ACR: algoritmo di formazione dell&#8217;immagine"},"content":{"rendered":"<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-15619\" title=\"Processo Raw in ACR\" src=\"https:\/\/i0.wp.com\/www.boscarol.com\/blog\/wp-content\/uploads\/2010\/07\/workflow.jpg?resize=581%2C310\" alt=\"\" width=\"581\" height=\"310\" srcset=\"https:\/\/i0.wp.com\/www.boscarol.com\/blog\/wp-content\/uploads\/2010\/07\/workflow.jpg?w=646 646w, https:\/\/i0.wp.com\/www.boscarol.com\/blog\/wp-content\/uploads\/2010\/07\/workflow.jpg?w=300 300w\" sizes=\"(max-width: 581px) 100vw, 581px\" data-recalc-dims=\"1\" \/><\/p>\n<p>Qual \u00e8 il flusso delle operazioni seguite da ACR (versione 5.2 o superiore) quando deve ricostruire una immagine dai dati RAW?\u00a0Qui per semplicit\u00e0 mi limito a considerare la formazione dell&#8217;immagine<\/p>\n<ul>\n<li>di un file RAW <span style=\"text-decoration: underline;\">non DNG<\/span> (quindi NEF, CR2 o altro);<\/li>\n<li>per il quale non c&#8217;\u00e8 necessit\u00e0 di matrici di calibrazione calcolate da Adobe;<\/li>\n<li>proveniente da un sensore RGB con 3 piani di dati (cio\u00e8 SamplePerPixel = 3) che \u00e8 il caso tipico;<\/li>\n<li>proveniente da un sensore RGB che, come la stragrande maggioranza, non fa bilanciamento analogico;<\/li>\n<li>con le impostazioni Adobe originali.<\/li>\n<\/ul>\n<p>Dunque <strong>non considero<\/strong> (almeno in questo post):<\/p>\n<ul>\n<li>lo sviluppo dei file DNG;<\/li>\n<li>le matrici CameraCalibration, che modificano le ColorMatrix. <em>They are populated (if they are) based on metadata from the source raw file, usually by comparing the &#8220;daylight&#8221; white balance factors between the current camera and a reference camera Adobe used for calibration<\/em>. -Thomas Knoll;<\/li>\n<li>le matrici ReductionMatrix che sono utilizzate quando i piani di dati sono pi\u00f9 di 3;<\/li>\n<li>l&#8217;eventuale bilanciamento analogico (unici casi conosciuti: <em>hardware<\/em> per qualche dorso Better Light; <em>software<\/em> per Nikon D1);<\/li>\n<li>le impostazioni di utente diverse da quelle standard di default;\u00a0dunque non considero il setting\u00a0personale di fotocamera e l&#8217;xml personale di immagine e\u00a0le impostazioni di calibrazione;<\/li>\n<li>i profili DNG di tipo &#8220;Camera&#8221; e creati o modificati dall&#8217;utente.<\/li>\n<\/ul>\n<p><strong><br \/>\n<span style=\"color: #0000ff;\"> A &#8211; Recupero dei dati necessari<\/span><\/strong><\/p>\n<p><strong>1<\/strong><br \/>\nLa prima cosa che fa ACR \u00e8 recuperare nei metadati dell&#8217;immagine la <strong>marca<\/strong> e il <strong>modello<\/strong> della fotocamera (corrisponde al tag UniqueCameraModel in DNG).<\/p>\n<p><strong>2<br \/>\n<\/strong>Quindi ACR recupera il profilo <strong>Adobe<\/strong> <strong>Standard<\/strong> \u00a0per quell&#8217;UniqueCameraModel. (Se il profilo non \u00e8 disponibile per quel modello viene usato un profilo ACR, per esempio ACR 4.4.) Nel profilo Adobe Standard<strong>,<\/strong> ACR recupera (oltre alle info generali come il copyright, il nome, la politica di incorporazione) i seguenti dati:<\/p>\n<ul>\n<li>i due <strong>illuminanti<\/strong> per i quali \u00e8 stato creato il profilo; (sono i tag CalibrationIlluminant1 e CalibrationIlluminant2 del profilo); nel profilo Adobe Standard ci sono sempre due illuminanti e questi sono sempre A e D65; in altri profili possono essercene due diversi da questi, oppure uno solo;<\/li>\n<li>le due <strong>matrici di caratterizzazione<\/strong> (sono i tag ColorMatrix1 e ColorMatrix2, due matrici 3 x 3 relative ai due illuminanti, che portano i valori <span style=\"text-decoration: underline;\">XYZ<\/span> in valori <span style=\"text-decoration: underline;\">Camera RGB non bilanciati<\/span>); queste matrici servono per calcolare la cromaticit\u00e0 del bianco bilanciato; inoltre possono poi essere usate per caratterizzare la fotocamera, ma Adobe preferisce per questo secondo scopo le matrici indicate qui sotto;<\/li>\n<li><strong>altre due matrici di caratterizzazione<\/strong> (sono i tag ForwardMatrix1 e ForwardMatrix2, altre due matrici 3 x 3 per i due illuminanti, che portano i valori <span style=\"text-decoration: underline;\">Camera RGB bilanciati<\/span> in valori <span style=\"text-decoration: underline;\">XYZ D50<\/span>); Adobe usa queste matrici, e non le precedenti, per caratterizzare la fotocamera;<\/li>\n<li><strong>LookTable<\/strong> (cio\u00e8 i tag ProfileLookTableData e ProfileLookTableDims), una tabella che va da HSL a HSL; \u00e8 una singola tabella e non ha bisogno di interpolazione.<\/li>\n<\/ul>\n<p>Nei profili Adobe Standard non c&#8217;\u00e8 altro (nei profili &#8220;Camera&#8221; e in quelli creati dall&#8217;utente ci possono essere curve tonali e tavole HueSat).<\/p>\n<p><strong>3<\/strong><br \/>\nDai metadati dell&#8217;immagine Raw, ACR pu\u00f2 recuperare altri dati che gli servono:<\/p>\n<ul>\n<li>dati per la <strong>linearizzazione<\/strong> (corrispondenti al tag LinearizationTable in DNG);<\/li>\n<li>dati per il <strong>livello del nero<\/strong> (corrispondono ai tag DNG BlackLevel, BlackLevelDeltaH, BlackLevelDeltaV)<\/li>\n<li>dati per il <strong>livello del bianco<\/strong> (WhiteLevel);<\/li>\n<li>dati della <strong>cromaticit\u00e0 dell&#8217;illuminante<\/strong> della scena in fattori Raw o in xy (tag AsShot).<\/li>\n<\/ul>\n<p><strong><br \/>\n<span style=\"color: #0000ff;\"> B &#8211; Calcolo dei dati lineari di fotocamera<\/span> <span style=\"font-weight: normal;\">(<\/span><em><span style=\"font-weight: normal;\">linear reference values<\/span><\/em><\/strong>)<\/p>\n<p><strong>1<\/strong><br \/>\nI dati digitali Raw originali vengono <strong>decompressi<\/strong> (se sono compressi) e\/o <strong>decodificati<\/strong> (se sono codificati).\u00a0Ognuno dei tre piani RGB viene processato indipendentemente.<\/p>\n<p><strong>2<br \/>\n<\/strong>I dati digitali vengono <strong>linearizzati<\/strong> se gi\u00e0 non lo sono. In un altro post del blog c&#8217;\u00e8 un esempio di <span style=\"text-decoration: underline;\">l<\/span><a href=\"http:\/\/www.boscarol.com\/blog\/?p=506\" target=\"_self\">inearizzazione per formati NEF<\/a>. Il sensore cattura dati di luminanza, ma nella fotocamera possono essere compressi in qualche modo e in tal caso non sono pi\u00f9 lineari con la luminanza e quindi vanno ri-linearizzati.<\/p>\n<p><strong>3<\/strong><br \/>\nViene calcolato e sottratto il valore di <em>black leve<\/em><em>l<\/em> per ogni pixel. Il <strong>black level<\/strong> per ogni pixel \u00e8 la somma di queste tre informazioni che possono essere contenute nei metadati:<\/p>\n<ul>\n<li>BlackLevel: informazione sul <em>dark current noise<\/em> (eccitazione causata dall&#8217;energia termica)<\/li>\n<li>BlackLevelDeltaH: distribuzione del <em>black level<\/em> sulle righe<\/li>\n<li>BlackLevelDeltaV: distribuzione del <em>black level<\/em> sulle colonne.<\/li>\n<\/ul>\n<p><strong>4<\/strong><br \/>\nI dati vengono <strong>scalati<\/strong> nell&#8217;intervallo 0-1. Il fattore di scala \u00e8 1 \/ (WhiteLevel &#8211; <em>maximum computed black level for the sample plane<\/em>) e i dati vengono clippati a 0 e 1.<\/p>\n<p>A questo punto i dati sono nello <strong>spazio lineare di fotocamera<\/strong>. Il nero assoluto (zero luce) \u00e8 codificato come 0.0 e il massimo valore utile (limitato o dalla saturazione del sensore oppure dal <em>clipping<\/em> dell&#8217;ADC) \u00e8 codificato come 1.0.<\/p>\n<p><strong><br \/>\n<span style=\"color: #0000ff;\"> C &#8211; Demosaicizzazione<\/span><\/strong><\/p>\n<p>La <strong>demosaicizzazione<\/strong> viene calcolata con un algoritmo privato e non noto, modificato pi\u00f9 volte nelle varie versioni di ACR.<\/p>\n<p><strong><span style=\"color: #0000ff;\"><br \/>\nD &#8211; Calcolo della cromaticit\u00e0 xy del bianco di fotocamera<\/span><\/strong> (cio\u00e8 dell&#8217;illuminante della scena)<\/p>\n<p>Per default ACR prende il bianco AsShot (cio\u00e8 impostato in macchina dall&#8217;utente); se non c&#8217;\u00e8 un AsShot calcola un bianco automaticamente (Auto).<\/p>\n<p>Tipicamente il bianco AsShot \u00e8 dato in <strong>numeri di sensore<\/strong>, e in tal caso la cromaticit\u00e0 del bianco si trova con questo processo iterativo usando le matrici ColorMatrix:<\/p>\n<ol>\n<li>scegliere a caso un valore xy;<\/li>\n<li>ricavare una ColorMatrix per interpolazione (vedi qui sotto *);<\/li>\n<li>applicare questo xy a questa matrice e vedere se corrispondono i numeri;<\/li>\n<li>se non corrispondono tornare indietro con l&#8217;inversa ColorMatrix e riprovare fino a che la serie converge.<\/li>\n<\/ol>\n<p>Dai\u00a0<strong>valori di cromaticit\u00e0<\/strong> xy si calcola la temperatura di colore (Bruce Lindbloom ha un calcolatore per farlo) e si interpola la ColorMatrix per quella temperatura.<\/p>\n<p>* L&#8217;interpolazione viene fatta linearmente usando le temperature inverse. Per esempio per interpolare 5000 K tra 2000 K e 6000 K, si interpola linearmente tra 1\/2000 e 1\/6000 il valore 1\/5000, che equivale a interpolare linearmente tra 1\/2 e 1\/6 il valore 1\/5.<\/p>\n<p>Se servono i numeri di sensore si applica la ColorMatrix inversa.<\/p>\n<p><strong><br \/>\n<span style=\"color: #0000ff;\">E &#8211; Calcolo della matrice di conversione da RGB di fotocamera in XYZ<\/span><\/strong><\/p>\n<p>In questa fase viene calcolata una <strong>matrice<\/strong> \u00a03 x 3 che porta dalle coordinate di fotocamera (numeri Raw) alle coordinate dello spazio XYZ, portando il bianco di fotocamera in D50 con una CAT.<\/p>\n<p>Per questa operazione sono disponibili due algoritmi indicati qui sotto con A e B. Se sono presenti le matrici ForwardMatrix ACR usa l&#8217;algoritmo A. Se non sono presenti (come nei profili ACR 4.3 o precedenti) ACR usa l&#8217;algoritmo B che fa uso delle ColorMatrix.<\/p>\n<p><span style=\"text-decoration: underline;\">Algoritmo A<\/span> (da usare se <strong>sono<\/strong> presenti le matrici ForwardMatrix)<\/p>\n<p>Le matrici ForwardMatrix (FM), per definizione, si aspettano coordinate di camera gi\u00e0 bilanciate e le portano in XYZ con\u00a0un adattamento cromatico incorporato che mappa il vettore unitario (1, 1, 1), cio\u00e8 il bianco di camera in XYZ D50. Per l&#8217;adattamento cromatico Adobe usa la CAT di Bradford, ma lo sviluppatore pu\u00f2 usare quella che preferisce.<\/p>\n<ul>\n<li>Si crea una matrice diagonale con i valori Camera Neutral (cio\u00e8 valori Raw che definiscono il bilanciamento di bianco).<\/li>\n<li>Si moltiplica FM per la matrice \u00a0sopra indicata e si ottiene la matrice CameraToXYZ_D50.<\/li>\n<\/ul>\n<p>Questo metodo esegue il bilanciamento scalando i valori di camera invece di usare un adattamento cromatico e, secondo quanto scritto nelle specifiche DNG, funziona meglio in casi estremi (un motivo per consigliare questo algoritmo).<\/p>\n<p><span style=\"text-decoration: underline;\">Algoritmo B<\/span> (da usare se <strong>non sono<\/strong> presenti le matrici ForwardMatrix)<\/p>\n<p>Si calcola la matrice XYZtoCamera moltiplicando \u00a0(se esiste) la matrice CameraCalibration interpolata (CC) per la matrice ColorMatrix interpolata (CM). Questa\u00a0matrice porta <span style=\"text-decoration: underline;\">da XYZ D50<\/span> alle coordinate di fotocamera originali, <span style=\"text-decoration: underline;\">prima del bilanciamento<\/span>.<\/p>\n<p>Ora si inverte questa matrice ottenendo la matrice CameraToXYZ che porta <span style=\"text-decoration: underline;\">dalle coordinate di fotocamera originali non bilanciate<\/span> a <span style=\"text-decoration: underline;\">XYZ D50<\/span>.<\/p>\n<p>Ora bisogna applicare una matrice di adattamento cromatico CA che porta dal valore xy di bilanciamento a D50 (con la CAT di Bradford). Si ottiene\u00a0la matrice CameraToXYZ_D50 = CA * CameraToXYZ che comprende la conversione in XYZ e l&#8217;adattamento cromatico.<\/p>\n<p>Questo metodo richiede il calcolo dell&#8217;adattamento cromatico perch\u00e9 opera il bilanciamento su dati XYZ (contrariamente al metodo precedente).<\/p>\n<p>A questo punto si hanno i<strong> dati XYZ D50 per ogni pixel<\/strong>.<\/p>\n<p><strong><br \/>\n<span style=\"color: #0000ff;\"> F &#8211; Applicazione delle modifiche di utente e di profilo<\/span><\/strong><\/p>\n<p><strong>1<br \/>\n<\/strong>Se ci fosse una tavola HueSat 2.5 D verrebbe applicata ora (ma nel profilo Adobe Standard non c&#8217;\u00e8, c&#8217;\u00e8 solo nei profili creati o modificati dall&#8217;utente con DNG PE).<\/p>\n<ul>\n<li>I dati XYZ D50 vengono convertiti in RGB RIMM e questi\u00a0in HSL.<\/li>\n<li>Se le tavole sono due si interpolano e si ottiene una singola tavola 2.5D.<\/li>\n<li>Vengono applicate le correzioni (spostamenti 2.5D) in HSL.<\/li>\n<li>I dati HSL sono riconvertiti in RGB RIMM e in XYZ D50.<\/li>\n<\/ul>\n<p><strong>2<br \/>\n<span style=\"font-weight: normal;\">Se non esiste un set mxl di controlli utente (per esempio perch\u00e9 \u00e8 la prima volta che l&#8217;immagine viene aperta) i cursori vengono presentati tutti a 0, meno Brightness (50) e Contrast (25). La curva tonale viene presentata con &#8220;Medium Contrast&#8221;.<\/span><\/strong><\/p>\n<p><strong><span style=\"font-weight: normal;\">Se \u00e8 presente un set di controlli utente xml da applicare, vengono applicati \u00a0in qualche ordine che Adobe non specifica.<\/span><\/strong><\/p>\n<p><strong>3<br \/>\n<\/strong>I dati sono convertiti in RGB RIMM e in HSL.\u00a0Qui si applica la tavola HSL 3D Look (che nel profilo Adobe Standard c&#8217;\u00e8)\u00a0e contiene <em>hue twist<\/em>.\u00a0I dati sono poi riconvertiti in RGB RIMM.<\/p>\n<p><strong><br \/>\n<span style=\"color: #0000ff;\"> G &#8211; Applicazione \u00a0della curva tonale<\/span><\/strong><\/p>\n<p>Come indicato dal profilo, si applica la curva tonale standard non modificata.<\/p>\n<p><strong><span style=\"color: #0000ff;\"><br \/>\nH &#8211; Workflow e compensazione monitor<\/span><\/strong><\/p>\n<p>I dati RGB RIMM sono convertiti in uno dei quattro profili ICC di workflow (per esempio Adobe RGB) con intento di rendering colorimetrico relativo. Se il workflow prevede ProPhoto viene semplicemente applicato il gamma 1.8 ai valori RGB RIMM.<\/p>\n<p>I <strong>dati RGB convertiti nel profilo ICC di workflow <\/strong>sono i dati RGB visualizzati sia come numeri sia nell&#8217;istogramma.<\/p>\n<p>Infine viene fatta la compensazione monitor e l&#8217;immagine viene presentata all&#8217;utente in attesa di modifiche, o di apertura in Photoshop.<\/p>\n<p><strong><span style=\"color: #0000ff;\"><br \/>\nI &#8211; Interventi dell&#8217;utente<\/span><\/strong><\/p>\n<p>Se l&#8217;utente modifica qualche controllo, si riparte dal punto F2.<\/p>\n<p>I seguenti quattro controlli, se impostati al loro default, \u00a0mantengono la curva tonale presente nel profilo, altrimenti la modificano<\/p>\n<ul>\n<li>Brightness (default 50)<\/li>\n<li>Contrast (default 25)<\/li>\n<li>Point Tone Curve (default Medium Contrast)<\/li>\n<li>Parametric Tone Curve (default lineare)<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Qual \u00e8 il flusso delle operazioni seguite da ACR (versione 5.2 o superiore) quando deve ricostruire una immagine dai dati RAW?\u00a0Qui per semplicit\u00e0 mi limito a considerare la formazione dell&#8217;immagine di un file RAW non DNG (quindi NEF, CR2 o altro); per il quale non c&#8217;\u00e8 necessit\u00e0 di matrici di calibrazione calcolate da Adobe; proveniente [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false},"categories":[181,372],"tags":[235,95,77,1003,721,602,42,1004],"jetpack_featured_media_url":"","jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/pjoVH-25s","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"http:\/\/www.boscarol.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/8026"}],"collection":[{"href":"http:\/\/www.boscarol.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.boscarol.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.boscarol.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.boscarol.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8026"}],"version-history":[{"count":42,"href":"http:\/\/www.boscarol.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/8026\/revisions"}],"predecessor-version":[{"id":25137,"href":"http:\/\/www.boscarol.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/8026\/revisions\/25137"}],"wp:attachment":[{"href":"http:\/\/www.boscarol.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8026"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.boscarol.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=8026"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.boscarol.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=8026"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}