Algoritmer för skapande av WCS-transformering

Skapa transformeringar

 

sekventiell transformeringskörning

 

Skapande av optimerade transformeringar

 

ICCProfileFromWCSProfile

 

black preservation och black generation

 

Kontrollera

Skapa transformeringar

För att förklara hur färgtransformeringar fungerar korrekt är det bra att förklara den fullständiga bearbetningsvägen genom både ICM 2.0 och CTE:s interna funktioner. Funktionen ICM 2.0 CreateColorTransformW skapar en färgtransformering som program kan använda för att utföra färghantering. Den här funktionen skapar en färgkontext från LOGCOLORSPACE-- och avsiktsindata. Avsikterna mappas till algoritmen för baslinje-ICC-omfångsmappning som korrelerar. Funktionen anropar sedan funktionen ICM 2.0 CreateMultiProfileTransform för konsekvent färgbearbetning. Funktionen CreateColorTransform kopierar vanligtvis data till den interna optimerade transformeringsstrukturen.

Funktionen ICM 2.0 CreateMultiProfileTransform accepterar en matris med profiler och en matris med avsikter eller en enda enhetslänkprofil och skapar en färgtransformering som program kan använda för att utföra färgmappning. Den bearbetar dessa indataprofiler och avsikter för att skapa enhetsmodeller, färgutseendemodeller, beskrivningar av omfångsgränser och modeller för omfångsmappning. Så här gör du:

  • Enhetsmodeller initieras direkt från DM-profiler. Det finns en enhetsmodell som skapats för varje profil i anropet till CreateMultiProfileTransform.
  • Färgutseendemodeller initieras direkt från CAM-profiler. Det finns en CAM-profil för varje profil i anropet till CreateMultiProfileTransform. Samma CAM-profil kan dock anges för mer än en profil.
  • Beskrivningar av omfångsgränser initieras från ett enhetsmodellobjekt och ett CAM-objekt. Det finns en beskrivning av omfångsgränser för varje profil i anropet till CreateMultiProfileTransform.
  • Modeller för gamutmappning initieras från två omfångsgränser och en avsikt. Du måste skapa en modell för omfångsmappning mellan varje par av enhetsmodeller som skapats från anropet till CreateMultiProfileTransform. Observera att det innebär att du använder en kartmodell med färre omfång än enhetsmodellen. Eftersom antalet avsikter matchar antalet enhetsmodeller finns det också en avsikt till än vad som krävs. Den första avsikten i listan hoppas över. Du går igenom listan över enhetsmodeller och avsikter och skapar modeller för omfångsmappning. Plocka upp den första och andra enhetsmodellen och den andra avsikten och initiera sedan den första omfångsmappningsmodellen. Plocka upp den andra och tredje enhetsmodellen och den tredje avsikten och initiera sedan den andra omfångsmappningsmodellen. Fortsätt på det här sättet tills du har skapat alla modeller för omfångsmappning.

När profilerna har bearbetats korrekt och alla mellanliggande objekt har skapats och initierats kan du skapa CITE-transformeringen med följande anrop. pDestCAM och pDestDM är de som är associerade med den sista profilen i anropet till CreateMultiProfileTransform.

HRESULT CreateCITEColorTransform(
 __inout     IDeviceModel          *pSourceDM,
 __inout     IColorAppearanceModel *pSourceCAM,
 __in        GamutMapArray         *pGamutMapArray,
 __inout     IColorAppearanceModel *pDestCAM,
 __inout     IDeviceModel          *pDestDM,
             EColorTransformMode    eTransformMode,
 __deref_out IColorTransform      **ppCTS
 );

Stöd för plugin-program

Ett problem med att konfigurera transformeringslistan är att kontrollera om ett nödvändigt plugin-program är tillgängligt. Följande modellväxel tillhandahåller den här principen för att styra det här beteendet. Hanteringen av den här transformeringslistan är en metod i den interna optimerade transformeringsstrukturen, men varje modellmetod ger pekaren till sig själv och sin egen uppsättning parametervärden.

Läget måste vara något av följande.

  • TfmRobust: Om en måttprofil anger ett önskat plugin-program och plugin-programmet inte är tillgängligt använder det nya CTE-systemet baslinje-plugin-programmet. Om inget av plugin-programmen är tillgängliga rapporterar transformen ett fel.
  • TfmStrict: Om ColorContext anger ett önskat plugin-program måste plugin-programmet vara tillgängligt. Om inget önskat plugin-program hittas används plugin-programmet för baslinjen. Om inget av plugin-programmen är tillgängliga rapporterar transformen ett fel.
  • TfmBaseline: Endast plugin-program för baslinje kan användas i AddMeasurementStep. Om ColorContext anger ett prioriterat plugin-program ignoreras plugin-programmet. Om baslinje-plugin-programmet inte är tillgängligt rapporterar transformen ett fel.

Transformeringskörning

Funktionen ICM 2.0 API TranslateColors översätter en matris med färger från källan färgrymd till målfärgutrymmet enligt definitionen i en färgtransformering. Den här funktionen kontrollerar internt mot en matris med cachelagrade färger för att möjliggöra omedelbar matchning av vanliga transformerade färger. Den här transformeringen stöder 8-bitars bytematriser per kanal och 32 bitar per kanals flyttalsmatriser. Alla andra format konverteras innan de skickas till den nya CTE:n.

Funktionen ICM 2.0 API TranslateBitmapBits översätter färgerna i en bitmapp med ett definierat format för att skapa en annan bitmapp i ett begärt format. Den här funktionen kontrollerar internt mot en matris med cachelagrade färger för att möjliggöra omedelbar matchning av vanliga transformerade färger. För att undvika för många kodsökvägar, stöd och testningskomplexitet stöds endast ett begränsat antal bitmappsformat i transformerings- och interpolationsmotorn. Den här funktionen måste översätta icke-interna inkommande och utgående bitmappsformat till format som stöds internt för bearbetning. Den här transformering stöder endast 8-bitars per kanal byte bitmappar och 32-bitars per kanal float bitmaps. Alla andra format konverteras innan de skickas till den nya CTE:n.

 

Körning av sekventiell transformering

Om parametern dwFlags har SEQUENTIAL_TRANSFORM bituppsättningen när ICM-funktionerna CreateColorTransformW eller CreateMultiProfileTransform anropas, körs transformeringsstegen sekventiellt. Det innebär att koden steg för steg genom varje enhetsmodell, färgutseendemodell och omfångsmappningsmodell separat, enligt CreateColorTransform- eller CreateMultiProfileTransform--anrop. Detta kan vara användbart för felsökning av plugin-moduler, men det är mycket långsammare än att köra via en optimerad transformering. Att köra i sekventiellt läge rekommenderas därför inte för produktionsprogramvara. Dessutom kan det finnas små skillnader i resultaten som erhålls i sekventiellt läge och i optimerat läge. Detta beror på variationer som introduceras när funktionerna sammanfogas.

