Algoritmo e esquema do perfil do modelo de mapa de gamut do WCS
- Visão geral
- Arquitetura de perfil de modelo de mapa gama
- Geração do limite de gama
- O esquema GMMP
- Os elementos de esquema GMMP
- GamutMapModel
- Os algoritmos de linha de base GMMP
- Alinhando os eixos neutros
-
Descrição de limite de gama e algoritmos de shell de gama
- Triangulação do limite gama
- Elementos de linha de limite
- Operação gamut: CheckGamut
- Plano matiz completo: Intersect
- Operação gamut: CheckGamut (continuação)
- Mapeamento mínimo de diferença de cores
- Suavização de matiz
- Definindo primárias e secundárias na descrição do limite de gama
- Definindo o eixo neutro na descrição do limite de gama
- Tópicos relacionados
Visão geral
Esse esquema é usado para especificar o conteúdo de um GMMP (perfil de modelo de mapa gama). Os algoritmos de linha de base associados são descritos no tópico a seguir.
O esquema GMMP básico consiste em informações de cabeçalho comuns, uma referência opcional a um plug-in de Modelo de Mapa de Gama preferencial e marcas de extensão.
Além disso, o GMMP fornece informações explícitas sobre o Modelo de Mapa de Gama de destino e fornece uma política sobre o modelo de mapa gama de fallback de linha de base a ser usado se o modelo de destino não estiver disponível. O esquema pode incluir informações de extensão privadas, mas não incluirá outras informações desnecessárias.
Arquitetura de perfil de modelo de mapa gama
A amostragem do espaço colorante do dispositivo de saída é feita iterando pelos colorantes de 0,0 a 1,0 com uma etapa fracionária, acumulando todas as combinações de cada colorante em cada etapa e convertendo-as do espaço colorante do dispositivo para o espaço de aparência de cores usando o método DM::D eviceToColorimetricColors seguido pelo método CAM::ColorimetricToAppearanceColors. Veja a seguir um exemplo de como isso é feito para RGB.
For (red= 0.0; red <= 1.0; red += redStep) {
For (green = 0.0; green <= 1.0; green += greenStep) {
For (blue = 0.0; blue <= 1.0; blue += blueStep) {
Colorants[0] = red; colorants[1] = green; colorants[2] = blue;
pRGBDM->DeviceToColorimetricColors(1, colorants, &XYZ);
pCAM->ColorimetricToAppearanceColors(1, &XYZ, &JCh);
}
}
}
Geração do limite de gama
Há três componentes para o limite de gama: as primárias, as amostras neutras e os shells. As primárias são geradas usando as primárias do dispositivo e aplicando a transformação DeviceToColorimetric/ColorimetricToAppearance. Os exemplos neutros são gerados pela amostragem do espaço colorante do dispositivo na área neutra e pela aplicação da mesma transformação. Para três dispositivos colorantes (RGB ou CMY), as amostras neutras são definidas como tendo todos os colorantes iguais, por exemplo, R == G == B. Para CMYK, as amostras neutras são definidas como tendo C == M == Y == 0.
Os fatores que influenciam os dados usados para criar o limite de gama são os exemplos de dados (somente dispositivos de linha de base) e as condições de exibição. O tamanho da etapa usado para fazer a amostragem completa do espaço colorante (para monitores e para shell plausível) é uma constante interna e não está disponível para manipulação externa. Alterar as condições de exibição altera o comportamento do CAM (modelo de aparência de cor) e altera a forma do limite de gama, portanto, você deve gerar um limite de gama vinculado ao perfil de condições de exibição. Se dados de exemplo forem usados, como no caso de impressoras de linha de base e dispositivos de captura, os exemplos terão muito impacto sobre a forma da gama de referência e afetarão o comportamento do próprio modelo.
Para dispositivos de entrada, como câmeras e scanners, diferentes amostras são usadas para gerar o shell de referência e o shell plausível. O shell de referência é gerado a partir das medidas usadas para inicializar o modelo de dispositivo. O shell plausível é gerado de forma semelhante à ilustração anterior para dispositivos de saída. A diferença é que, ao inserir um destino típico, você não obtém valores totalmente saturados (em que R, G ou B = 255). Você deve extrapolar usando o modelo de dispositivo para estimar esses valores.
O esquema GMMP
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:gmm="http://schemas.microsoft.com/windows/2005/02/color/GamutMapModel"
xmlns:wcs="http://schemas.microsoft.com/windows/2005/02/color/WcsCommonProfileTypes"
targetNamespace="http://schemas.microsoft.com/windows/2005/02/color/GamutMapModel"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
blockDefault="#all"
version="1.0">
<xs:annotation>
<xs:documentation>
Gamut Map Model profile schema.
Copyright (C) Microsoft. All rights reserved.
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://schemas.microsoft.com/windows/2005/02/color/WcsCommonProfileTypes" />
<xs:element name="GamutMapModel">
<xs:complexType>
<xs:sequence>
<xs:element name="ProfileName" type="wcs:MultiLocalizedTextType"/>
<xs:element name="Description" type="wcs:MultiLocalizedTextType" minOccurs="0"/>
<xs:element name="Author" type="wcs:MultiLocalizedTextType" minOccurs="0"/>
<xs:element name="DefaultBaselineGamutMapModel">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="HPMinCD_Absolute"/>
<xs:enumeration value="HPMinCD_Relative"/>
<xs:enumeration value="SGCK"/>
<xs:enumeration value="HueMap"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="PlugInGamutMapModel" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:any namespace="##other" processContents="skip"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="GUID" type="wcs:GUIDType" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="ID" type="xs:string" use="optional" />
</xs:complexType>
</xs:element>
</xs:schema>
Os elementos de esquema GMMP
GamutMapModel
Esse elemento é uma sequência dos seguintes subelementos:
- Cadeia de caracteres ProfileName,
- DefaultBaselineGamutMapModel,
- Cadeia de caracteres de descrição opcional,
- Cadeia de caracteres de autor opcional,
- PlugInGamutMap opcional e
- ExtensionType opcional.
Condições de validação : cada subelemento é validado por seu próprio tipo.
Namespace
xmlns:gmm="http://schemas.microsoft.com/windows/2005/02/color/GamutMapModel"
targetNamespace="http://schemas.microsoft.com/windows/2005/02/color/GamutMapModel"
Versão
Versão "1.0" com a primeira versão do Windows Vista.
Condições de validação : 1.0 no Windows Vista. As versões <2.0 também são válidas para dar suporte a alterações não interruptivas no formato.
Documentação
Esquema de perfil de modelo de mapa gama.
Direitos autorais (C) Microsoft. Todos os direitos reservados.
Condições de validação : cada subelemento é validado por seu próprio tipo.
Tipo DefaultBaselineGamutMapModel
Tipo UINT
Valores de enumeração:
- "MinCD\_Absolute" "MinCD\_Relative" "SIG\_KNEE" "HueMap"
Condições de validação : os valores devem corresponder a uma das enumerações acima.
PlugInGamutMapType
Esse elemento é uma sequência de UM GUIDType e quaisquer subconjuntos.
Condições de validação : o GUID é usado para corresponder ao GUID de DLL do Plug-In gmm. Há no máximo 100.000 subconjuntos personalizados.
Extensiontype
Esse elemento é uma sequência opcional de qualquer subconjunto.
Condições de validação : pode haver no máximo 100.000 subconjuntos.
Os algoritmos de linha de base GMMP
Alinhando os eixos neutros
A maioria dos algoritmos de mapeamento de gama tem a meta de mapear o eixo neutro do dispositivo de origem para o eixo neutro do dispositivo de destino: ou seja, o branco vai para branco, preto para preto e cinza para cinza. Isso é abordado, em parte, dimensionando a leveza das cores de origem para corresponder ao intervalo de leveza do dispositivo de destino. Mas isso não resolve completamente o problema.
É uma propriedade física da maioria dos dispositivos de geração de imagens que a cromática do dispositivo branco não corresponde exatamente à cromática do dispositivo preto. Por exemplo, o monitor branco depende da soma das cromáticas e luminâncias relativas das três primárias, enquanto o monitor preto depende da reflexão da superfície de exibição. O branco da impressora depende da cromática do papel, enquanto a impressora preta depende da tinta ou do toner usado. Um modelo de aparência que mapeia o dispositivo em branco exatamente para o eixo neutro do espaço de aparência (chroma exatamente igual a zero) não mapeará o dispositivo preto para o eixo neutro. Como o olho é mais sensível às diferenças de croma à medida que a leveza aumenta, os cinzas médios serão representados como ainda mais cromáticos do que o dispositivo preto. (A Figura 1 ilustra a curvatura dos eixos neutros em duas dimensões. Na verdade, os eixos neutros formam uma curva mais complexa em três dimensões.)
Embora o CAM preveja que essas cores neutras do dispositivo parecerão cromáticas, os observadores reais parecem compensar isso. A maioria das pessoas não considera esses valores neutros do dispositivo como cromáticos. Para a maioria dos modelos de mapeamento de gama, portanto, você deve continuar a mapear os neutros de origem para os neutros do dispositivo.
Para mapear os neutros de origem para os neutros do dispositivo, ajuste os limites de gama de origem e destino e cada pixel ao aplicar o algoritmo de mapeamento de gama. Primeiro ajuste cada valor na cor de origem para que o eixo neutro do dispositivo de origem na leveza da cor de origem caia diretamente no eixo neutro do espaço de aparência. (Veja o lado esquerdo da Figura 1.) Em seguida, ajuste a descrição do limite de gama do dispositivo de destino para que cada cor no eixo neutro do dispositivo de destino na leveza da cor de limite de gama do dispositivo de destino caia diretamente no eixo neutro do espaço de aparência. (Veja o lado direito da Figura 1.)
Figura 1 : alinhamento dos eixos neutros ilustrados. Esquerda: ajustando pontos de origem em relação ao eixo neutro do dispositivo de origem. Direito: ajustando a descrição do limite de gama de destino em relação à descrição do limite de gama de destino.
Observe que você ajusta cada valor de pixel de origem em relação ao eixo neutro nesse valor de leveza. Isso garante que os neutros do dispositivo de origem se enquadram no eixo neutro do modelo de aparência. Você também desloca todas as outras cores nessa leveza pela mesma quantidade, para que não haja descontinuidades na representação da gama de origem. Você precisa mudar por diferentes quantidades em diferentes níveis de leveza, pois os neutros do dispositivo de origem não são representados como igualmente cromáticos nos diferentes níveis de leveza. Claramente, esta não é uma transformação trivial.
Lidar com os valores do dispositivo de destino é um pouco mais complicado. Inicialmente, você ajusta todo o limite de gama de destino de maneira semelhante, mas em relação ao eixo neutro do dispositivo de destino. Isso é ilustrado na Figura 1 no lado direito. Esse ajuste garante que os valores cinza de origem serão mapeados para valores cinza de destino. Esse é o espaço no qual os algoritmos de mapeamento de gama operam.
No entanto, esse espaço não descreve com precisão o comportamento verdadeiro do dispositivo de destino. Você deve inverter o mapeamento antes que as cores mapeadas de gama sejam entregues ao modelo de aparência e ao modelo de dispositivo de destino. Você compensa todos os valores mapeados pelo oposto do deslocamento aplicado anteriormente ao eixo neutro do dispositivo de destino. Isso mapeia o eixo neutro de destino de volta para o valor representado originalmente pelo CAM. Ele faz o mesmo para o limite de gama e todos os valores intermediários.
Figura 2 : desfazer o alinhamento do eixo neutro do dispositivo de destino
Diferença mínima de cor (MinCD)
Versões mínimas de Diferença de Cor (MinCD) Relativas e Absolutas – equivalente à intenção colorimétrica do ICC.
Observação
O MINCD GMM é adequado para mapear gráficos e arte de linha contendo cores de "logotipo" (cores spot), gradientes de cor do logotipo com algumas cores fora de gama e para o estágio final de transformações de revisão. Embora o MINCD GMM possa ser usado para imagens fotográficas totalmente dentro da gama de destino, não é recomendável para renderização geral de imagens fotográficas. O mapeamento de cores fora da gama para cores na superfície gama de destino pode resultar em artefatos indesejados, como irregularidades de tom ou chroma em gradientes suaves que cruzam o limite de gama. BasicPhoto é recomendado para imagens fotográficas. Se uma imagem fotográfica ou contone exigir um mapeamento de gama diferente de BasicPhoto, a alternativa deverá ser criar um GMM plug-in implementando esse mapeamento, em vez de usar MinCD.
As cores in-gamut são deixadas inalteradas. Para cores fora de gama, a leveza e o chroma são ajustados localizando o ponto na gama de destino que tem a distância mínima de cor dos pontos de entrada fora da gama. A distância de cor é calculada no espaço JCh. No entanto, você pondera a distância na leveza (J) e a distância em chroma (C) ou matiz (h) de forma diferente. Uma função de peso dependente de croma é usada para a distância na leveza para que o peso seja menor para croma pequeno e maior para croma grande até que um croma limite seja atingido, após o qual o peso permanece em 1, ou seja, o mesmo peso que a distância em croma ou matiz. Isso segue o uso recomendado para CMC e CIEDE2000. Há duas variantes: colorimétrica relativa e colorimétrica absoluta.
Colorimétrico relativo: Primeiro, alinhe os eixos neutros de origem e destino, conforme descrito anteriormente. Em seguida, recorte a cor de origem ajustada para o limite de gama de destino ajustado. (Consulte a Figura 4. Mapeamento de chroma ao longo da leveza constante.) Reajuste os valores do dispositivo de destino, conforme descrito anteriormente. No caso de um limite de gama de destino monocromático, o recorte de chroma significa que o valor de chroma (C) é definido como zero (0,0).
Colorimétrico absoluto: Isso é semelhante ao colorimétrico relativo, mas sem o alinhamento do eixo neutro de origem e destino. O valor de origem é recortado diretamente no eixo neutro de destino. Observe que, se os limites de gama de origem e destino forem monocromáticos, o comportamento será idêntico à variante colorimétrica relativa; ou seja, o alinhamento dos eixos neutros é executado e, em seguida, o chroma é recortado para zero. Isso garante que uma saída razoável seja obtida mesmo que a mídia e os colorantes sejam significativamente diferentes.
Figura 3 : recorte de MinCD para a gama ajustada
BasicPhoto
Visão geral
BasicPhoto – equivalente à intenção preferencial, pictorial ou perceptual do ICC.
Esse algoritmo é uma variante do mapeamento de leveza sigmoidal dependente de chroma e do SGCK (dimensionamento do joelho cusp) descrito pelo CIE TC8-03 no CIE156:2004. Esse algoritmo variante dá suporte a GBDs (descritores de limite de gama) com shells de gama dupla; ou seja, GBDs com um shell de referência e um shell plausível. O algoritmo SGCK, que originalmente pressupõe apenas um shell de gama no GBD, baseia-se no algoritmo SIG_KNEE (Braun 1999), que incorpora o mapeamento de leveza sigmoidal e o dimensionamento da função de joelho proposto por Braun e Fairchild (1999), combinado com a dependência de chroma do GCUSP (Morovic, 1998). Ele mantém constante de matiz percebida, por exemplo, ângulo de matiz no Jab corrigido por matiz, e usa um dimensionamento genérico de leveza sigmoidal (independente de imagem) que é aplicado de forma dependente de croma e um croma de função de joelho de 90%. A variante é dimensionada em linhas de leveza constante.
O caso do shell de gama única
É útil examinar o algoritmo no caso em que os GBDs de origem e de destino têm apenas um shell de gama. Nesse caso, o algoritmo consiste nos cálculos a seguir.
Primeiro, execute o mapeamento de leveza inicial usando a seguinte fórmula:
(1)
em que Jₒ é a leveza original e JR é a leveza de reprodução.
(2)
Quando o limite de gama de origem for monocromático, o valor chroma será zero para o limite monocromático devido ao alinhamento do eixo neutro. Isso resultará no caso degenerado em que C é igual a zero. Nesse caso, pC é definido como 1.
pC é um fator de ponderação dependente de chroma (Morovic, 1998) que depende do croma da cor original, C e JS são o resultado da leveza original sendo mapeada usando uma função sigmoidal.
Para calcular js (Braun e Fairchild, 1999), uma tabela de pesquisa unidimensional (LUT) entre valores originais e de leveza de reprodução é configurada pela primeira vez com base em uma função normal cumulativa discreta (S).
(3)
em que x ₀ e S são o desvio médio e padrão da distribuição normal, respectivamente, e i = 0,1,2... m,m é o número de pontos usados no LUT. Si é o valor da função normal cumulativa para i /m percent. Os parâmetros dependem da leveza do ponto preto da gama de reprodução e podem ser interpolados da Tabela 1. Para obter detalhes sobre como calcular esses parâmetros, consulte Braun e Fairchild (1999, p. 391).
J minOut
5,0
10.0
15.0
20,0
x ₀
53.7
56.8
58.2
60.6
S
43.0
49.0
35,0
34,5
Tabela 1 : Cálculo do parâmetro de compactação de leveza BasicPhoto
Para usar o S como um LUT (mapeamento de leveza) ele deve primeiro ser normalizado no intervalo de leveza de [0,100]. Os dados normalizados são então escalados para o intervalo dinâmico do dispositivo de destino, conforme mostrado na Equação 4, em que Jmin\ Out e Jmax\ Out são os valores de leveza do ponto preto e do ponto branco do meio de reprodução, respectivamente.
(4)
Neste ponto, os valores J S podem ser obtidos do LUT S interpolando entre os pontos m dos valores J O' e J S correspondentes que ele contém e usando a equação a seguir como entrada.
(5)
J minIn é o valor de leveza do ponto preto do meio original, J maxIn é o valor de leveza do ponto branco do meio original, e J O é a leveza original. Para referência posterior, você pode denotar por S a função sigmoidal definida da maneira descrita, conforme ilustrado na Figura 4 a seguir.
Figura 4 : mapeamento de chroma ao longo da leveza constante
Em segundo lugar, se o limite de gama de destino for cromático, compacte chroma em linhas de leveza constante (l) e execute a compactação da seguinte maneira.
(6)
em que d representa a distância de E em l; g representa o limite médio de gama; r representa a reprodução; e o a Figura 5 original.
Figura 5 : Cronoma e compactação de leveza no BasicPhoto
Se o limite de gama de destino for monocromático, o valor chroma será recortado para zero.
Em terceiro lugar, use um clipe de MinCD (descrito anteriormente) para eliminar qualquer erro residual.
Aprimoramento preto
O algoritmo anterior pode ser modificado para melhorar o preto quando o destino for um dispositivo de impressora. O problema tem a ver com a escolha de JminOut, que geralmente não corresponde à cor mais escura que uma impressora pode produzir.
Mais especificamente, a cor com maior densidade, obtida colocando 100% de tintas (ou cobertura máxima possível, se a limitação de GCR/tinta estiver em vigor), geralmente não é "neutra" no espaço de aparência de cor. Confira a Figura 6. Em outras palavras, se a leveza mínima neutra for usada para o dispositivo de destino, o dimensionador de leveza construído será mapeado para uma leveza mínima que não é a densidade mais alta que pode ser obtida pela impressora. Considere o caso de uso adicional do monitor para a impressora. O monitor preto, R=G=B=0, será impresso como não a densidade mais alta. O impacto na qualidade da imagem é que há uma falta de profundidade e contraste.
Figura 6 : o ponto preto do dispositivo pode ser mais escuro do que a leveza mínima neutra.
Suponha que o destino "ponto negro do dispositivo" seja Jkakbk/JkCkh k. Se C k não for zero, o ponto preto do dispositivo não será neutro em relação ao CAM02. Se você usar J k para o destino "leveza mínima neutra" na construção do dimensionador de leveza; ou seja, configuração
JminOut = Jk
e aplicá-lo ao shell de gama de origem, você obtém a configuração descrita na Figura 7. Na figura, o plano matiz corresponde a h k.
Figura 7 : Geometria usando o dimensionador de leveza modificado com o ponto preto do dispositivo de destino
Para permitir que o algoritmo de compactação chroma subsequente prossiga, você deseja alinhar as levezas máximas e mínimas nos shells de origem e de destino. Isso pode ser feito ajustando o shell de destino entre J neutralMin e J k deslocando pontos para a esquerda. Além disso, essa transformação deve ser aplicada em todo o espaço Jab, não apenas no plano matiz correspondente a h k.
A transformação é
A Figura 8 mostra o efeito da transformação.
Figura 8 : Geometria usando o dimensionador de leveza modificado com o ponto preto do dispositivo de destino
Depois de aplicar o algoritmo de compactação de chroma usual, o ponto deve ser "deslocado para trás; ou seja, a transformação inversa deve ser aplicada para obter a cor mapeada final.
O caso de shells de gama dupla
A meta é generalizar SIG_KNEE para o shell de gama única para o caso em que o GBD do dispositivo de origem ou o GBD do dispositivo de destino tem uma estrutura de dois shells. O shell interno será chamado de Shell de Referência, enquanto o shell externo será chamado de Shell Plausível. Você deseja considerar os casos a seguir.
(a) O GBD de origem e o GBD de destino têm uma estrutura de dois shells.
(b) O GBD de origem tem uma estrutura de dois shells; o GBD de destino tem apenas um shell.
(c) O GBD de origem tem apenas um shell; o GBD de destino tem uma estrutura de dois shells.
(d) O GBD de origem e o GBD de destino têm apenas um shell.
Case (d) é o caso do shell de gama única que foi discutido anteriormente. Para casos (a), (b) e (c), você pode generalizar o redimensionamento de leveza para usar as informações extras da estrutura do shell duplo. Nos casos (b) e (c) em que a origem ou o destino tem apenas um shell, você introduz um "shell de referência induzido" que será discutido em uma seção subsequente, "Shell de Referência Induzido". O algoritmo geral para dois shells será descrito para case (a). Depois que a construção do Shell de Referência Induzida for explicada, o algoritmo também poderá ser aplicado a maiúsculas e minúsculas (b) e (c). Quanto à compactação de croma, a taxa de compactação será determinada pelos maiores shells disponíveis. Em outras palavras, se o Shell Plausível e o Shell de Referência estiverem disponíveis, o Shell Plausível será usado; caso contrário, o Shell de Referência será usado.
Redimensionamento generalizado de leveza
A existência de dois shells para GBD de origem e de destino significa que você deve mapear um conjunto de quatro pontos do GBD de origem para um conjunto correspondente no GBD de destino.
Os subscritos têm os seguintes significados.
o ou r: "original" (origem) ou "reprodução" (destino)
min ou max: leveza neutra mínima ou leveza neutra máxima
pla ou ref: Shell ou shell de referência plausível
A ordenação em cada quádruplo também é a magnitude relativa esperada desses pontos.
O mapa redimensionamento de leveza usa as mesmas duas primeiras equações que o shell único, mas o J S é definido de maneira detalhada da seguinte maneira.
(7)
Em outras palavras, ele é sigmoidal dentro do shell de referência e linear fora. Consulte a Figura 9.
Figura 9 : Função de redimensionamento de leveza para GBDs de dois shells
SHELL DE REFERÊNCIA INDUZIDO
Quando um GBD tem um shell e o outro GBD tem dois shells, você deve criar um "Shell de Referência" para o GBD com apenas um shell. O shell existente, que seria chamado de Shell de Referência, será alterado para o "Shell Plausível". Na verdade, você não precisa criar um shell no espaço Jab completo. Como o redimensionamento de leveza usa apenas J max e J min, você só precisa criar esses valores para o Shell de Referência induzido. Há dois casos, dependendo de qual GBD tem dois shells.
Caso 1: o GBD de origem tem dois shells; O GBD de destino tem um shell.
Determine o shell de referência induzido de destino no eixo neutro; ou seja, o J r,\ min,\ ref e J r,\ max,\ ref do shell. Isso é feito usando o algoritmo a seguir.
Os fatores? baixo e ? controle alto da separação entre o Shell Plausível e o Shell de Referência. Um valor de 1 significa que os valores de J min ou J mₐₓ coincidem. Seus valores são "induzidos" do Shell de Referência de origem e do Shell Plausível de origem.
Os "fatores de fudge" F baixo e F alto são parâmetros ajustáveis que devem estar entre 0 e 1. Se o valor for 0, os shells J min ou J mₐₓ serão induzidos diretamente dos shells de origem. Nesse caso, escolha F baixo = 0,95 e F alto = 0,1.
Caso 2: o GBD de origem tem um shell; O GBD de destino tem dois shells.
Determine o shell de referência induzido pela origem no eixo neutro; ou seja, o J o,\ min,\ ref e J o,\ max,\ ref do shell. Isso é feito usando o algoritmo a seguir.
Novamente, os fatores? baixo e ? controle alto da separação entre o Shell Plausível e o Shell de Referência. Um valor de 1 significa que os valores de J min ou J mₐₓ coincidem. Seus valores são "induzidos" do Shell de Referência de origem e do shell plausível de origem:
Motivos para alterações das recomendações do CIE TC8-03
BasicPhoto difere das recomendações do CIE TC8-03 das seguintes maneiras.
- Chroma não é compactado em direção à borda, mas ao longo de linhas de leveza constante.
- O intervalo de leveza usa a leveza da cor mais escura na gama em vez do ponto em que o limite de gama cruza o eixo neutro.
- BasicPhoto dá suporte a um shell de gama de referência e a um shell de gama plausível, se qualquer limite gama na transformação tiver dois shells.
- BasicPhoto usa CIECAM02; em vez de usar CIECAM97s para converter em D65 em 400 cd/m2 e, em seguida, usar o espaço de cor RIT IPT.
A primeira alteração foi feita para evitar problemas de inversão de tom que podem ocorrer ao usar a compactação em direção a um cusp. Conforme mostrado na Figura 10, a compactação de cusp pode causar inversões de tom. Isso pode acontecer quando as cores de croma alto são mais claras do que as cores do croma inferior. Como o SGCK compacta cada pixel independentemente na leveza e no croma, não é garantido preservar a relação de leveza entre os valores de pixel após a compactação. A desvantagem conhecida dessa decisão de compactar linhas de leveza constante é que você pode sofrer perdas de croma, especialmente em áreas onde o limite de gama de destino é muito plano, como acontece com amarelos brilhantes.
Figura 10 : inversão de tom causada pelo SGCK
Figura 11 : imagem original, resultado de SGCK e resultado de BasicPhoto
A Figura 11 ilustra essa inversão de tom. À esquerda há uma imagem original capturada por uma câmera digital; no centro, a imagem reproduzida por SGCK; e à direita, a imagem reproduzida por BasicPhoto. A imagem à esquerda está no espaço de cores da câmera digital, as imagens central e direita estão no espaço de cores de uma exibição de vídeo LCD. Na imagem original, a parte superior do bule é mais escura que a parte inferior, porque a parte inferior está refletindo a toalha de mesa sobre a qual ela está sentada. Na imagem SGCK, a parte superior é, na verdade, mais leve que a parte inferior, devido à inversão de tom. Além disso, é difícil ver os itens refletidos na parte inferior do bule. À direita, BasicPhoto corrigiu a inversão de tom e os artigos refletidos são mais claramente distinguíveis.
A segunda alteração foi feita para melhorar a reprodução de cores quase pretas em impressoras em que o preto mais preto não cai diretamente no eixo neutro CIECAM02. A Figura 12 a seguir mostra uma imagem convertida em sRGB; reproduzido para uma impressora de jato de tinta RGB usando SGCK; e reproduzidos para a mesma impressora usando BasicPhoto. A imagem no centro não está usando o dispositivo completo preto e, portanto, não tem o contraste visto no original. O contraste é restaurado com BasicPhoto.
Figura 12 : preto aprimorado
A terceira alteração foi feita para melhorar a reprodução de cores para câmeras digitais. Especialmente nos casos em que a câmera digital foi perfilada usando um destino de referência, uma descrição de limite de gama criada a partir de cores medidas pode não incluir todas as cores que podem ser capturadas em uma cena do mundo real. Em vez de recortar todas as cores para a gama do destino de cor medido, você permite que a extrapolação produza um limite de gama plausível. O algoritmo BasicPhoto foi projetado para dar suporte a um limite de gama extrapolado.
A quarta alteração foi feita porque o CIECAM02 funciona bem para mapeamento de gama. O processo recomendado pelo TC8-03 de conversão de cores do dispositivo para D65 em 400 cd/m2 e, em seguida, o uso do espaço de cor RIT IPT é com uso intensivo de computação e tempo de consumo.
Mapeamento de matiz
HueMap é o equivalente à intenção de Saturação do ICC.
Se o limite de gama de origem ou o limite de gama de destino não contiver primárias, esse modelo será revertido para o modelo MinCD (relativo) descrito em uma seção anterior; por exemplo, dispositivos para os quais as primárias não podem ser determinadas (perfis ICC com mais de quatro canais) ou perfis ICC monocromáticos.
Primeiro, esse algoritmo ajusta a tonalidade do valor de cor de entrada. Em seguida, ele ajusta simultaneamente a leveza e o croma, usando um mapeamento de tesoura. Por fim, ele corta o valor de cor para garantir que ele esteja dentro da gama.
A primeira etapa é determinar o "Hue Wheels". Localize os valores JCh para cores primárias e secundárias para o dispositivo de origem e de destino. Você só está considerando os componentes matiz. Isso resulta em uma roda de matiz primária ou secundária com seis pontos de cor para cada dispositivo. (Consulte a Figura 13.)
Figura 13 : Rodas de matiz
Melhores resultados poderão ser obtidos se o primário azul de origem não for girado para o primário azul de destino. Em vez disso, o ângulo de matiz primário azul de origem é usado como o ângulo de matiz primário azul de destino.
Em seguida, execute as rotações de matiz para cada cor de entrada da imagem de origem,
a)Usando o ângulo de matiz da cor de entrada, determine o local da cor na roda de matiz de origem em relação às duas cores primária ou secundária adjacentes. O local pode ser considerado como uma porcentagem da distância entre as primárias. Por exemplo, a matiz de cor de entrada é 40% do caminho desde o valor matiz de Magenta até o valor matiz de Vermelho.
b)Na roda de matiz de destino, localize o ângulo de matiz associado, por exemplo, 40% de Magenta para Vermelho. Esse valor será o ângulo de matiz de destino.
Em geral, as primárias de origem e os secundários não estarão nos mesmos ângulos de matiz que as primárias de destino e secundárias; ou seja, o ângulo de matiz de destino geralmente será diferente do ângulo de matiz de origem.
Por exemplo, suponha que as rodas de matiz produzam os seguintes valores:
Origem M = 295 graus, Origem R = 355 graus.
Destino M = 290 graus, Destino R = 346 graus.
Se o ângulo de matiz da cor de entrada for de 319 graus, será 40% do ângulo (24 graus) da origem M ao R de origem. O ângulo de M a R é de 60 graus e o ângulo de M para matiz de entrada é de 24 graus. Calcule o ângulo no destino que é de 40% do destino M ao R de destino (22 graus), portanto, o ângulo de matiz da cor de destino é de 312 graus.
Em seguida, calcule os pontos de referência de matiz para a matiz de origem e a tonalidade de destino. Para calcular o ponto de referência de matiz para um valor h (matiz) específico, você deseja encontrar o valor J (leveza) e o valor C (chroma).
- Localize o valor J do ponto de referência de matiz interpolando entre os valores J para os pontos primários ou secundários adjacentes, usando a posição relativa da matiz; por exemplo, 40% neste exemplo.
- Localize o valor máximo de C nesse valor J e no valor h. Agora você tem o JCh do ponto de referência de matiz para essa tonalidade.
Figura 14 : uma folha de matiz (visualização de uma fatia de limite de gama em uma tonalidade específica)
A próxima etapa é calcular o mapeamento de tesoura para cada pixel. Primeiro, visualize uma folha de matiz da gama de origem para o ângulo de matiz de cor de origem e uma folha de matiz da gama de destino para o ângulo de matiz de destino calculado durante a rotação de matiz. As folhas de matiz são criadas tirando uma "fatia" da superfície de limite de gama JCh em um ângulo de matiz específico (consulte a Figura 14).
OBSERVAÇÃO: por motivos de otimização de desempenho, as folhas de matiz não são realmente criadas; eles são descritos e mostrados aqui apenas para fins de visualização. As operações são executadas diretamente na superfície de limite de gama na matiz especificada. Em seguida, você calcula os pontos de referência de matiz para determinar o mapeamento de tesoura.
- Execute um redimensionamento de leveza para mapear os pontos preto e branco da folha de origem para a folha de destino (consulte a Figura 15). Os pontos preto e branco da folha de matiz de origem são mapeados linearmente para os pontos preto e branco da folha de matiz de destino, dimensionando todas as coordenadas J do limite de origem. O valor da cor de entrada mapeada por matiz é dimensionado da mesma maneira.
Figura 15 : Mapeamento de leveza
- Determine os pontos de referência de matiz para cada folha de matiz. Aplique um mapeamento de tesoura à folha de origem para que os pontos de referência de origem e destino coincidam (consulte Figura 16). O ponto de referência para uma gama em uma tonalidade específica é o ponto de referência de matiz interpolado entre as primárias adjacentes. O ponto de referência da folha de matiz de origem é mapeado linearmente para o ponto de referência da folha de matiz de destino, usando uma operação de "tesoura" que bloqueia o eixo J, mantendo os pontos pretos e os pontos brancos estacionários. Os pontos pretos, os pontos brancos e os pontos de referência das folhas de matiz de origem e destino devem coincidir.
- Aplique o mapeamento de tesoura ao valor de cor de entrada ajustado pela leveza. As coordenadas J e C do valor de cor de origem são dimensionadas proporcionalmente, em relação à distância do eixo J.
- Em seguida, uma compactação sutil de leveza dependente de chroma em direção ao valor J do ponto de referência de matiz é executada no ponto de cor mapeado por tesoura. A compactação em direção à referência de matiz J é feita de forma gama, onde branco, preto, cinza e pontos na referência de matiz J não são afetados. Todos os outros pontos tendem à referência de matiz J de uma forma suave, ligeiramente agrupando-se perto da referência de matiz J, com chroma permanecendo constante. A dependência de chroma garante que as cores neutras não sejam afetadas e que o efeito seja aumentado nas cores com croma mais alto.
Veja a seguir uma descrição matemática da compactação de leveza em direção à referência de matiz J ou ajustando o valor J do ponto de destino. Ele é chamado de ponto de destino porque foi mapeado para a gama de destino.
Primeiro, compute "factorC" (fator de dependência chroma) para o ponto de destino, que determina quanto efeito a compactação de leveza terá. Pontos próximos ou no eixo J terão pouca ou nenhuma compactação; pontos mais distantes do eixo J (croma alto) terão mais compactação aplicada. Multiplique por 0,5 para garantir que factorC seja menor que 1, pois é possível que sourceC possa ser um pouco maior que referenceC, mas não duas vezes maior.
factorC = (destinationC/referenceC) ? 0,5
em que:
destinationC é o valor C do ponto de destino.
referenceC é o valor C do ponto de referência hue.
Em seguida, determine se o ponto de destino J está acima ou abaixo da referência de matiz J. Se estiver acima, faça o seguinte:
Compute "factorJ" para o ponto de destino em relação ao referenceJ. Esse valor factorJ será entre 0 e 1 (0 se estiver no referenceJ; 1 se estiver no maxJ).
factorJ = (destinationJ - referenceJ) / (maxJ - referenceJ)
em que:
destinationJ é o valor J do ponto de destino.
referenceJ é o valor J do ponto de referência de matiz.
maxJ é o valor J máximo da gama.
Aplique uma função de energia semelhante a gama ao factorJ, o que reduzirá o fatorJ em uma determinada quantidade. Este exemplo usa a potência de 2 (o quadrado). Subtraia o fator reduzidoJ do factorJ original e multiplique o resultado pelo intervalo J total acima do referenceJ primário para localizar o "deltaJ", que representa a alteração em J após a compactação de leveza, mas não incluindo a dependência de chroma.
deltaJ = (factorJ - (factorJ ? factorJ)) ? (maxJ – referenceJ)
Aplique factorC ao deltaJ (quanto maior o chroma, maior o efeito) e compute o novo valor J para o ponto de destino.
destinationJ = destinationJ - (deltaJ ? factorC)
Se o valor J para o ponto de destino estiver abaixo de referenceJ, uma computação semelhante às etapas anteriores A-C será executada, usando minJ em vez de maxJ para localizar o intervalo em J para calcular o factorJ e levando em conta a polaridade das operações "abaixo" do referenceJ.
factorJ = (referenceJ - destinationJ) / (referenceJ - minJ)
deltaJ = (factorJ - (factorJ ? factorJ)) ? (referenceJ – minJ)
destinationJ = destinationJ + (deltaJ ? factorC)
em que:
minJ é o valor J mínimo da gama.
O chroma para pontos de cor de entrada é expandido linearmente (quando possível) ao longo da leveza constante proporcional ao valor máximo de croma das gamas de origem e destino nesse matiz e leveza. Combinado com a compactação de leveza dependente de croma anterior, isso ajuda a preservar a saturação porque o mapeamento de tesoura usando os pontos de referência às vezes faz com que o ponto de origem compacte demais em chroma (consulte Figura 16).
Figura 16 : mapeamento de tesoura, compactação de leveza em direção à referência de matiz J e expansão do chroma
Veja a seguir uma descrição matemática do processo de expansão do chroma ou ajuste do valor C do ponto de destino. Ele é chamado de ponto de destino porque foi mapeado e leveza compactada na gama de destino.
Antes do mapeamento de tesoura, determine sourceExtentC (a extensão de croma na leveza e matiz do ponto de origem).
Após o mapeamento de cisalhamento e a compactação de leveza que transforma o ponto de origem no ponto de destino, determine o destExtentC (a extensão de chroma na leveza e matiz do ponto de destino).
Se sourceExtentC for maior que o destExtentC, nenhum ajuste de chroma ao ponto de destino será necessário e você poderá ignorar a próxima etapa.
Ajuste destinationC (o chroma do ponto de destino) para caber dentro da extensão de chroma de destino nessa leveza e matiz.
destinationC = destinationC ? (destExtentC/sourceExtentC)
em que:
destinationC é o valor C do ponto de destino.
sourceExtentC é o valor C máximo da gama de origem na leveza e matiz do ponto de origem.
destExtentC é o valor C máximo da gama de destino na leveza e matiz do ponto de destino.
Por fim, execute o recorte de distância mimimum. Se a cor de entrada girada, com leveza e mapeada por cisalhamento ainda estiver ligeiramente fora da gama de destino, recorte-a (mova-a) para o ponto mais próximo no limite de gama de destino (consulte a Figura 17).
Figura 17 : recorte de distância mínima
Descrição de limites de gama e algoritmos de shell de gama
A função de limite de gama do dispositivo usa o mecanismo de modelo de dispositivo e os parâmetros analíticos para derivar um limite de gama de dispositivo de cores, descrito como uma lista de vértice indexada do casco da gama do dispositivo. O casco é calculado de forma diferente dependendo se você está trabalhando com dispositivos aditivos, como monitores e projetores ou dispositivos subtrativos. A lista de vértice indexado é armazenada no CIEJab. A estrutura da lista de vértice indexada é otimizada para aceleração de hardware pelo DirectX.
Essa abordagem tem muitas soluções conhecidas. Se você pesquisar "convex hull DirectX" na Web, receberá mais de 100 ocorrências. Por exemplo, há uma referência de 1983 sobre este tópico específico (Teoria e Aplicativo de Computação Gráfica, "Shiphulls, superfícies b-spline e cadcam", pp. 34-49) com referências datadas de 1970 a 1982 sobre o tópico.
A coleção de pontos pode ser determinada a partir de informações disponíveis externamente, da seguinte maneira:
- Os pontos do shell de referência para monitores são gerados usando uma amostragem do cubo de cor no espaço colorante do dispositivo.
- Os pontos do shell de referência para impressoras e dispositivos de captura são obtidos dos dados de exemplo usados para inicializar o modelo.
- Os pontos para o shell de referência para scRGB e sRGB são gerados usando uma amostragem do cubo de cor para sRGB.
- Os pontos para o shell plausível para dispositivos de captura são gerados usando uma amostragem do cubo de cor no espaço colorante do dispositivo.
- Os pontos para o shell de referência para projetores são gerados usando uma amostragem de um poliedro no cubo de cor no espaço colorante do dispositivo.
- Os pontos para o shell possível para espaços de cores de intervalo dinâmico amplo são gerados usando uma amostragem do cubo de cor no próprio espaço.
Você pode criar uma lista de vértice que descreve com eficiência a gama de dispositivos de cores, dado um perfil de dispositivo e serviços de suporte do sistema.
Para dispositivos de saída, o limite de gama descreve o intervalo de cores que pode ser exibido pelo dispositivo. Um limite de gama é gerado a partir dos mesmos dados usados para modelar o comportamento do dispositivo. Conceitualmente, você gera uma amostragem do intervalo de cores que o dispositivo pode produzir, mede as cores, converte as medidas em espaço de aparência e, em seguida, usa os resultados para criar o limite de gama.
Os dispositivos de entrada são mais complicados. Cada pixel em uma imagem de entrada deve ter algum valor. Cada pixel deve ser capaz de representar qualquer cor encontrada no mundo real de alguma forma. Nesse sentido, nenhuma cor está "fora de gama" para um dispositivo de entrada, pois elas sempre podem ser representadas.
Todos os formatos de imagem digital têm algum intervalo dinâmico fixo. Devido a essa limitação, há sempre alguns estímulos distintos que são mapeados para o mesmo valor digital. Portanto, você não pode estabelecer um mapeamento um-para-um entre cores do mundo real e valores de câmera digital. Em vez disso, o limite de gama é formado pela estimativa de uma variedade de cores do mundo real que podem produzir as respostas digitais da câmera. Você usa esse intervalo estimado como a gama para o dispositivo de entrada.
As primárias são incluídas para fornecer mapeamento de gama do tipo de intenção de elementos gráficos de negócios.
No estilo verdadeiro orientado a objetos, você abstrai a representação subjacente do limite de gama. Isso permite que você tenha a flexibilidade de alterar a representação no futuro. Para entender o GBD (descritor de limite de gama) usado no novo CTE, primeiro você deve entender como os GMAs (algoritmos de mapeamento de gama) funcionam. Tradicionalmente, os GMAs foram projetados para atender às necessidades da comunidade de arte gráfica; ou seja, para reproduzir imagens que já foram renderizadas corretamente para o dispositivo no qual a imagem de entrada foi criada. O objetivo dos GMAs de artes gráficas é fazer a melhor reprodução possível da imagem de entrada no dispositivo de saída. O novo GBD de CTE foi projetado para resolver quatro problemas importantes.
Como a imagem de entrada é renderizada para o dispositivo de entrada, todas as cores se encaixam dentro do intervalo entre o ponto branco do meio e o ponto preto. Suponha que a imagem seja uma fotografia de uma cena em que há um branco difuso, como uma pessoa em uma camiseta branca, e um realce especular, como luz refletindo uma janela ou pára-choque cromado. A cena será renderizada para o meio de entrada para que o realce especular seja mapeado para o ponto branco do meio e o branco difuso seja mapeado para uma cor neutra mais escura que o ponto branco do meio. A escolha de como mapear cores da cena para o meio de entrada é uma decisão dependente da cena e uma decisão estética. Se o realce especular estivesse ausente da cena original, o branco difuso provavelmente seria mapeado para o ponto branco do meio. Em uma cena com muitos detalhes de realce, mais intervalo seria deixado entre o branco especular e o branco difuso. Em uma cena em que o realce não é significativo, muito pouco intervalo pode ser deixado.
Para imagens pré-renderizadas, o mapeamento de gama é relativamente simples. Basicamente, o ponto branco do meio original é mapeado para o ponto branco do meio de reprodução, o ponto preto de origem é mapeado para o ponto preto de destino e a maior parte do mapeamento é concluída. Os diferentes GMAs existentes fornecem variações para mapear outros pontos na escala de tom do meio de origem e diferentes maneiras de lidar com valores de chroma fora de gama. Mas o mapeamento de branco para branco e preto para preto é consistente ao longo dessas variações. Essa implementação requer que o branco esteja acima de um J* de 50 e preto abaixo de um J* de 50.
Nem todas as codificações de cores limitam intervalos de cores para imagens de entrada. A codificação de cores padrão IEC scRGB (IEC 61966-2-2) fornece 16 bits para cada um dos três canais de cores vermelho, verde e azul (RGB). Nessa codificação, o preto de referência não é codificado como o triplo RGB (0, 0, 0), mas como (4096, 4096, 4096). O branco de referência é codificado como (12288, 12288, 12288). A codificação scRGB pode ser usada para representar realces especulares e detalhes de sombra. Ele inclui triplos RGB que não são fisicamente possíveis porque exigem quantidades negativas de luz e codificações que estão fora do gafanhoto espectral do CIE. Claramente, nenhum dispositivo pode produzir todas as cores na gama scRGB. Na verdade, nenhum dispositivo pode produzir todas as cores que um ser humano pode ver. Portanto, os dispositivos não podem preencher a gama scRGB e seria útil poder representar a parte da gama que eles preenchem. Cada dispositivo tem um intervalo de valores no espaço scRGB que pode produzir. Essas são as cores "esperadas" para o dispositivo; seria surpreendente para o dispositivo produzir cores fora dessa gama. Há uma transformação definida do espaço scRGB para o espaço de aparência, portanto, cada dispositivo também tem um intervalo de valores de aparência que se espera reproduzir.
No scRGB e na entrada de dispositivos de captura caracterizados com um destino fixo, é possível obter um valor fora do intervalo de valores esperados. Se alguém calibrar uma câmera para um destino de teste; e captura uma cena com realces especular, pode haver pixels mais brilhantes que o ponto branco do destino. A mesma coisa pode acontecer se um vermelho que ocorre naturalmente for mais cromático do que o vermelho de destino. Se alguém pegar uma imagem scRGB de um dispositivo e editar manualmente as cores na imagem, será possível criar pixels que estejam fora do intervalo esperado da gama de dispositivos, mesmo que estejam dentro da gama scRGB completa.
Um segundo problema pode não estar, a princípio, relacionado a isso. Ela surge quando você usa um destino de cor para caracterizar um dispositivo de entrada, como uma câmera ou scanner. Os destinos reflexivos normalmente são produzidos no papel e contêm uma série de patches coloridos. Os manufaturers fornecem arquivos de dados com medidas de cor tomadas sob uma condição de exibição fixa para cada patch de cor. As ferramentas de criação de perfil de cores criam um mapeamento entre esses valores medidos e os valores retornados pelos sensores de cor nos dispositivos. O problema é que, muitas vezes, esses destinos de cor não abrangem a gama completa de valores de dispositivo. Por exemplo, o scanner ou a câmera pode retornar um valor de (253, 253, 253) para o ponto branco de referência e um patch vermelho de referência pode ter um valor RGB de (254, 12, 4). Eles representam o intervalo de valores esperados para o dispositivo de entrada, com base nos valores de destino. Se você caracterizar o dispositivo de entrada com base nas respostas ao destino, só espera cores dentro desse intervalo estreito. Esse intervalo não é apenas menor do que o intervalo de cores que os humanos podem ver, é menor do que o intervalo de cores que o dispositivo pode produzir.
Em ambos os casos, é difícil estimar a gama do dispositivo ou imagem de entrada, apesar da existência de uma gama de referência ou medidas. No primeiro problema, a gama plausível do dispositivo de entrada é menor que a gama completa de scRGB. No segundo problema, a gama de referência do destino é menor que a gama total possível do dispositivo de entrada.
O terceiro problema envolve o mapeamento de tom. Muitos modelos de limites gama que podem representar adequadamente imagens pré-renderizadas usadas nas artes gráficas foram propostos, por exemplo, o Braun e Fairchild Mountain range GBD (Braun[97]), e o descritor de limite Segment Maxima de Morovic (Morovic[98]). Mas esses modelos fornecem apenas informações sobre os extremos da gama do dispositivo; estão faltando informações sobre outros pontos no mapeamento tonal. Sem essas informações, os GMAs só podem fazer estimativas aproximadas do mapeamento de tom ideal. Pior, esses modelos não fornecem ajuda para o intervalo dinâmico estendido em scRGB e em imagens de câmera digital.
Como esse problema é resolvido nos setores fotográfico e videográfico? A câmera captura uma imagem. Especialistas podem debater a quantidade de renderização que ocorre no dispositivo de captura; mas eles concordam que não é uma quantidade significativa. Ambas as tecnologias não mapeiam um branco difuso em uma cena capturada para o ponto branco do meio. Da mesma forma, eles não mapeiam o ponto negro da cena para o ponto negro do meio. O comportamento do filme fotográfico é descrito no espaço de densidade usando uma curva característica, muitas vezes chamada de Hurter e Driffield, ou curva H&D. A curva mostra a densidade da cena original e a densidade resultante do filme. A Figura 18 mostra uma curva HD&típica. O eixo x representa o aumento da exposição ao log. O eixo y representa a densidade no slide. Cinco pontos de referência são marcados na curva: preto sem detalhes, que representa a densidade mínima no negativo; preto com detalhes; referenciar cartão cinza médio; branco com detalhes; e branco sem detalhes. Observe que há espaço entre preto sem detalhes (que representa o dispositivo preto) e preto com detalhes (sombra preta). Da mesma forma, há espaço entre branco com detalhes (branco difuso) e branco sem detalhes (que representa o dispositivo branco).
Figura 18 : curva H&D para filme de slide
A indústria de vídeos fornece "headroom" e "footroom" em imagens. Na especificação ITU 709, a luminância (chamada Y) é codificada em 8 bits, com um intervalo de 0 a 255. No entanto, o preto de referência é codificado em 15 e o branco de referência é codificado como 235. Isso deixa o intervalo de codificação entre 236 e 255 para representar realces especular.
A indústria de vídeo apresenta um sistema de loop essencialmente fechado. Embora haja muitos fornecedores de equipamentos diferentes, os sistemas de vídeo são baseados em dispositivos de referência. Há uma codificação padrão para imagens de vídeo. Não é necessário comunicar um limite de gama com imagens de vídeo, pois todas as imagens são codificadas para reprodução no mesmo dispositivo de referência. O filme também é um loop fechado porque não há necessidade de transmitir dados intermediários entre componentes diferentes. Você deseja uma solução que permita que imagens de dispositivos com gamas variadas e que representem cenas pré-renderizadas e não excluídas sejam reproduzidas na saída com gamas variadas.
Um quarto problema que a nova CTE deve resolve é que as cores visualmente cinza produzidas por um dispositivo, por exemplo, quando red=green=blue em um monitor, frequentemente não se enquadram no eixo neutro do CAM (quando o chroma = 0,0). Isso causa grandes dificuldades para os GMAs. Para fazer com que os GMAs funcionem bem, você precisa ajustar a descrição da gama do dispositivo e dos pontos de entrada para que o eixo neutro do dispositivo fique no eixo neutro do espaço de aparência. Você precisa ajustar pontos fora do eixo neutro em uma quantidade semelhante. Caso contrário, você não poderá fazer gradações suaves por meio da imagem. Na saída da GMA, você desfaz esse mapeamento em relação ao eixo neutro do dispositivo de saída. Isso é conhecido como um endireitamento "quiroprático" do eixo. Como um quiroprático, você não só endireita o esqueleto (eixo neutro), mas ajusta o resto do corpo para se mover junto com o esqueleto. Como um quiroprático, você não ajusta o esqueleto pela mesma quantidade por todo o espaço. Em vez disso, você ajusta seções diferentes de forma diferente.
Figura 19: Curvatura do eixo neutro do dispositivo em relação ao eixo neutro da CIECAM
O que a nova CTE requer é um modelo de um limite de gama que pode ser usado para representar imagens de origem renderizadas e não duplicadas, fornecer informações sobre a aparência dos neutros do dispositivo e fornecer informações para imagens de mapeamento de tom com um amplo intervalo de luminância.
Figura 20 : três shells de gama
O limite de gama é composto por três shells que definem três regiões.
Na nova CTE, o shell externo da gama é formado com um casco convexo feito de pontos de exemplo na gama do dispositivo. Um casco é formado tomando um conjunto de pontos de amostra e cercando-os por uma superfície. Um casco convexo tem a propriedade adicional de ser convexo em todos os lugares. Portanto, esse não é o menor casco possível que pode ser adequado aos dados. Mas a experimentação mostrou que ajustar os pontos de amostra muito fortemente causa artefatos não atraentes em imagens, como a falta de sombreamento suave. O casco convexo parece resolver esses problemas.
No algoritmo , os valores de aparência de cor são obtidos para um conjunto de pontos amostrados do dispositivo. Para monitores e impressoras, os valores de aparência de cor são obtidos gerando amostras e, em seguida, medindo-as. Você também pode criar um modelo de dispositivo e, em seguida, executar dados sintéticos por meio do modelo de dispositivo para prever valores medidos. Os valores medidos são convertidos do espaço colorimétrico (XYZ) para o espaço de aparência (Jab) e o casco é encapsulado em torno dos pontos.
O ponto chave para esse algoritmo é que o ponto branco adotado usado na conversão de colorimetric para espaço de aparência não precisa ser o ponto branco do meio. Em vez disso, você pode selecionar um ponto mais distante dentro da gama e no (ou próximo) do eixo neutro. Esse ponto terá um valor J de 100. Exemplos com um valor Y medido maior que o ponto branco adotado acabarão com um valor J maior que 100.
Se você colocar o ponto branco difuso da cena como o ponto branco adotado para a conversão de espaço de cor, os realces especular na cena serão facilmente detectados como tendo um valor J maior que 100.
Como o modelo de cores CIECAM02 é baseado no sistema visual humano, depois que um branco adotado é selecionado, o nível de luminância do ponto preto (J = 0) é determinado automaticamente pelo modelo. Se a imagem de entrada tiver um amplo intervalo dinâmico, é possível que haja valores mapeados para valores J menores que zero.
A Figura 21 a seguir mostra os neutros do dispositivo que passam pelo centro das gamas plausíveis e de referência.
Figura 21 : Eixo neutro do dispositivo adicionado ao limite de gama
Todos os mapeamentos de gama envolvem cortar um intervalo de entrada em uma gama de saída ou compactar a gama de entrada para caber dentro da gama de saída. Algoritmos mais complexos são formados compactando e recortar em direções diferentes ou dividindo a gama em regiões diferentes e executando recorte ou compactação nas diferentes regiões.
O novo CTE estende esse conceito para dar suporte às regiões de uma possível gama, uma gama plausível e uma gama de referência e permite que os GMAs os mapeiem de maneiras diferentes. Além disso, os GMAs têm informações sobre o eixo neutro do dispositivo. A discussão a seguir aborda como lidar com situações em que as gamas plausíveis e as gamas de referência entraram em colapso umas sobre as outras.
Figura 22 : GMA com dois descritores de gama não recolhidos
Você poderá ver este exemplo se mapear de um dispositivo de entrada, como uma câmera ou scanner caracterizado com um destino reflexivo, para espaço scRGB. Aqui, as cores plausíveis que são mais claras que o branco de referência são realces especulares. Na prática, caracterizar uma câmera com um destino pode não gerar a gama completa de valores possíveis na câmera; no entanto, realces especulares e cores muito cromáticas encontradas na natureza seriam. (Os destinos transmissivos geralmente têm um patch que é a densidade mínima possível no meio. Com esse destino, os realces especuladores se enquadrariam no intervalo do destino.) O preto de referência para um destino reflexivo seria o início da região negra sombra. Ou seja, é provável que haja cores nas sombras mais escuras que o preto no destino. Se a imagem contiver muito conteúdo interessante nessa região, talvez valha a pena preservar essa variação tonal.
Figura 23 : GMA com gama de destino recolhida
A Figura 23 mostra um possível algoritmo de mapeamento de gama quando a gama de destino fornece apenas o intervalo de branco para preto do dispositivo e não há cores possíveis fora dessa gama. É provável que isso aconteça para dispositivos de saída típicos, como impressoras. As cores possíveis são mapeadas para a borda da gama de destino. Mas ele não tem uma curva de tom para o dispositivo de saída. O GMA deve selecionar algum ponto neutro de luminância inferior para usar como um destino de mapeamento para o branco de referência. Um algoritmo sofisticado pode fazer isso histogramando as levezas na imagem de origem e vendo quantos caem no intervalo esperado, mas mais leve que o branco de referência. Quanto mais leveza, mais espaço é necessário no dispositivo de destino entre os pontos mapeados para os realces especular e o branco de referência. Um algoritmo mais simples pode escolher uma distância arbitrária na escala de leveza do dispositivo branco, como 5%. Uma abordagem semelhante se aplica ao mapeamento do máximo preto e preto sombra.
Depois de gerar a curva de tom de destino, você pode mapear em um método semelhante ao usado na Figura 23 anterior. Todos os pontos na curva de tom de destino ficarão dentro da gama do dispositivo, e todos os pontos no mapeamento devem se enquadrar na gama do dispositivo.
Se você inverter as figuras esquerda e direita e as direções das setas na Figura 23, poderá descrever o caso em que a imagem de origem tem apenas uma gama de referência e as três gamas do dispositivo de saída não foram recolhidas umas sobre as outras. Um exemplo disso pode ser o mapeamento de um monitor para scRGB. Novamente, o GMA deve sintetizar os pontos de controle para os cinco pontos na curva de tom para a imagem de origem. Alguns mapeamentos podem colocar todos os pontos da curva de tom dentro da gama do dispositivo scRGB, enquanto outros mapeamentos podem usar mais da gama scRGB mapeando branco difuso para o branco de referência e permitindo que o branco especular seja mapeado para um valor mais leve.
Por fim, você tem o caso em que ambos os dispositivos têm apenas a gama de referência, que é como a maioria dos algoritmos de mapeamento de gama funcionam. Portanto, você pode resolve isso apenas caindo para os algoritmos atuais. Como alternativa, se você tiver uma maneira razoável de determinar os cinco pontos de referência para os dispositivos de origem e destino, poderá organizar o mapeamento dos pontos de referência.
As gamas de dispositivos contêm mais do que os cinco pontos de referência no eixo neutro. Elas representam apenas os limites entre regiões potenciais na imagem. Entre cada um dos pontos de referência, você pode usar qualquer uma das técnicas de mapeamento de gama existentes. Portanto, você pode cortar o intervalo de cores inesperadas e compactar todas as cores entre o branco e o preto esperados, ou você pode cortar todas as cores fora do intervalo de referência e compactar dentro desse intervalo. Há muitas possibilidades, que podem ser implementadas em DIFERENTES GMAs. Além disso, os GMAs podem compactar e cortar de maneiras diferentes. Todas essas combinações são cobertas dentro desta invenção.
Até agora, nesta discussão, a gama foi tratada como se fosse apenas uma função do dispositivo no qual a imagem foi criada, capturada ou exibida. No entanto, não há razão para que todas as imagens de um dispositivo tenham a mesma gama. Os GMAs dependem dos dados no GBD. Se o descritor for alterado entre as imagens, não haverá como os GMAs saberem. Em particular, se as imagens não tiverem realces especulares, os GMAs terão um desempenho melhor se o descritor de gama não mostrar que há cores mais claras do que o branco difuso.
Na nova arquitetura de CTE, é possível usar mais de um GMA. O uso de vários GMAs é inerentemente mal definido. Por exemplo, se um dispositivo de captura associar um GMA à sua "aparência", ele tende a fazê-lo com uma gama de destino "direcionada". O mesmo vale para dispositivos de saída e gamuts de origem "direcionados". A gama sRGB é uma gama implícita normalmente direcionada. Portanto, é altamente recomendável que você use um único GMA, se a previsibilidade for uma prioridade. Um único fluxo de trabalho de GMA deve ser o padrão para todos os fluxos de trabalho, especialmente fluxos de trabalho de consumidor e de prosumer. Embora o mapeamento de gama para reprodução preferencial deva ser feito uma vez, há instâncias em que vários processos de mapeamento são incluídos. Primeiro, para revisão de texto, você faz um mapeamento preferencial para a gama do dispositivo de destino final e, em seguida, uma renderização colorimétrica para a gama do dispositivo de revisão de texto. Em segundo lugar, alguns tipos de mapeamento são usados para alterar as características da imagem, mas não estão incluídos para mapear para uma gama de dispositivos, por exemplo, ajustando a curva de tom ou a cromática. Se vários GMAs forem usados, a interface de transformação usará uma matriz de mapas de gama associados, ou seja, mapas gama que foram inicializados com um par de descrições de limites de gama. Quando há mais de um mapa de gama, o limite de gama de entrada para um mapa de gama bem-sucedido deve ser o mesmo que o limite de gama de saída de seu antecessor.
A função de limite de gama do dispositivo usa o mecanismo de modelo de dispositivo e os parâmetros analíticos e deriva um limite de gama de dispositivo de cores descrito como uma lista de vértice ordenada do casco convexa da gama do dispositivo. A lista de vértice ordenados é armazenada no CIEJab. A estrutura da lista de vértice ordenada é otimizada para aceleração de hardware pelo DirectX. Essa abordagem tem muitas soluções conhecidas (pesquise por "convex hull DirectX" na Web e você obtém mais de 100 ocorrências). Há também uma referência de 1983 sobre este tópico (Teoria e Aplicativo de Computação Gráfica, "Shiphulls, b-spline surfaces and cadcam" pp. 34-49), com referências datadas de 1970 a 1982 sobre o tópico.
Duas técnicas diferentes podem ser usadas para calcular os triângulos no shell de gama. Para outros dispositivos que não sejam dispositivos RGB aditivos, você calcula um casco convexa. Você pode considerar investigar o suporte de casco não convexa para outros dispositivos se tiver acesso direto a esses dispositivos para validar a robustez, o desempenho e a fidelidade dos algoritmos. Esse é um processo conhecido que não requer mais descrição. A técnica usada para dispositivos RGB aditivos é descrita da seguinte maneira.
Diferentes GBDs têm vantagens e desvantagens. A representação convexa do casco garante boas propriedades geométricas, como fatias de matiz convexa que fornecem um ponto de interseção exclusivo com um raio emanando de um ponto no eixo neutro. A desvantagem da representação convexa do casco também é a convexidade. Sabe-se que muitos dispositivos, especificamente dispositivos de exibição, têm gama que estão longe de serem convexas. Se a gama real se desviar significativamente da suposição de convexidade, a representação convexa do casco seria imprecisa, possivelmente na medida em que não representa a realidade.
Depois de adotar um GBD que fornece uma representação razoavelmente precisa da gama real, outros problemas surgem, alguns devido ao próprio conceito de fatia de matiz. Há pelo menos duas situações patológicas. Na Figura 24 a seguir, uma gama CRT dá origem a fatias de matiz com "ilhas". Na Figura 25, uma gama de impressoras dá origem a uma fatia de matiz com parte do eixo neutro ausente. As fatias patológicas de matiz não são causadas por limites gama particularmente patológicos nesses casos. Eles são causados pelo próprio conceito de fatia de matiz, porque (a) é levado ao longo da tonalidade constante, e (b) leva apenas metade do plano que corresponde ao ângulo de matiz.
Figura 24 : um monitor CRT típico tem uma gama que mostra "curvando- se" peculiar nos matizes azuis. Se as fatias de matiz forem tiradas dentro desse intervalo de matiz, as ilhas isoladas poderão aparecer nas fatias de matiz.
Figura 25 : uma impressora pode ter uma gama que tem "lacuna" em seu eixo neutro. Quando uma fatia de matiz é tomada (que é apenas metade do plano), há um "amasso" na parte do limite que é o eixo neutro. Isso pode ser difícil de resolve algoritmos.
Para resolve essas patologias, uma nova estrutura é proposta que abandona o conceito de fatia de matiz usada como ponto de partida. Em vez disso, a estrutura usa o conjunto de "elementos de linha de limite" ou linhas que estão no limite de gama. Eles não fornecem necessariamente uma visualização geométrica coerente, como fatias de matiz, mas dão suporte a todas as operações comuns de gama. Além de resolver os problemas mencionados anteriormente, essa abordagem também sugere que a construção de fatias de matiz, mesmo quando possível, é computacionalmente desperdiçada.
Triangulação do Limite de Gama
O ponto de partida é um GBD que consiste em uma triangulação do limite de gama. Métodos conhecidos de construção de GBDs geralmente fornecem essa triangulação. Para a concreto, um método de construção de GBDs para dispositivos aditivos seu espaço no dispositivo é descrito aqui. Esses dispositivos incluem monitores (baseados em CRT e LCD) e projetores. A geometria simples do cubo permite que você introduza uma rede regular no cubo. As faces de limite do cubo podem ser trianguladas de várias modas, como a mostrada na Figura 26. A arquitetura fornece um modelo de dispositivo para o dispositivo para que os valores colorimétricos dos pontos de rede possam ser obtidos algoritmos ou medidas tenham sido feitas diretamente para esses pontos. A arquitetura também fornece CIECAM02, para que você possa supor que os dados iniciais já foram mapeados para o espaço CIECAM02 Jab. Em seguida, cada ponto de rede nas faces de limite do cubo RGB tem um ponto correspondente no espaço Jab. As conexões de pontos que formam o conjunto de triângulos no espaço RGB também induz um conjunto de triângulos no espaço Jab. Esse conjunto de triângulos forma uma triangulação razoável do limite de gama se (a) a rede no cubo RGB for fina o suficiente e (b) a transformação do espaço do dispositivo para o espaço de cor uniforme for topologicamente bem comportada; ou seja, ele mapeia o limite para o limite e não transforma a gama de dentro para fora para que os pontos internos se tornem pontos de limite.
Figura 26 : um método simples para triangular o limite de gama de um dispositivo com RGB como seu espaço de dispositivo
Elementos de linha de limite
Central para essa estrutura é o conceito de elementos de linha de limite; um conjunto de segmentos de linha que (a) residem no limite de gama e (b) estão em um plano. Nesse caso, o avião é um plano matiz. Cada segmento de linha é o resultado da interseção do plano com um triângulo de limite gama. Embora muitos pesquisadores tenham usado a construção de um plano com triângulos de limite, eles geralmente analisam a relação entre esses segmentos de linha e tentam construir um objeto geométrico coerente a partir dos segmentos de linha. Diferentes algoritmos foram elaborados para seguir esses segmentos de linha um após o outro até que uma fatia de matiz inteira seja obtida, e muitas tentativas foram feitas para acelerar o processo de pesquisa.
Essa abordagem é diferente. Você cruza o plano com os triângulos para obter os segmentos de linha. Em seguida, você considera esses segmentos de linha como os objetos conceituais básicos . É necessário analisar a relação entre os segmentos de linha; você não precisa saber como eles estão interconectados uns com os outros. Esse ponto de vista resolve o problema da fatia de matiz com ilhas. As abordagens conhecidas que tentam construir a fatia de matiz pressupõem que, se começar com um segmento de linha e segui-la para o segmento de próxima linha, e assim por diante; ele eventualmente leva de volta ao ponto de partida, momento em que uma fatia de matiz inteira seria construída. Infelizmente, essa abordagem perderia a ilha (e no pior cenário, o continente). Não insistindo em obter uma imagem geométrica coerente; ou seja, fatia matiz, você pode lidar com o problema da ilha sem esforço. Outra diferença importante nessa abordagem é que, para acelerar a construção de segmentos de linha, ele usa um "filtro de triângulo". O filtro de triângulo gera determinados triângulos que definitivamente não produzirão segmentos de linha que seriam úteis na operação de gama atual. Como a interseção de um triângulo com o plano é cara computacionalmente, isso melhora a velocidade. Um efeito colateral é que você não pode construir uma fatia de matiz porque alguns segmentos de linha estariam ausentes devido à filtragem de triângulo.
Operação gamut: CheckGamut
O exemplo a seguir explicará como a estrutura funciona e como o CheckGamut é realizado, ou seja, a operação de verificar se uma cor está na gama.
A estrutura geral é ilustrada na Figura 27 a seguir. Há vários componentes. Os componentes rotulados em itálico são componentes que podem ser diferentes na implementação, dependendo da operação de gama em questão. Os outros componentes são invariáveis em todas as operações de gama. Para começar, a Entrada é um conjunto de atributos de cor. No caso de CheckGamut, é a cor da consulta. Na Figura 27 e na discussão a seguir, supõe-se que o ângulo de matiz esteja entre os atributos de cor de entrada ou possa ser obtido deles. Esse é claramente o caso se a entrada for o ponto de cor inteiro, seja no Jab ou no JCh, do qual você poderá calcular o ângulo de matiz. Observe que o ângulo de matiz só é necessário porque planos de matiz estão sendo usados. Dependendo da operação de gama em questão, talvez não seja necessário usar o plano matiz. Por exemplo, na construção do CheckGamut de rotina, talvez você queira usar planos de J constante. Essa é uma generalidade que não será usada ou discutida mais adiante; mas pode ser útil lembrar essa flexibilidade da metodologia para dar suporte a outras operações de gama quando o plano matiz pode não ser a melhor opção.
Figura 27 : a estrutura para dar suporte a operações de gama
O ângulo de matiz, que é obtido diretamente das entradas ou calculado a partir das entradas, é usado para inicializar o plano matiz rotulado plano matiz completo na figura. "Cheio" é enfatizado porque este é o plano completo, não apenas o meio plano que contém a tonalidade. O plano completo contém o ângulo de matiz de entrada e o ângulo 180 graus opostos a ele. A principal funcionalidade do plano matiz é a função Intersect, que é explicada na subseção a seguir, Plano matiz completo: Intersect. Suponha que o GBD já tenha sido construído e que o conjunto de Triângulos de Limite de Gama esteja disponível. Intersecione os triângulos que sobreviveram ao Filtro de Triângulo com o plano matiz usando Intersect. O componente Filtro de Triângulo é rotulado em itálico, o que significa que o componente varia de acordo com a implementação para diferentes operações de gama. O Filtro de Triângulo para CheckGamut é explicado na seção Operação gama: CheckGamut (continuação). O resultado da interseção de um triângulo com o plano de matiz é vazio ou um elemento de linha de limite , ou seja, um par de pontos distintos. Se o resultado não estiver vazio, ele será passado para o Processador de Elemento de Linha , que novamente faz coisas diferentes dependendo da operação de gama. O Processador de Elementos de Linha atualiza a estrutura de dados interna, Dados Processados Internos , cujo conteúdo ou layout também depende da operação de gama. Em geral, os Dados Processados Internos contêm a "resposta" para o problema, que é atualizado continuamente com cada novo Elemento de Linha de Limite encontrado. Quando todos os Elementos de Linha de Limite foram processados, a resposta foi encontrada. Ele permanece para acessá-lo por meio do Adaptador de Saída. Como os Dados Processados Internos são específicos da operação de gama, o Adaptador de Saída também é específico da operação de gama.
Plano matiz completo: Intersect
A função Intersect calcula a interseção do plano matiz e um triângulo. Por mais simples que pareça, essa função é importante por dois motivos.
Primeiro, cruzar cada borda do triângulo com o plano pode render três pontos de interseção, uma situação geometricamente impossível. O motivo pelo qual isso pode acontecer na computação é que, quando os cálculos são feitos em ponto flutuante, por exemplo, formato IEEE, há incertezas ou "ruído numérico", em cada etapa que afeta a conclusão de se uma borda cruza o plano. Quando o plano cruza as bordas em uma situação de quase-erro, os pontos de interseção são próximos uns dos outros e a determinação se um ponto de interseção está dentro da borda é aleatório. Embora o ruído nos valores numéricos dos pontos seja pequeno, a conclusão qualitativa de que há mais de dois pontos de interseção é geometricamente impossível e difícil de lidar corretamente no algoritmo.
Em segundo lugar, essa função está no loop crítico para cada borda de cada triângulo filtrado, portanto, é importante otimizar sua eficiência o máximo possível.
Para resolver o primeiro problema de ruído numérico, execute os cálculos em inteiros. Para resolver o segundo problema de otimização de sua eficiência, armazene em cache o atributo mais usado de cada vértice ou o "produto de ponto" associado a cada vértice. Passar para inteiros é uma maneira típica de garantir a consistência geométrica. A ideia básica é que, se você precisar quantificar, faça isso no início. Em seguida, os cálculos subsequentes podem ser executados em inteiros e, se os inteiros forem largos o suficiente para que não haja perigo de estouro, os cálculos poderão ser feitos com precisão infinita. A função de quantização a seguir é útil para essa finalidade.
ScaleAndTruncate(x) = Parte inteira de x*10000
O fator de dimensionamento 10000 significa que o número de ponto flutuante de entrada tem quatro casas decimais, o que é preciso o suficiente para esse aplicativo. Dependendo do intervalo de valores do espaço de aparência de cor, você deseja escolher um tipo inteiro com bits largos o suficiente para manter os cálculos intermediários. Na maioria dos espaços de aparência de cores, o intervalo de cada coordenada está dentro do intervalo -1.000 a 1.000. A coordenada quantizada tem um valor absoluto máximo possível de 1.000*10.000 = 10.000.000. Como você verá, a quantidade intermediária é um produto de ponto, que é uma soma de dois produtos de coordenadas, portanto, tem um valor absoluto máximo possível de 2*(10.000.000) ₂ = 2?10 ₁₄. O número de bits necessários é log ₂ (2?10 ₁₄ ) = 47,51. Uma opção conveniente para o tipo inteiro é, portanto, inteiros de 64 bits.
Para garantir que a interseção de um plano com um triângulo sempre dê um conjunto vazio ou um conjunto de dois pontos, você deve considerar o triângulo como um todo, não como bordas individuais do triângulo separadamente. Para entender a situação geométrica, considere as "distâncias assinadas" dos vértices do triângulo do plano matiz. Não calcule essas distâncias assinadas diretamente; em vez disso, calcule os produtos de ponto dos vetores de posição dos vértices com o vetor normal quantizado para o plano. Mais especificamente, durante a inicialização do plano matiz, o vetor normal quantizado é calculado da seguinte maneira.
NormalVector = (ScaleAndTruncate(-sin(hue)), ScaleAndTruncate(cos(hue)))
Observe que esse vetor é um vetor bidimensional. Você pode usar um vetor bidimensional porque o plano matiz é vertical, portanto, o terceiro componente do vetor normal é sempre zero. Além disso, uma tabela de pesquisa de produtos de ponto é inicializada para ter uma entrada para cada vértice dos Triângulos de Limite de Gama e o produto de ponto correspondente definido como um valor inválido.
Durante uma operação de interseção do plano matiz com um triângulo, o produto de ponto de cada vértice do triângulo é pesquisado. Se o valor na tabela de pesquisa for o valor inválido, o produto de ponto será calculado usando a expressão a seguir.
NormalVector.a*ScaleAndTruncate(vertex.a) + NormalVector.b*ScaleAndTruncate(vertex.b)
Novamente, o componente J do vértice nunca é usado, pois o vetor normal é horizontal. Esse produto de ponto é salvo na tabela de pesquisa para que ele não precise ser calculado novamente se o produto de ponto do vértice for consultado posteriormente.
O cache permite uma determinação rápida de se uma borda cruza o plano, depois que os produtos de ponto são tabulados na tabela de pesquisa, que é criada progressivamente à medida que os vértices são processados.
Figura 28 : cruzando o plano de matiz com um triângulo
Para que o triângulo na Figura 28 intersecione o plano matiz em um segmento de linha não degenerado, os produtos de ponto dos vértices devem estar em um dos padrões a seguir, quando classificados em ordem crescente.
0,0,+; -,0,0; -,0,+; -,-,+; -,+,+
Um ponto final do segmento de linha surge quando o plano é interseccionado por uma borda com vértices que têm sinais diferentes no produto de ponto. Se o sinal for zero, o vértice estará no plano e a interseção da borda com o plano será o próprio vértice. Observe também que os casos 0,0,0; -,-,0; 0,+,+ não são relatados. O primeiro caso (0,0,0) significa que todo o triângulo está no plano. Isso não é relatado porque cada borda do triângulo deve pertencer a um triângulo vizinho que também não está inteiramente no plano. A borda será relatada quando esse triângulo for considerado. Os outros dois casos (-,-,0 e 0,+,+) correspondem à configuração geométrica que o triângulo toca o plano em um vértice. Esses casos não são relatados porque não dão origem a um segmento de linha não degenerado.
O algoritmo anterior determina quando calcular uma interseção entre uma borda do triângulo e o plano de matiz. Depois que uma borda é determinada, a interseção é calculada usando equações paramétricas. Se um dos produtos de ponto for zero, a interseção será o próprio vértice, portanto, nenhum cálculo é necessário. Supondo que ambos os produtos de ponto dos vértices da borda não sejam zero, vértice1 é o vértice com dotProduct1 de ponto negativo ; e vértice2 é o vértice com dotProduct2 de ponto positivo . Essa ordem é importante para garantir que o ponto de interseção calculado não dependa de como a ordenação dos vértices aparece na representação da borda. O conceito geométrico da borda é simétrico em relação aos vértices. O aspecto computacional do uso de equações paramétricas da borda introduz a assimetria (escolha do vértice inicial), que pode dar um ponto de interseção ligeiramente diferente devido ao ruído numérico e ao condicionamento das equações lineares a serem resolvidas. Dito isso, o ponto de interseção, interseção, é fornecido pelo seguinte.
t = dotProduct1/(dotProduct1 - dotProduct2)
Interseção. J = vértice1. J + t * (vértice2. J – vértice1. J)
intersection.a = vértice1.a + t * (vértice2.a - vértice1.a)
intersection.b = vértice1.b + t * (vértice2.b - vértice1.b)
Operação gamut: CheckGamut (continuado)
O algoritmo geométrico básico usado para verificação de gama é contar o número de cruzamentos de raios. Para um determinado ponto de consulta, considere um raio começando com o ponto de consulta e apontando para cima (direção J). Conte o número de vezes que esse raio cruza o limite de gama. Se esse número for par, o ponto de consulta estará fora de gama. Se esse número for estranho, o ponto estará dentro. Em princípio, esse algoritmo pode ser implementado em 3D, geralmente é atormentado por dificuldades causadas por situações degeneradas, como o raio deitado (em parte) em um triângulo de limite ou degeneração dimensional inferior, como o raio deitado (em parte) em uma borda de um triângulo de limite. Mesmo em 2D, você tem que lidar com essas situações degeneradas; mas o problema é mais simples e foi resolvido de maneira satisfatória. Veja [O'Rourke].
Para um determinado ponto de entrada Jab, determine seu ângulo de matiz h da seguinte maneira.
h = atan(b/a),
Inicialize o plano matiz e determine os Elementos de Linha de Limite correspondentes a esse plano de matiz. Como os Elementos de Linha de Limite só serão relevantes se cruzarem o raio para cima, configure um Filtro de Triângulo para remover triângulos que dão elementos de linha que definitivamente não cruzarão o raio para cima. Nesse caso, considere a caixa delimitadora do triângulo. O raio para cima não cruzará o triângulo se o ponto de consulta estiver fora da "sombra" convertida pela caixa delimitadora se uma fonte de luz estiver diretamente acima. Inflar isso ligeiramente com uma tolerância pré-fixa para permitir ruído numérico para que você não jogue fora triângulos inadvertidamente que possam dar elementos de linha úteis. O resultado é o cilindro retangular semi-infinito mostrado na Figura 29. Verificar se o ponto de consulta está dentro ou fora desse cilindro pode ser implementado com eficiência usando desigualdades simples.
Figura 29 : Filtro de triângulo para CheckGamut
CheckGamut tem três componentes específicos da operação de gama: Dados Processados Internos, Processador de Elemento de Linha e Adaptador de Saída. Os Dados Processados Internos são uma lista de elementos de linha que foram processados pelo Processador de Elementos de Linha. Nesse caso, o Processador de Elementos de Linha simplesmente adiciona um elemento de linha à lista. A estrutura de dados interna para Dados Processados Internos pode ser uma lista vinculada ou uma matriz que pode aumentar de tamanho.
O Adaptador de Saída é um módulo que acessa a lista de elementos de linha, determina se um elemento de linha cruza o raio para cima (contagem 1) ou não (contagem 0). Resumir todas essas contagens dá uma contagem total. O Adaptador de Saída gera, em última análise, uma resposta de "sim" (em gama) ou "não" (fora de gama), dependendo se a contagem total é ímpar ou até mesmo. A etapa em que você determina se um elemento de linha cruza o raio para cima merece alguma atenção porque é aqui que surge o problema da degeneração e também surge o problema da contagem excessiva. Seguindo [O'Rourke], para que um elemento de linha cruze o raio, o ponto final direito (o ponto final com croma maior) deve estar estritamente no lado direito do raio. Isso garante que, se um ponto de extremidade estiver exatamente no raio, ele só será contado uma vez. A mesma regra também resolve a situação degenerada em que o elemento de linha está exatamente no raio. Você não incrementa a contagem para este elemento de linha.
A Figura 30 mostra os elementos de linha resultantes de uma gama de exemplo com o ponto de consulta em várias posições.
Figura 30 : como o CheckGamut funciona
Mapeamento mínimo de gama de diferença de cor
O Mapeamento mínimo de gama de diferença de cor, MinDEMap, tem uma especificação simples: se uma cor estiver em gama, não faça nada. Se uma cor estiver fora de gama, projete-a para o ponto "mais próximo" no limite de gama. O palavra-chave "mais próximo" não está bem definido até que você especifique qual equação de diferença de cor usar. Na prática, para tornar a computação mais fácil e rápida, a distância euclidiana do espaço de aparência de cor escolhida ou uma variante dela é usada como a métrica de diferença de cor. A vantagem da métrica euclidiana é que ela é compatível com o produto de ponto do espaço, o que possibilita o uso de álgebra linear. Em detalhes, se um "produto de ponto" for definido no espaço, uma distância poderá ser definida como a raiz quadrada do produto de ponto do vetor de diferença consigo mesmo. Um produto de ponto geralmente pode ser definido por uma matriz 3x3 definida positiva A.
u?v = u T Av
em que o lado direito é a multiplicação de matriz usual. Se A for a matriz de identidade, o produto de ponto padrão será recuperado. Na prática, se Jab for o espaço de cor, você não deseja misturar os componentes, para que uma matriz diagonal diferente da matriz de identidade possa ser usada. Além disso, talvez você queira manter a escala em um e b inalterada para que a medida da matiz seja preservada. Portanto, uma variação útil do produto de ponto Euclidean padrão é a seguinte.
w J (componente J de você)(componente J de v) + (um componente de você)(um componente de v) + (componente b de você)(componente b de v)
em que w J é um número positivo. Outra variação é permitir que w J varie com o ponto de consulta de entrada:
w J\ = w J (queryPoint)
O resultado final é uma medida de distância assimétrica em relação aos dois pontos e com pesos relativos diferentes na leveza e croma ou matiz conforme o ponto de consulta de entrada varia. Isso está de acordo com algumas observações sobre a percepção de cor humana de que as diferenças de cor não são ponderadas igualmente em todas as dimensões. Descobriu-se que as pessoas são menos sensíveis às diferenças de leveza do que às diferenças em matiz e croma.
A função de peso a seguir é útil.
w J = k ₂ - k ₁ (C - C mₐₓ ) n
where k ₂ = 1, k ₁ = 0,75/(C mₐₓ ) n, C mₐₓ = 100, n = 2 e C é o menor de chroma do ponto de consulta e C mₐₓ.
de modo que um peso de 0,25 é colocado no termo J quando chroma é zero, e um peso de 1 quando chroma é 100. A tendência de colocar menos peso em J quando chroma é pequeno e mais peso em J quando chroma é grande segue o uso recomendado para CMC e CIEDE2000.
Figura 31 : a função de peso no componente J da métrica
Use o espaço Jab para o exemplo a seguir. É computacionalmente exigente pesquisar todos os triângulos de limite para determinar o ponto mais próximo na métrica euclidiana. Veja a seguir uma abordagem simples para tornar esse processo o mais eficiente possível, sem introduzir suposições adicionais que possam acelerar o processo, mas também acabar apenas em uma resposta aproximada. Primeiro, é necessário entender o procedimento geométrico de projetar um ponto no triângulo especificado. Uma descrição é fornecida aqui.
Uma projeção ortogonal no plano infinito que contém o triângulo é executada pela primeira vez. A distância mais curta do ponto de consulta do plano pode ser determinada em duas etapas.
(a) Calcule o vetor normal da unidade para o triângulo.
(b) Calcular o produto de ponto do vetor normal da unidade e um vetor formado a partir do ponto de consulta e um ponto no triângulo; ou seja, um de seus vértices. Como o vetor normal tem comprimento de unidade, o valor absoluto desse produto de ponto é a distância do ponto de consulta do plano.
O ponto projetado pode não ser a resposta, pois pode estar fora do triângulo. Portanto, você deve executar um marcar primeiro. O cálculo é equivalente a calcular as coordenadas barycentricas do ponto projetado em relação ao triângulo. Se o ponto projetado for determinado como dentro do triângulo, será a resposta. Caso contrário, o ponto mais próximo é adquirido em uma das bordas do triângulo. Execute uma pesquisa em cada uma das três bordas. Determinar a projeção do ponto de consulta em uma borda é um processo semelhante à projeção no triângulo, mas uma dimensão a menos. Uma projeção ortogonal é calculada pela primeira vez. Se o ponto projetado estiver na borda, será a resposta. Caso contrário, o ponto mais próximo é adquirido em um dos dois pontos de extremidade. Executar uma pesquisa nos dois pontos de extremidade; ou seja, calcule a distância do ponto de consulta de cada um e compare qual deles é menor.
Um exame cuidadoso revela que há muita pesquisa repetida quando você passa por todos os triângulos porque uma borda é sempre compartilhada por dois triângulos e um vértice compartilhado por pelo menos três bordas. Além disso, você não está muito interessado em encontrar o ponto mais próximo de um triângulo específico; em vez disso, você está interessado em encontrar o ponto mais próximo de todo o limite de gama. No entanto, um triângulo específico seria aquele em que isso é alcançado. Há duas estratégias que você pode usar para acelerar a pesquisa.
Estratégia I. Cada vértice será processado, no máximo, uma vez. Cada borda será processada, no máximo, uma vez.
Estratégia II. Em qualquer ponto da pesquisa, você tem um melhor candidato com a melhor distância correspondente. Se você puder determinar, por um marcar rápido, que um triângulo não é capaz de dar uma distância melhor, não há necessidade de continuar ainda mais o cálculo. Você não precisa do ponto e da distância mais próximos para esse triângulo.
Figura 32 : esquemas mínimos de mapeamento de DE
A Figura 32 mostra o fluxo geral de lógica para o mapa de gama MinDEMap. Para um ponto de consulta, a função CheckGamut é invocada pela primeira vez. Se o ponto estiver em jogo, o mapa será não operacional. Se o ponto estiver fora de gama, chame ProjectPointToBoundary. Agora vá para a Figura 33. Neste ponto, supõe-se que os valores a seguir foram calculados.
(a) Vetor normal de unidade para cada Triângulo de Limite gama em relação ao produto de ponto padrão.
(b) Lista de vértice e lista de borda, além da lista de triângulos.
Figura 33 : a rotina ProjectPointToBoundary
Tudo isso é uma sobrecarga constante e teria um custo reduzido se consultas suficientes para esse limite de gama fossem feitas. Normalmente, esse é o caso quando você cria um LUT de transformação de um dispositivo para outro, em que há apenas duas gamas fixas, e o LUT de transformação é executado por pontos na grade de amostra uniforme. Você calcula previamente os vetores normais em relação ao produto de ponto padrão, embora a noção de perpendicularidade seja baseada no produto de ponto ponderado, que depende do ponto de consulta, conforme explicado anteriormente. O motivo é que um vetor normal em relação ao produto de ponto ponderado pode ser obtido facilmente do vetor normal em relação ao produto de ponto padrão. Se n ₀ for um vetor normal em relação ao produto de ponto padrão,
n = (componente J de n ₀ /w J, a-component de n ₀, b-component de n ₀ )
é normal para o triângulo em relação ao produto de ponto ponderado. Devido a essa relação, ainda é benéfico pré-computar n ₀ mesmo que ele precise ser ajustado com base no ponto de consulta.
A rotina ProjectPointToBoundary começa redefinindo o "histórico processado" dos vértices e bordas. Essas são tabelas de sinalizadores BOOLEAN que rastreiam se um vértice ou borda já foi visitado antes. Ele também redefine a variável ShortestDistance para "INFINITY", que é o valor máximo codificado no sistema de números de ponto flutuante usado. Em seguida, ele é executado por um loop, pesquisando o ponto mais próximo de cada triângulo usando a chamada ProcessTriangle. ProcessTriangle é a rotina para atualizar a variável ShortestDistance e está claramente no loop crítico. Uma otimização é parar quando o resultado for bom o suficiente. Após cada chamada para ProcessTriangle, a variável ShortestDistance é examinada. Se ele atender a um limite predefinido, você poderá parar. O limite predefinido depende do espaço de cor usado e da precisão necessária do sistema de imagens de cores. Para um aplicativo típico, você não deseja fazer um trabalho desnecessário se a diferença de cor for menor do que o que pode ser discernido pela visão humana. Para CIECAM02, essa diferença de cor é 1. No entanto, use um valor limite de 0,005 na implementação para preservar a precisão dos cálculos, pois isso pode ser apenas uma etapa intermediária em uma cadeia de transformações.
ProcessTriangle implementa a Estratégia II anterior. Obtendo um vetor normal do vetor normal da unidade pré-computada para o triângulo em relação ao produto de ponto padrão, ele calcula a distância do ponto de consulta para o plano infinito que contém o triângulo formando o produto de ponto do vetor normal da unidade e o queryVector, o vetor de um dos vértices do triângulo, vértice1, para o ponto de consulta, queryPoint.
queryVector = queryPoint - vértice1
distance = | normalVector * queryVector |/|| normalVector||
Esse é um cálculo relativamente barato e a distância é necessária para realizar cálculos adicionais. Se essa distância não for menor que a melhor distância atual, ShortestDistance, esse triângulo não produzirá uma distância melhor, pois não dará uma distância melhor do que o plano que o contém. Nesse caso, você retorna o controle para o loop de triângulo. Se a distância for menor que ShortestDistance, potencialmente, você terá um ponto mais próximo, se esse ponto estiver dentro do triângulo. Você deve executar alguns cálculos "difíceis" (embora nada além da álgebra linear) para determinar isso. Se os outros dois vértices do triângulo forem vértice2 e vértice3, forme os vetores base firstBasisVector e secondBasisVector.
firstBasisVector = vértice2 - vértice1
secondBasisVector = vértice3 - vértice1
Use o sistema linear de equações a seguir para resolver as incógnitas que você e v.
firstBasisVector * queryVector = (firstBasisVector * firstBasisVector)u + (firstBasisVector * secondBasisVector)v
secondBasisVector * queryVector = (secondBasisVector * firstBasisVector)u + (secondBasisVector * secondBasisVector)v
e as condições para que o ponto projetado esteja dentro do triângulo são:
0 ≤ u ≤ 1, 0 ≤ v ≤ 1 e você + v ≤ 1
Após esse cálculo, se for determinado que o ponto projetado está dentro do triângulo, você encontrou um novo ponto mais próximo; a distância calculada no início é a nova distância mais curta. Nesse caso, atualize as variáveis ShortestDistance e ClosestPoint. Se o ponto projetado estiver fora do triângulo, você poderá encontrar um ponto mais próximo em uma de suas bordas. Portanto, você pode chamar a rotina ProcessEdge em cada uma das três bordas.
Figura 34 : rotinas ProcessEdge e ProcessVertex
A rotina ProcessEdge implementa a Estratégia I, ilustrada na Figura 34. ProcessEdge começa verificando se a borda foi processada antes. Nesse caso, nenhuma ação adicional será tomada. Caso contrário, ele passa a calcular a projeção ortogonal do ponto de consulta para a linha infinita que contém a borda. A álgebra linear envolvida no cálculo é semelhante às equações de triângulo anteriores. No entanto, o cálculo é mais simples, não é descrito aqui. Se o ponto projetado estiver dentro da borda, você encontrará a distância do ponto projetado do ponto de consulta. Se essa distância for menor que ShortestDistance, você encontrou um novo ponto mais próximo. Atualize ShortestDistance e ClosestPoint. Se o ponto projetado estiver fora da borda, chame ProcessVertex nos dois pontos de extremidade. Antes de retornar o controle, atualize o histórico de borda para que essa borda seja marcada como "PROCESSADO".
Por fim, você fornece uma descrição de ProcessVertex. A rotina ProjectVertex também implementa a Estratégia I e mantém uma tabela de histórico de vértice. Conforme ilustrado na Figura 34, ele primeiro verifica se o vértice já foi processado antes. Nesse caso, nenhuma ação adicional será tomada. Caso contrário, ele continuará a calcular a distância do vértice do ponto de consulta. Se a distância for menor que ShortestDistance, atualize ShortestDistance e ClosestPoint. No final, ele atualiza o histórico de vértice para que esse vértice seja marcado como "PROCESSADO".
Quando o loop de controle externo tiver esgotado todos os triângulos ou encerrado antes que o limite de diferença de cor seja atingido, a variável ClosestPoint será acessada. Esse é o resultado de MinDEMap. O chamador também pode recuperar ShortestDistance se estiver interessado em quão longe a cor mapeada está da cor da consulta.
Suavização de matiz
Figura 35 : Suavização de Matiz
Surge um problema com operações restritas por matiz; ou seja, a operação considera apenas variáveis dentro de um plano matiz. A Figura 35 mostra um exemplo de uma gama exibindo fatias de matiz "descontinuadas" nos matizes azuis. Dentro desse intervalo de matiz, para determinados ângulos de matiz, o limite de gama é tangencial ao plano matiz. Na verdade, isso causa uma alteração na estrutura topológica das fatias de matiz. No exemplo mostrado, à medida que o plano matiz varre esse intervalo de matiz, uma "ilha" surge e submerge. Essa alteração na topologia fará com que operações específicas do matiz sejam descontinuadas. Por exemplo, a borda em matiz fixa mudará abruptamente à medida que o ângulo de matiz mudar nesse intervalo.
Há uma razão de ciência de cores por que é desejável preservar matiz em determinadas operações. Para resolve o problema anterior, os Triângulos de Limite gama originais devem ser "suavizados por matiz". Em termos gerais, uma suavização matiz de um conjunto de Triângulos de Limite gama é um conjunto de triângulos de modo que (a) ele forma o limite de uma nova "gama", que pode não corresponder à gama de dispositivos real e que contém a gama definida pelo conjunto original de triângulos; e (b) os triângulos no novo conjunto estão limitados a serem paralelos aos planos de matiz.
Uma maneira prática de obter um conjunto suave de triângulos é pegar o casco convexo dos vértices originais. Conforme ilustrado na Figura 35, as fatias de matiz do casco convexo variam suavemente no intervalo de matiz problemático sem uma mudança repentina na topologia.
Definindo primárias e secundárias na descrição do limite de gama
Determinados métodos de mapeamento de gama, como HueMap, dependem da localização dos primários e secundários do dispositivo. Para dispositivos aditivos, as primárias são vermelho, verde e azul (R, G e B); e os secundários são ciano, magenta e amarelo (C, M e Y). Para dispositivos subtrativos, as primárias são C, M e Y; e os secundários são R, G e B. O GBD controla todos os seis valores, além de branco e preto (W e K), em uma matriz de valores de cor Jab. Esses valores são definidos na descrição do limite de gama quando ele é criado. Para dispositivos de saída, as primárias podem ser determinadas executando combinações de valores de controle de dispositivo por meio do modelo de dispositivo. Para dispositivos de captura, essa abordagem não é adequada para criar o GBD de referência, pois é quase impossível capturar uma imagem que produz um valor de dispositivo puro totalmente saturado, como (0,0, 0,0, 1,0). Os perfis de dispositivo WCS contêm os índices das primárias no destino de captura. Como esses valores não estão contidos em um perfil ICC, use valores medidos de um destino de scanner típico após a conversão em Jab, em relação às condições de exibição do ICC.
Definindo o eixo neutro na descrição do limite de gama
Os métodos de mapeamento de gama HueMap e Relative MinCD usam o eixo neutro do dispositivo para endireitar. Para os dispositivos de saída de linha de base, o eixo neutro pode ser determinado executando valores neutros do dispositivo (R=G=B ou C=M=Y) por meio do método DeviceToColorimetric e, em seguida, por meio do método ColorimetricToAppearance do objeto CIECAM02. No entanto, os dispositivos de captura nem sempre retornam um valor neutro do dispositivo quando apresentados com uma amostra neutra. Isso é particularmente verdadeiro quando a iluminação ambiente não é perfeitamente neutra. Os perfis de dispositivo WCS contêm os índices dos exemplos neutros no destino. Use esses exemplos para definir o eixo neutro. Como essas informações não estão disponíveis para perfis ICC, você deve usar o mesmo método usado para dispositivos de saída; execute exemplos neutros do dispositivo por meio do método DeviceToColorimetric e, em seguida, acople os valores de entrada e os resultados colorimétricos.
Tópicos relacionados