CIAreaHistograma de entradaFactor de escala
Estoy construyendo una aplicación que usa elCIAreaHistogram
Filtro de imagen del núcleo. Yo uso uninputCount
valor (número de cubos) de 10 para la prueba, y uninputScale
valor de 1.
Me sale elCIImage
para el histograma en sí, que luego ejecuto a través de un kernel personalizado (ver el final de la publicación) para establecer los valores alfa en 1 (ya que de lo contrario el valor alfa de los cálculos del histograma se premultiplica) y luego lo convierto en unNSBitmapImageRep
.
Luego escaneo a través del búfer del representante de imagen e imprimo los valores RGB (omitiendo los valores alfa). Sin embargo, cuando hago esto, la suma de los valores R, G y B en los 10 no necesariamente suman 255.
Por ejemplo, con una imagen completamente negra, aplico el histograma, luego el kernel personalizado y obtengo la siguiente salida:
RGB: 255 255 255
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
Esto es lo que espero, ya que todos los píxeles son negros, así que todo está en el primer cubo. Sin embargo, si ejecuto el mismo algoritmo con una imagen en color, obtengo lo siguiente:
RGB: 98 76 81
RGB: 164 97 87
RGB: 136 161 69
RGB: 100 156 135
RGB: 80 85 185
RGB: 43 34 45
RGB: 31 19 8
RGB: 19 7 3
RGB: 12 5 2
RGB: 16 11 11
Sume los valores de R, G y B; no suman 255. Esto causa problemas porque necesito comparar dos de estos histogramas, y mi algoritmo espera que las sumas estén entre 0 y 255. Obviamente, podría escale estos valores, pero quiero evitar ese paso adicional por razones de rendimiento.
Noté algo más interesante que podría dar alguna pista de por qué esto está sucediendo. En mi kernel personalizado, simplemente establezco el valor alfa en 1. Probé un segundo kernel (ver el final de la publicación) que establece todos los píxeles en rojo. Claramente, los valores verde y azul son cero. Sin embargo, obtengo este resultado al verificar los valores del representante de mapa de bits:
RGB: 255 43 25
¡Pero acabo de poner G y B a cero! Esto parece ser parte del problema, lo que indica la gestión del color. Pero como establecí explícitamente los valores en el kernel, solo hay un bloque de código donde esto puede suceder: la conversión a un NSBitmapImageRep desde el CIImage desde el filtro:
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:kernelOutput];
unsigned char *buf = [bitmapRep bitmapData];
Una vez que establezco los píxeles en RGB 255 0 0, luego ejecuto esas líneas, luego leo el búfer, los valores RGB son todos 255 43 25. Además, he intentado configurar el espacio de color del CGImageRef original en el que se basa todo el flujo de trabajokCGColorSpaceGenericRGB
, pensando que el perfil de color puede estar pasando a través, pero en vano.
¿Alguien puede decirme por qué unCIFilter
El kernel se comportaría de esta manera, ¿y cómo podría resolverlo?
Como se mencionó anteriormente, aquí hay copias de las funciones del núcleo de CIFilter que utilizo. Primero, el que pone alfa a 1:
kernel vec4 adjustHistogram(sampler src)
{
vec4 pix = sample(src, destCoord());
pix.a = 1.0;
return pix;
}
Y a continuación, el que establece todos los píxeles en RGB 255 0 0, pero que termina 255 43 25 una vez que se convierte enNSBitmapImageRep
:
kernel vec4 adjustHistogram(sampler src)
{
vec4 pix = sample(src, destCoord());
pix.r = 1.0; pix.g = 0.0; pix.b = 0.0;
pix.a = 1.0;
return pix;
}
Gracias de antemano por tu ayuda.