Skapa optimerade transformeringar

En optimerad transformering är en flerdimensionell uppslagstabell. Tabellen kan bearbetas av en flerdimensionell interpolationsmotor, till exempel tetrahedralinterpolation, som tillämpar indatafärgerna på transformeringen. I följande avsnitt beskrivs hur de optimerade uppslagstabellerna skapas. I avsnittet efter det beskrivs hur du interpolerar i de optimerade uppslagstabellerna.

Glesa uppslagstabeller

Konventionella skrivare har CMYK-bläck. För att utöka omfånget är en metod att lägga till nya tryckfärger i systemet. De färger som vanligtvis läggs till är färger som CMYK-bläck har svårt att återskapa. Vanliga alternativ är orange, grön, röd, blå osv. För att öka den "uppenbara upplösningen" kan bläck med olika nyanser användas, till exempel ljuscyan, ljus magenta och så vidare. I själva verket har skrivarenheten fler än fyra kanaler.

Även om skrivare är utdataenheter utför de också färgkonverteringen från enhetsutrymmet till ett annat färgutrymme. När det gäller en CMYK-skrivare skulle detta vara en transformering från CMYK till XYZ, eller skrivarens "framåtmodell". Genom att kombinera framåtmodellen med andra transformeringar är det möjligt att emulera en CMYK-utskrift på en annan enhet. Till exempel skulle en skrivar-CMYK till en övervaknings-RGB göra det möjligt att använda en språkmekanism som emulerar en utskrift av cmyk-skrivaren på en bildskärm. På samma sätt gäller samma sak även för hi-fi skrivare. En CMYKOG till RGB-konvertering tillåter språkkontroll av CMYKOG-skrivaren på en bildskärm.

Den konventionella metoden för att implementera en sådan färgkonvertering är att använda en enhetlig LUT. I en ICC-profil för en CMYKOG-skrivare kräver ICC-specifikationen till exempel en A2B1-tagg som lagrar en enhetlig LUT som representerar en enhetlig sampling i CMYKOG-enhetsutrymmet för framåtmodellen, som går från CMYKOG till ICC-profilanslutningsutrymmet (antingen CIELAB eller CIEXYZ). ICC-enhetslänkprofilen möjliggör en direkt omvandling från CMYKOG-enhetsutrymme till alla färgutrymmen, inklusive ett enhetsutrymme, även i form av en LUT-samplad enhetligt i CMYKOG-utrymme. Sampling görs aldrig med 256 nivåer (bitdjup 8) på grund av den enorma LUT som resulterar, förutom när det gäller monokroma enheter (1 kanal). I stället används sampling med lägre bitdjup. några vanliga val är 9 (bitdjup 3), 17 (bitdjup 4), 33 (bitdjup 5). Med antalet nivåer som är mindre än 256 i varje kanal används LUT tillsammans med en interpoleringsalgoritm för att producera resultatet om en nivå ligger mellan två samplade nivåer.

Även om en enhetlig LUT är konceptuellt enkel att implementera, och interpolering på en enhetlig LUT i allmänhet är effektiv, ökar LUT-storleken exponentiellt med indatadimensionen. Faktum är att om d är antalet steg som används i den enhetliga LUT och n är antalet kanaler i källfärgutrymmet, är antalet noder i LUT Visar variabeln för antalet noder i en LUT.. Det är uppenbart att antalet noder snabbt kräver så mycket lagringsutrymme i minnet att även top-of-the-line databehandlingssystem har svårt att hantera efterfrågan. För enheter med sex eller åtta kanaler kräver en ICC-implementering av enhetsprofilen några steg i LUT, ibland till och med ned till fem steg i A2B1-tabellen för att hålla profilen inom megabyte i stället för gigabyte. Det är uppenbart att om du använder ett mindre antal steg ökar interpoleringsfelet, eftersom det nu finns färre exempel. Eftersom LUT måste vara enhetlig, försämras noggrannheten över hela färgutrymmet även i de regioner i utrymmet där en betydande färgskillnad kan orsakas av små förändringar i enhetsvärdet.

I enheter med fler än fyra färgämnen är vissa underområden i hela enhetsutrymmet viktigare än andra. I CMYKOG-utrymme används till exempel cyan- och gröna tryckfärger sällan tillsammans eftersom deras nyanser till stor del överlappar varandra. På samma sätt överlappar gula och orangea bläck till stor del varandra. En enhetlig minskning av antalet steg kan ses som en övergripande kvalitetsförsämring i hela färgutrymmet, vilket är något du har råd med för de osannolika bläckkombinationerna, men inte för de troliga eller viktiga kombinationerna.

Även om en enhetligt samplad LUT är enkel och effektiv för interpolering, medför den enorma minneskrav när dimensionen ökar. En enhet kan ha sex eller åtta kanaler, men de används sällan samtidigt. I de flesta fall har indatafärgen till färgtransformeringen bara några "aktiva" färgämnen och finns därför i ett lägre dimensionellt färgutrymme. Det innebär också att interpolering kan göras mer effektivt i det lägre dimensionella utrymmet eftersom interpolationen är snabbare när dimensionen är lägre.

Metoden är därför att stratifiera hela enhetsutrymmet till underområden med olika dimensioner. Och eftersom lägre dimensioner (de som kombinerar tre eller fyra färgämnen) är viktigare, genom att stratifiera utrymmet, kan du också tillämpa olika samplingsfrekvenser; det vill: ett annat antal steg, till bitarna; öka samplingsfrekvensen för lägre dimensioner, vilket minskar dem för högre dimensioner.

För att åtgärda noteringar är n antalet kanaler i källfärgrymden för den färgtransformation som du vill prova. Du kan också referera till n som indatadimension och Visar n större än eller lika med 5. , om inget annat anges.

De grundläggande byggstenarna är LUT med olika indata dimensioner och storlekar, i stället för en enhetlig LUT med indatadimensionen n. För att vara mer exakt är enLUT- ett rektangulärt gitter som läggs på en enhetskub. alla enhetskoordinater normaliseras till intervallet [0, 1]). om är indatadimensionen för luten (observera att den inte behöver vara lika med n, även om Visar V mindre än eller lika med n. krävs), består den av ν endimensionella samplingsrutnät:

Samp i: Visar ett endimensionellt samplingsrutnät.

där alla xjs måste ligga i intervallet [0, 1], Visar ett upphöjd d(i). är antalet steg för i kanalsampling som måste vara minst 1 och Visar ett spuperscript av X (nedsänkt) d(i). måste vara 1. Å andra sidan visar ett upphöjd X (nedsänkt 1). måste inte vara 0.

Endast följande två särskilda fall av LUT definieras.

Stängd LUT-: Detta är en LUT med det ytterligare kravet att för varje Samp*i*, Visar ett upphöjd X (nedsänkt 1) är lika med 0. och Visar ett upphöjd d(i) större än eller lika med 2. . En enhetlig stängd LUT är en stängd LUT som har samma Visar en upphöjd d(i). för varje kanal och noderna är jämnt fördelade mellan 0 och 1.

Open LUT: Detta är en LUT med ytterligare krav som för varje Samp i, SHows a superscript X (subscript 1) större än 0. . Det är OK att ha Visar ett upphöjd d(i) lika med 1. .

Målet är att stratifiera enhetskuben [0, 1] n till en samling stängda LUT och öppna LUT, så att hela samlingen täcker enhetskuben. Det är konceptuellt enklare att organisera dessa "LUT strata" efter deras dimensioner, så att på den översta nivån:

Visar den översta nivån för att organisera L U T strata efter deras dimensioner.

where Shows sigma subscript k. is the "k -dimensional strata collection." Observera att strata-dimensionen börjar från 3 i stället för 0. det vill: punkter, eftersom interpolering av trefärgskombinationer kan hanteras utan för mycket minneskrav.

Beskrivning av LUT-skiktet

I den här implementeringen:

  1. Visar Sigma-nedsänkt 3. består av stängda LUT med tre indata, en från varje möjlig kombination av tre färgämnen som valts ut ur n färgämnen.

  2. Visar Sigma-nedsänkt 4. består av en stängd LUT för kombinationen CMYK (eller de första fyra färgämnena), tillsammans med Shows (n över 4) minus 1. öppna LUT för alla andra kombinationer med fyra färger. Genom att dela ut CMYK-kombinationen erkänner du att det är en viktig kombination.

  3. För Visar k lika med 5, ..., n. , Shows sigma subscript k. består av Shows (n över k). öppna LUTs, en för varje möjlig kombination av att välja k färgämnen från summan av n färgämnen.

Det återstår att ange storleken på LUT:erna. Den viktigaste skillnaden mellan öppna och stängda LUT är att öppna LUT inte överlappar varandra, och stängda LUT kan överlappa vid gränsytorna. Det faktum att den endimensionella samplingen i en öppen LUT inte innehåller 0 innebär i huvudsak att en öppen LUT saknar hälften av gränsyterna, därav namnet "öppen". Om två LUT inte överlappar varandra kan du använda ett annat antal steg eller nodplatser i varje kanal. Detsamma gäller inte om två LUT överlappar varandra. I så fall, om antalet steg eller nodplatserna skiljer sig åt, får en punkt som ligger i skärningspunkten mellan de två LUT:erna ett annat interpolationsvärde beroende på vilken LUT som används i interpolationen. En enkel lösning på det här problemet är att använda enhetlig sampling med samma antal steg när två LUT överlappar varandra. Med andra ord:

Alla stängda LUT:er (alla lut med tre färger och CMYK LUT i den här implementeringen) måste vara enhetliga och ha samma antal steg som anges d.

Följande två algoritmer kan användas för att fastställa antalet steg d för stängda LUT och antalet steg för öppna LUT.

Algoritm nr 1

Den här algoritmen kräver inte externa indata.

Alla stängda LUT:er är enhetliga med d antal steg.

Alla öppna LUT för dimensionen k har samma antal steg Visar d(k). i varje indatakanal och noderna är lika fördelade. det vill: för varje Visar jag lika med 1, 2, ..., k. .

Samp i: Visar samp i-algoritmen.

Ange slutligen d och d (k ) i följande tabell 1. De tre lägena, "proof", "normal" och "best" är kvalitetsinställningarna för ICM 2.0. I den här implementeringen har bevisläget det minsta minnesavtrycket och det bästa läget har det största minnesavtrycket.

Om du vill implementera den här algoritmen måste du anropa följande algoritm nr 2. Användare kan ange sina egna samplingsplatser med hjälp av tabellerna som en guide.

Algoritm nr 2

Den här algoritmen kräver externa indata i form av en lista över "viktiga" samplingsplatser, men den är mer anpassningsbar och kan spara minnesutrymme potentiellt.

De indata som krävs är en matris med enhetsvärden som tillhandahålls av användaren. Dessa enhetsvärden anger vilken region i enhetens färgutrymme som är viktigt. d.v.s. vilken region som ska samplas mer.

Alla stängda LUT:er är enhetliga med d antal steg enligt beskrivningen i algoritm nr 1. Värden för d anges i tabell 1.

(a) Enhetlig sluten LUT-

Korrekturläge Normalt läge Bästa läge
d 9 17 33

 

(b) Öppna LUT-

Indatadimension Korrekturläge Normalt läge Bästa läge
4 5 7 9
5 2 3 3
6 2 3 3
7 2 2 2
8 eller fler 2 2 2

 

Tabell 1: LUT-storlekar som används i algoritmen

Varje öppen LUT kan ha olika antal steg i varje indatakanal och samplingsplatserna behöver inte vara lika fördelade. För en viss öppen LUT-stratum finns det en associerad kombination av färgämnen, till exempel Visar C-nedsänkt 1, ..., C-nedsänkt k. , där Visar C-nedsänkt i. s är distinkta heltal mellan 1 och n. Det är kanalindexen som motsvarar de "aktiva" färgämnena i det här skiktet.

STEG 1: Filtrera bort den inmatade matrisen med enhetsvärden som inte finns i det här skiktet. Ett enhetsvärde Visar X subscript 1, X subscript 2, ..., X subscript n. finns i strata, om och endast om Visar en uppsättning värden för en kanal. och alla andra kanaler är 0. Om den filtrerade uppsättningen har N- poster låter du

Visar en ekvation som ska användas om den filtrerade uppsättningen har N-poster.

För varje Visar jag lika med 1, 2, ..., k. , iterera följande steg 2–5:

STEG 2: Om Visar d nedsänkt (k) som är lika med 1. har Samp i bara 1 poäng, vilket måste vara 1,0. Gå vidare till nästa jag. Annars fortsätter du till STEG 3.

STEG 3: Sortera de filtrerade exemplen i stigande ordning i Visar C-nedsänkt i. kanal.

STEG 4: Definiera det "preliminära" samplingsrutnätet med hjälp av noderna

Visar de noder som används för att definiera det

där Visar j lika med 1, 2, ..., d nedsänkt (k). .

STEG 5: Regularisera det preliminära rutnätet för att säkerställa att det överensstämmer med strikt monotoni och även att det slutar med 1.0. Eftersom matrisen redan är sorterad är noderna i det preliminära rutnätet redan monotona nondecreasing. Angränsande noder kan dock vara identiska. Du kan åtgärda detta genom att ta bort identiska noder om det behövs. Efter den här proceduren ersätter du slutligen slutpunkten med 1.0 om slutpunkten är mindre än 1.0.

Observera att STEG 5 är anledningen till att LUT-skiktet kan ha olika antal steg i varje kanal. Efter regulariseringen kan antalet steg i en kanal vara mindre än Visar d nedsänkt (k). .

Interpolation

Du kan konstruera stratifieringen av enhetskuben genom att öppna LUT strata och stängda LUT strata. Följ dessa steg för att utföra interpolering med hjälp av den här "glesa LUT-strukturen". Anta ett angivet enhetsvärde för indata Shows (X subscript 1, X subscript 2, ..., X subscript n). .

STEG 1: Fastställa antalet "aktiva" kanaler. Det här är antalet kanaler som inte är noll. Detta avgör strata-dimensionen k för att söka efter det innehållande stratumet. Mer exakt är strata-dimensionen 3 om antalet aktiva kanaler är Visar mindre än eller lika med 3. , annars är strata-dimensionen samma som antalet aktiva kanaler.

STEG 2: Inom Visar sigma nedsänkt k. , sök efter det innehållande stratumet. Ett enhetsvärde finns i ett öppet stratum om alla kanaler som motsvarar stratum har ett värde som inte är noll och alla andra kanaler är noll. Ett enhetsvärde finns i ett stängt stratum om varje kanal som inte representeras av stratum är noll. Om inget innehållande stratum hittas finns det ett feltillstånd. Avbryt och rapportera fel. Om ett innehållande stratum hittas går du vidare till nästa steg.

STEG 3: Om det innehållande stratumet stängs kan interpolering inom stratum utföras av alla kända interpolationsalgoritmer. I den här implementeringen är valet av algoritm tetrahedralinterpolation. Om det innehållande stratumet är öppet och enhetsvärdet ligger strikt inom stratumet, det vill

Visar X-nedsänkt i större än eller lika med... första noden i i kanal

där i är ett kanalindex för stratum fungerar standardinterpolationsalgoritmen, till exempel tetrahedralinterpolation.

Om Visar X-nedsänkt i mindre än... första noden i i kanal för vissa i, hamnar enhetsvärdet i "gapet" mellan stratum- och de lägre dimensionella underrymderna. Denna MOI handlar inte om en interpoleringsalgoritm i sig, så alla interpolationsalgoritmer kan användas för att interpolera inom detta "gap", även om den föredragna algoritmen är följande transfinitinterpolation.

Arkitekturen för interpoleringsmodulen illustreras i de två delarna av bild 1.

diagram som visar del ett av arkitekturen för interpoleringsmodulen.

diagram som visar del två av arkitekturen för interpoleringsmodulen.

Bild 1: Arkitektur för interpoleringsmodul

Som tidigare beskrivits kan den här algoritmen uppnå någorlunda tät sampling i regioner i enhetsutrymmet som innehåller en viktig kombination av färgämnen, samtidigt som den totala storleken på lut som behövs minimeras. I följande tabell visas en jämförelse av antalet noder som behövs för den glesa LUT-implementeringen (med algoritm nr 1 och normalt läge) och motsvarande enhetliga LUT-implementering.

Antal indatakanaler Gles LUT enhetlig LUT-
5 142498 1419857
6 217582 24137567
7 347444 410338673
8 559618 6975757441

 

Interpolering i en enhetskub

Ett grundläggande steg när det gäller rektangulärt rutnät är interpolering i en omslutande cell. För en indatapunkt kan du enkelt fastställa cellen som omsluter cellen. I ett rektangulärt rutnät anges utdatavärdet vid var och en av hörnen (hörnpunkterna) i den omslutande cellen. De är också de enda gränsvillkor (BC) som en interpolant måste uppfylla: Interpolanten måste passera genom alla dessa punkter. Observera att dessa gränsvillkor är på "diskreta" punkter, i det här fallet cellens 2n hörnpunkter, där n är dimensionen av färgområdet.

Det är användbart att formalisera begreppet gränsvillkor innan du går vidare. För alla delmängder S i gränsen för den omslutande cellen (enhetskuben i n dimensioner) är ett gränsvillkor på S en specifikation av en funktion BC: S → Rm, där m är utdatadimensionen. Med andra ord krävs en interpolant, som kan betecknas Interp: [0,1]n→ Rm, för att uppfylla: Interp(x) = BC(x) för alla x i S.

I standardscenariot för interpolering på enhetskuben är S den uppsättning diskreta punkter som är kubens 2n hörn.

Nu kan du generalisera gränsvillkoren för att lösa problemen som beskrevs tidigare och tillhandahålla en ny interpolationsalgoritm i enhetskuben. I stället för att endast tillåta diskreta gränspunkter kan gränsvillkor införas på en hel gränsyta för kuben. De exakta antagandena är följande:

(a) Punkten vn =(1,1,...,1) är speciell och endast ett diskret gränsvillkor tillåts. Med andra ord kan inga kontinuerliga gränsvillkor införas på n-gränsen ansikten xi = 1 (i = 1,...,n).

(b) För var och en av de återstående n gränserna ansikten xi = 0 (i = 1,...,n), kan gränsvillkor införas på hela ansiktet, med kompatibilitetsvillkoret att om två ansikten korsar varandra, bör gränsvillkoren på ansiktena komma överens om skärningspunkten.

c) Hörn som inte finns i ansikten med gränsvillkor kommer att ha ett individuellt (diskret) gränsvillkor.

Du kan referera till ett diskret gränsvillkor som ändliga data och ett kontinuerligt gränsvillkor som transfinitiska data när du diskuterar interpolering av ändliga och transfinitiska data.

Granska först standardinterpolationen av tetrahedral (t.ex. den som används i Sakamotos patent) som hjälper till att fastställa notationerna för denna specifika formulering av problemet. Det är känt att enhetskuben [0,1]n kan delas upp i n! tetrahedra, parametriserad av uppsättningen permutationer på n-symboler. Mer specifikt definieras varje sådan tetrahedron av olikheter

Visar formeln för olikheterna i tetraedronerna.

där σ:{1,2,..,n}→{1,2,...,n} är en permutation av "symboler" 1, 2, ..., n, dvs. det är en bijektivmappning av uppsättningen med n symboler. Om till exempel n = 3 och σ = (3, 2, 1), vilket betyder σ(1)=3, σ(2)=2, σ(3)=1, definieras motsvarande tetrahedron av z≥y≥x, där den gemensamma notationen x, y, z används för x1, x2, x3. Observera att dessa tetraedroner inte skiljer sig från varandra. För interpolering kommer punkter som ligger på ett gemensamt ansikte med två distinkta tetraedroner att ha samma interpolationsvärde oavsett vilket tetrahedron som används i interpolationen. Men i standardscenariot för interpolering på ändliga punkter, för en given indatapunkt (x1, ..., xn), bestäm först vilken tetrahedron den ligger i, eller motsvarande, motsvarande permutation σ, definieras tetrahedralinterpolanten som

Visar ekvationen som definierar interpolanten tetrahedral.

där Visar ekvationen för standardbasvektorerna. för i=1, ..., n och e1, ..., en är standardbasvektorerna. Innan du går vidare till generaliseringen bör du tänka på att v0, v1, ..., vn är hörnen i tetrahedron och Visar de barycentriska koordinaterna. är "barycentriska koordinater".

För det allmänna fallet med BC:er på gränsytor kan du använda begreppet barycentrisk projektion. Som tidigare, för en given indatapunkt (x1, ..., xn), bestäm först i vilken tetrahedron den ligger, eller motsvarande, motsvarande permutation σ. Utför sedan en serie barycentriska projektioner enligt följande. Den första projektionen Visar BProj-nedsänkt 1 (x). skickar punkten till planet Visar X-nedsänkt delta (1) lika med 0. om inte Visar X lika med V-nedsänkt n. i vilket fall det inte ändras. Den exakta definitionen av kartan BProj definieras på följande sätt:

Visar ekvationen för den exakta definitionen av kartan BProj.

med Visar ekvationen för P-nedsänkt k. och k = 1, 2, ..., n.

Om Visar X är lika med V-nedsänkt n. kan du stoppa, eftersom BC definieras på vn av Assumption (a). Om Visar X inte är lika med V-nedsänkt n. är det tydligt att Visar BProj-nedsänkt 1 (X). har den σ(1)e komponenten förintad. Med andra ord är den på en av gränsyterna. Antingen är det på ett ansikte där BC definieras, i vilket fall du kan stoppa, eller så utför du en annan barycentrisk projektion Visar BProj-nedsänkt 2 (X). där Visar X lika med BProj-nedsänkt 1 (X). . Och om visar X''= Bproj subscript 1 (X). är på ett ansikte där BC definieras kan du stoppa. annars utför du ännu en projektion Visar BProj-nedsänkt 3 (X). . Eftersom varje projektion förintar en komponent minskar den effektiva dimensionen, så du vet att processen så småningom måste stoppas. I värsta fall utför du n-projektioner ned till dimension 0, dvs hörn på kuben, som enligt antagandet (c) du vet att BC kommer att definieras på.

Förutsatt att K-prognoser har utförts, med

Visar en ekvation som ska användas förutsatt att K-projektionen har utförts.

x(0)= x, indatapunkten och BC definieras vid x(k). Var sedan tillbaka med projektionerna genom att definiera en serie utdatavektorer:

Visar ekvationer för en serie utdatavektorer.

där Visar ekvationen för Y-upphöjd (K). och du får äntligen svaret

Visar Interp(x) lika med y superscript (0).

Exempel på jobb

diagram som visar ett fungerat exempel på interpolering med en enhetskub.

bild 2: Arbetsexempel

Tänk på situationen som visas i bild 2, där n = 3, m = 1 och du har följande BCs:

a) Fyra diskreta BC:er på hörnen

(0, 0, 1): β001

(0, 1, 1): β011

(1, 0, 1): β101

(1, 1, 1): β111

b) Ett kontinuerligt BC i ansiktet x3=0: F(x1, x2)

Beräkning nr 1: Indatapunkt x = (0,8, 0,5, 0,2). Omslutande tetrahedron är associerad med permutationen <1, 2, 3>.

Första projektionen: Visar ekvationen för den första projektionen.

Detta är redan på ansiktet x3 = 0, så du kan stoppa. Bakåtersättning ger sedan

Visar svaret för den första projektionen. som är svaret.

Beräkning nr 2: Indatapunkt x = (0.2, 0.5, 0.8). Omslutande tetrahedron är associerad med permutationen <3, 2, 1>.

Första projektionen: Visar ekvationen för den första beräkningsprognosen 2.

Andra projektionen: Visar ekvationen för den andra beräkningsprognosen 2.

Tredje projektionen: Visar ekvationen för den tredje beräkningsprognosen 2. , som finns i ansiktet x3=0. Bakåtersättning ger sedan

Visar de två första ekvationerna för bakåtersättning.

Visar den tredje ekvationen för bakåtersättning. , som är det slutliga svaret.

Program

a) Sekventiell tetrahedralinterpolation

diagram som visar sekventiell tetrahedralinterpolation.

bild 3: sekventiell tetrahedralinterpolation

Se bild 3. För att interpolera mellan två plan där inkompatibla rutnät har införts bör du överväga en cell som omsluter en viss punkt P som visas i bilden. Cellens "övre" hörn kommer direkt från rutnätet i det översta planet. Hörnen i det nedre ansiktet är inte kompatibla med rutnätet i det nedre planet, så hela ansiktet behandlas som att ha ett BC med värden som erhålls genom interpolation på rutnätet i det nedre planet. Det är sedan tydligt att den här konfigurationen uppfyller antagandena (a), (b) och (c) ovan, och du kan använda interpoleringsalgoritmen.

Det är också tydligt att algoritmen har minskat interpolationsproblemets dimension med 1, eftersom resultatet är en linjär kombination av värden vid hörnen i det övre rutnätet och interpolation i det nedre planet, som har dimensionen mindre 1. Om det finns en liknande konfiguration av inklämningsplanet i det nedre planet kan du använda proceduren i det planet, vilket ytterligare minskar dimensionen med 1. Den här proceduren kan fortsätta tills du når dimension 0. Denna kaskad av projektioner och interpolationer kan kallas "Sekventiell Tetrahedral Interpolation".

b) Gap Interpolation

diagram som visar mellanrumsinterpolation.

bild 4: Gap interpolation

Detta är ett rutnät som läggs på en kub som sitter strikt inuti den positiva kvadranten. Själva kuben har ett rutnät på sig, och varje koordinatplan har rutnät som inte nödvändigtvis är kompatibla. "Klyftan" mellan kuben och koordinatplanen har ett tvärsnitt som är "L-format" och som inte kan användas med standardtekniker. Men med tekniken som introduceras här kan du enkelt introducera celler som täcker detta gap. Bild 4 visar en av dessa. Rutnäten på koordinatplanen stöder interpolering som tillhandahåller nödvändiga BC:er för alla nedre ansikten i cellen, med ett återstående hörn vars BC tillhandahålls av kubens nedre hörn.

Slutkommentar om implementering

I det faktiska programmet extraheras "enhetskuben" som är den grundläggande inställningen för algoritmen från större gitter, och värdena vid hörnen kan kräva dyr beräkning. Å andra sidan är det också uppenbart att tetrahedralinterpolation endast kräver värdena vid hörnen i tetraedronen, som är en delmängd av alla hörn i enhetskuben. Därför är det mer effektivt att implementera vad som kan kallas "uppskjuten utvärdering". I en programvaruimplementering av föregående algoritm är det typiskt att ha en underrutin som tar enhetskuben och värdena vid dess hörn som indata. Uppskjuten utvärdering innebär att i stället för att skicka värdena vid hörnen skickas nödvändig information för att utvärdera hörnens värden, utan att faktiskt utföra utvärderingen. Inuti subrutinen kommer den faktiska utvärderingen av dessa värden endast att utföras för de hörn som tillhör den omslutande tetrahedronen, efter det att den omslutande tetrahedronen har fastställts.

Uppslagstabell för användning med virtuella RGB-källenheter med högt dynamiskt intervall

Om en transformering konstrueras med en källenhet som modelleras som en virtuell RGB-enhet är det möjligt att källfärgvärdena kan vara negativa eller större än unity (1.0). När detta inträffar kallas källenheten för att ha ett högt dynamiskt intervall (HDR). Särskild hänsyn tas till det här fallet.

När det gäller HDR-transformeringar kan lägsta och högsta värden för varje färgkanal bestämmas från enhetens omfångsgräns. Med hjälp av dessa värden tillämpas en enkel skalning för varje färgkanal så att färgvärden som är lika med minsta färgämnen konverteras till 0,0, och färgvärden som är lika med den maximala färgämnena konverteras till 1,0, med en linjär skalning av värden mellan för att mappa linjärt mellan 0,0 och 1,0.

ICCProfileFromWCSProfile

Eftersom huvudsyftet med den här funktionen är att stödja förhandsversioner av Windows måste du generera ICC-profiler av version 2.2 enligt definitionen i ICC Specification ICC.1:1998-09. I vissa fall (se följande tabell "Mappning av baslinjeenhet till ICC-profilklass" kan du skapa en matris eller en TRC-baserad ICC-profil från en WCS-profil. I andra fall består ICC-profilen av LUTs. I följande process beskrivs hur du skapar AToB- och BToA-LUT:erna. Naturligtvis har ICC-profiler även andra fält. Vissa data kan härledas från WCS-profilen. För andra data måste du utveckla intelligenta standardvärden. Upphovsrätten kommer att tilldelas Microsoft; eftersom det är Microsoft-teknik som används för att skapa LUTs.

Den här designen bör fungera för alla typer av enhetsmodeller, inklusive plugin-program. Så länge plugin-programmet har en associerad baslinjeenhetsmodell kan den underliggande enhetstypen fastställas.

Den svåra delen av att skapa en ICC-profil är att skapa uppslagstabellerna AToB och BToA. Tabellerna mappas mellan enhetsutrymmet, till exempel RGB eller CMYK, och profilanslutningsutrymmet (PCS), som är en variant av CIELAB. Detta är i grunden detsamma som den färghanteringsprocess som används i CITE-transformeringen för att mappa från enhetsutrymme till enhetsutrymme. Du måste dock ha följande information för att göra omvandlingen.

  1. Referensvisningsvillkor för PCS.

  2. Referens-PCS-spelut.

  3. Enhetsmodell som konverterar mellan PCS-värden och colorimetry.

WCS-profilen och dess associerade CAM tillhandahålls som parametrar. Det finns två baslinjeenhetsmodeller som konverterar mellan colorimetry och PCS-kodningen. Anledningen till att du behöver två förklaras nedan.

  1. Du kan hämta referensvisningsvillkoren för PCS från ICC-profilformatspecifikationen. Informationen i ICC-profilformatspecifikationen räcker för att beräkna alla data som krävs för att initiera DEN CAM som används av CMS. För konsekvens och flexibilitet lagras den här informationen i en WCS-färgprofil.

  2. Du kan också använda en WCS-profil för att lagra exempel som definierar datorernas referensomfång. CITE-färghanteringssystemet (CMS) har två sätt att skapa omfångsgränser. Det ena är att prova hela enhetsutrymmet och använda enhetsmodellen för att skapa måttvärden. Den andra metoden är att använda uppmätta exempel från profilen för att skapa en referensomfångsgräns. Eftersom ICC PCS-omfånget är för stort för att göra ett användbart referensomfång är den första metoden olämplig. Men den andra metoden är en flexibel, profilbaserad metod. Om du vill omdefiniera referens-PCS-omfånget kan du ändra måttdata i PCS-enhetsprofilen.

  3. ICC PCS är en modellering av en idealisk enhet. Genom att skapa en modell av PCS som en riktig enhet kan du dra nytta av den färghanteringsprocess som används i Smart CMM. Det är enkelt att skapa en enhetsmodell från colorimetry till PCS-kodningen. Du mappar helt enkelt mellan de sanna colorimetric-värdena och PCS-kodade värden. Eftersom CMS-gränssnittet för enhetsmodeller endast stöder XYZ-värden kan du också behöva mappa mellan XYZ och LAB. Det här är en välkänd transformering. Den här modellen beskrivs i dokumentet 2.2.02 "Originalplansenhetsmodeller" i avsnitten 7.9 och 7.10.

Du kan behöva utföra viss omfångsmappning om enhetens omfång är större än pcS-omfånget. Baslinje-GMM:erna kan användas för detta ändamål. Observera att en korrekt skapad ICC-profil har uppslagstabeller för avsikterna Relative Colorimetric, Perceptual och Saturation, även om alla dessa kan peka på samma LUT internt.

diagram som visar skapandet av en A T o B L U T.

bild 5: Skapa en AToB LUT

Den här processen illustreras i bild 5. Först initieras enhetsmodellen från data i DM-profilen. Skapa sedan en enhetsomfångsgräns enligt följande. Ett urval av data från enhetsmodellen körs via enhetsmodellen för att hämta färgmetriska data. Colorimetric-data körs via CAM för att skapa utseendedata. Utseendedata används för att skapa enhetens omfångsgräns.

Använd sedan data från referensprofilen för PCS-mått för att skapa en omfångsgräns för PCS.

Använd de två omfångsgränser som just skapats för att initiera en GMM. Använd sedan enhetsmodellen, GMM och PCS-enhetsmodellen för att skapa en transformering. Kör en sampling av enhetsutrymmet genom transformeringen för att skapa en AToB LUT.

diagram som visar skapandet av ett A T o B L U T med hjälp av ett urval av P C S-blanksteg.

bild 6: skapa en BToA LUT

Bild 6 illustrerar skapandet av BToA LUT. Detta är nästan identiskt med att skapa en AToB LUT, där rollerna för källa och mål utbyts. Du måste också prova hela PCS-omfånget för att skapa LUT.

Observera att eftersom CAM (CIECAM02 i WCS) är involverad i processen, sker kromatisk anpassning mellan medievitpunkten och PCS vit punkt (som ICC har mandat att vara D50) transparent av CAM.

Virtuella HDR RGB-enheter

Särskild hänsyn måste tas till vid generering av profiler för virtuella HDR RGB-enheter. dvs enheter för vilka färgvärdena kan vara mindre än 0,0 eller större än 1,0. I genereringen av ATOB LUT skapas en större uppsättning 1D-indata-LUT. Färgvärden skalas och förskjuts till intervallet 0 .. 1 med hjälp av lägsta och högsta färgvärden i WCS-profilen.

Eftersom färgutrymmet för HDR-enheter sannolikt inte är helt fyllt, ges särskilt stöd i 3D-LUT för taggen också. För att kunna hantera färger i den glest befolkade regionen kodas färgämnena om så att extrapolering utöver 0.0 och 1.0 kan uppnås. Intervallet som används är -1 .. +4.

På grund av den omskalning som tillämpas för 3D LUT skapas en uppsättning 1D-utdata-LUT för att mappa resultatet tillbaka till intervallet 0 .. 1.

Fler än en dator

ICC fann att en PCS inte var tillräckligt flexibel för att uppfylla alla avsedda användningsområden för en CMS. I version 4 av profilspecifikationen klargjorde ICC att det faktiskt finns två PCS-kodningar. En används för de colorimetric avsikterna; en annan används för den perceptuella avsikten. (Ingen PCS har angetts för avsikten Mättnad. ICC har lämnat denna del tvetydig.) Colorimetric PCS har en minsta och högsta ljushet angiven, men värdena för kroma och nyans varierar till ungefär ± 127. Denna PCS ser ut som en rektangulär prisma. Som tidigare nämnts liknar den perceptuella PCS-volymen omfånget för en bläckstråleskrivare.

De två ICC PCS har också två olika digitala kodningar. I perceptuella PCS representerar värdet noll en ljushet på noll. I colorimetric PCS representerar ett värde på noll den minsta ljusheten hos PCS, som är större än noll. Du kan lösa det här problemet genom att ha en annan enhetsmodell för var och en av PCS-kodningarna.

Gamut-mappning

Om du vill skapa AToB LUT i en ICC-profil mappar du från enhetens omfång till lämpligt PCS-utrymme. Om du vill skapa BToA-LUT:erna mappar du från PCS-utrymmet till enhetens omfång. Mappningen för AToB LUTs liknar den som används i en måttbaserad CMS. För perceptuella datorer mappar du enhetens rimliga omfång till perceptuell PCS-omfångsgräns, med antingen urklipp eller komprimering för alla out-of-gamut färger. För de colorimetric avsikterna kan du behöva klippa ljushet, men chroma- och hue-värdena kommer alla att få plats i färgomfånget PCS.

Mappningen för BToA LUTs är lite annorlunda. De colorimetric avsikterna är fortfarande enkla; du klipper bara PCS-värden till enhetens omfång. Men ICC kräver att alla möjliga PCS-värden mappas till något enhetsvärde, inte bara de inom referensomfånget för perceptuella PCS. Därför måste du se till att de genetiskt modifierade datorerna kan hantera källfärger som ligger utanför referensomfånget. Detta kan hanteras genom att urklipp dessa färger till enhetens omfångsgräns.

Baslinjeenhet till ICC-profilklassmappning

Enhetstyp för baslinje ICC-profilklass Anmärkning
RGB-avbildningsenhet Indataenhet ("scnr") PCS är CIELAB. AToB0Tag är Enhet till PCS med relativ colorimetric-avsikt.
CRT, LCD-skärm Visa enhet ("mntr") PCS är CIEXYZ. Se följande för modellkonvertering.
RGB-projektor Färgrymd ("spac") PCS är CIELAB.
RGB- och CMYK-skrivare Utdataenhet ("prtr") PCS är CIELAB.
Virtuell RGB-enhet (icke-HDR-ärende) Visa enhet ("mntr") PCS är CIEXYZ.
Virtuell RGB-enhet (HDR-ärende) Färgrymd ("spac") PCS är CIELAB.

 

Konverteringen av övervakningsprofiler omfattar inte att skapa LUT utan består i stället av att skapa en matris eller TRC-modell. Modellen som används i ICC skiljer sig något från den som används i WCS CRT- eller LCD-modellering eftersom termen "svart korrigering" saknas. Specifikt

WCS-modell: Visar en W C S-modell.

ICC-modell: Visar en I C C-modell.

Konverteringen från WCS-modell till ICC-modell görs på följande sätt.

Definiera nya kurvor:

Visar en matris för att definiera nya kurvor.

Dessa är inte tonen reproduktion kurvor eftersom de inte karta 1 till 1. En normalisering kommer att uppnå det. De sista definitionerna av ICC-modellen är:

Visar de slutliga definitionerna av I C C-modellen.

Visar slutmatrisen för I C C-modellen.

För virtuella RGB-enheter som inte är HDR genererar du även en visnings-ICC-profil för utrymmeseffektivitet. I så fall kan tristimulus-matrisen M ICC- hämtas direkt från primärvalen för WCS-profilen utan ovanstående modellkonvertering. En sista, men viktigt, observera är att denna tristimulus matris måste vara kromatiskt anpassad till D50 för att överensstämma med ICC-specifikationen för PCS. Med andra ord måste posterna på varje rad i matrisen som ska kodas i ICC-profilen summeras till 96,42, 100 och 82,49. I den nuvarande implementeringen görs den kromatiska anpassningen av CAT02, som också är den kromatiska anpassningstransformering som används i CAM02.

Svart konservering och svart generation

Implementeringen av svart konservering är kopplad till genereringen av den svarta kanalen i enheter som stöder en svart kanal. För att åstadkomma detta samlas information om varje källfärg in för att tillåta enhetsmodeller som stöder en svart kanal för att avgöra hur den svarta kanalen ska ställas in på utdata på bästa sätt. Även om svart konservering är relevant för färgtransformeringar som konverterar mellan en svart kanalenhet till en annan, implementeras den svarta generationen för alla transformeringar som involverar en målenhet med svarta kanaler.

Svart kanalinformation registreras i en datastruktur som kallas BlackInformation. Strukturen BlackInformation innehåller ett booleskt värde som anger om färgen endast innehåller svart färg och ett numeriskt värde som anger graden av "svarthet" som kallas svart vikt. För källenheter som stöder en svart kanal är den svarta vikten procentandelen svart färg i källfärgen. För källenheter som inte innehåller en svart kanal beräknas den svarta vikten med hjälp av de andra färgämnena och utseendevärdet. Ett värde som kallas "färgrenhet" beräknas genom att skillnaden mellan det maximala färgvärdet och det lägsta värdet för färgämnen divideras med det maximala färgvärdet. Ett värde som kallas "relativ ljushet" beräknas genom att skillnaden mellan färgens lätthet och den minsta ljusheten för målenheten divideras med skillnaden mellan den minsta och högsta ljusheten för målenheten. Om källenheten är en additiv enhet (övervakare eller projektor) bestäms den svarta vikten vara 1,0 minus färgrenhet multiplicerat med den relativa lättheten. Om källenheten till exempel är en RGB-övervakare beräknas det maximala värdet och minimivärdet R, G och B för varje färg och den svarta vikten bestäms av formeln:

BW = (1,0 – (max(R,G,B) – min(R,G,B)) / max(R, G, B)) * relativ ljushet

Om källenheten stöder subtraktiv färgsättning, till exempel en CMY-skrivare, måste de enskilda färgämnena vara "kompletterade" (subtraherade från 1.0) innan de används i föregående formel. Därför, för en CMY-skrivare, R = 1,0 – C, G = 1,0 – M och B = 1,0 – Y.

Den svarta informationen för varje färg som bearbetas av färgtransformeringen bestäms under färgöversättningsprocessen. Informationen om endast svart bestäms endast om svart konservering har angetts. Svart vikt bestäms alltid om målenhetsmodellen stöder en svart färg. Den svarta informationen skickas till målenhetsmodellen via metoden ColorimetricToDeviceColorsWithBlack, som använder den resulterande LUT-metoden.

Observera att på grund av optimering av färgtransformering sker ovanstående process endast när den optimerade transformerings-LUT skapas, inte under körningen av metoden TranslateColors.

Optimering för transformeringar med fler än tre källkanaler

Storleken på den optimerade transformeringen bestäms av flera faktorer: antalet färgkanaler i källenheten, antalet steg i tabellen för varje källfärgkanal och antalet färgkanaler i utdataenheten. Formeln för att fastställa transformeringstabellens storlek är:

Storlek = Antal steg per kanal source\ device(Number\ of\ channels\ in\ source\ device) x antal kanaler i utdataenheten

Som du ser växer tabellens storlek exponentiellt beroende på antalet kanaler i källenheten. Många källenheter stöder tre färgkanaler, till exempel Röd, Grön och Blå. Men om en källenhet stöder fyra kanaler, till exempel CMYK, ökar tabellens storlek och den tid som krävs för att konstruera tabellen med en faktor av antalet steg. I en måttbaserad CMS där transformeringar konstrueras "i farten" kan den här gången mycket väl vara oacceptabel.

För att minska den tid som krävs för att konstruera färgkonverteringstabellen är det möjligt att dra nytta av två fakta. För det första har källenheten stöd för mer än tre färgkanaler, men det mellanliggande enhetsoberoende färgområdet (CIECAM02 Ja C b C ) har bara tre färgkanaler. För det andra är den mest tidskrävande delen av bearbetningen inte enhetsmodellering (konvertering från enhetsfärgkoordinater till tristimulus-värden), utan omfångsmappning. Med hjälp av dessa fakta kan du skapa en preliminär färgkonverteringstabell som konverterar färger i det enhetsoberoende färgutrymmet genom stegen för omfångsmappning och slutligen genom utdataenhetens färgmodell. Konstruktionen av den här tabellen är av dimension tre. Sedan skapar vi den sista färgkonverteringstabellen för dimension fyra genom att konvertera kombinationerna av källfärg till mellanliggande enhetsoberoende utrymme och sedan, med hjälp av den preliminära färgkonverteringstabellen, slutföra konverteringen till enhetens utdatafärgutrymme. Så du minskar från databehandling (antal steg i uppslagstabellen) antal\ av\ kanaler beräkning av omfångsmappning till antalet steg i mellanliggande tabell ₃ beräkning av omfångsmappning. Även om du måste utföra antalet steg i (uppslagstabellen) antal\ av\ kanaler beräkningar av enhetsmodellering och tredimensionella tabellsökningar, är detta fortfarande mycket snabbare än den ursprungliga beräkningen.

Föregående process fungerar bra förutsatt att det inte finns något behov av information för att skicka mellan källenhetsmodellen och någon annan komponent i färgtransformeringen. Men om både utdataenheten och källenheten stöder en svart färg och den svarta källfärgen används för att fastställa den svarta färgen för utdata, kommer processen inte att kunna kommunicera den svarta källinformationen korrekt. En alternativ process är att konstruera en preliminär färgkonverteringstabell som konverterar färger i det enhetsoberoende färgutrymmet endast genom stegen för omfångsmappning. Skapa sedan den slutliga färgkonverteringstabellen för dimension fyra med hjälp av följande steg: a) konvertera kombinationerna av källfärg till mellanliggande enhetsoberoende utrymme, b) utföra stegen för omfångsmappning genom att interpolera i den preliminära färgtabellen i stället för att tillämpa de faktiska omfångsmappningsprocesserna, och c) använda de resulterande värdena från stegen för omfångsmappning och all källinformation om svarta kanaler för att beräkna utdataenhetens färgämnen med hjälp av utdataenhetsmodellen. Den här processen kan också användas när det finns information som överförs mellan käll- och utdataenhetsmodellerna även om det inte finns någon svart kanal. Om de två modulerna till exempel implementeras med en plugin-arkitektur som möjliggör datautbyte mellan moduler.

De två föregående processerna kan användas för att effektivt förbättra den tid som krävs för att konstruera den fyrdimensionella färgtransformeringstabellen.

CheckGamut

ICM anropar CreateTransform och CreateMultiProfileTransform ta ett ord med flaggvärden, varav ett är ENABLE_GAMUT_CHECKING. När den här flaggan har angetts måste CITE skapa transformeringen på ett annat sätt. De första stegen är desamma: käll- och mål-CAM:erna måste initieras. Sedan måste deskriptorerna för käll- och målomfångsgräns initieras. Oavsett den angivna avsikten måste CheckGamut GMM användas. CheckGamut GMM bör initieras med hjälp av käll- och målenhetsmodellerna och deskriptorerna för omfångsgränser. Transformeringen bör dock sedan skapa en trunkerad transformering som består av källenhetsmodellen, käll-CAM, eventuella mellanliggande GMM:er och CheckGamut GMM. Detta säkerställer att värdena delta J, delta C och delta h utdata från CheckGamut CMM blir de slutliga resulterande värdena.

Innebörden av CheckGamut är tydlig när det bara finns två enhetsprofiler i transformeringen. När det finns fler än två enhetsprofiler och fler än två GMM:er rapporterar CheckGamut om färgerna som har transformerats via den första enhetsmodellen och alla utom den sista GMM:n ligger inom målenhetens omfång.

Grundläggande begrepp för färghantering

Scheman och algoritmer för Windows-färgsystem