CIAreaHistogram inputScale factor

м создание приложения, которое используетCIAreaHistogram Основной фильтр изображений. Я используюinputCount значение (количество сегментов) 10 для тестирования иinputScale значение 1.

Я получаюCIImage для самой гистограммы, которую я затем запускаю через собственное ядро (см. конец поста), чтобы установить альфа-значения в 1 (поскольку в противном случае альфа-значение из вычислений гистограммы предварительно умножается), а затем преобразовать его в.NSBitmapImageRep

Затем я сканирую изображение "s буферизует и печатает значения RGB (пропуская альфа-значения). Однако, когда я делаю это, сумма значений R, G и B по 10 не обязательно составляет 255.

Например, с полностью черным изображением я применяю гистограмму, затем собственное ядро и получаю следующий вывод:

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

Это, как я и ожидал, так как все пиксели черные, поэтому все находится в первом ведре. Однако, если я запускаю тот же алгоритм с цветным изображением, я получаю следующее:

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

Сложите значения для R, G и B - они неt сложить до 255. Это вызывает проблемы, потому что мне нужно сравнить две из этих гистограмм, и мой алгоритм ожидает, что суммы будут между 0 и 255. Я, очевидно, мог бы масштабировать эти значения, но я хочу избежать этого дополнительного шага по соображениям производительности ,

Я заметил еще кое-что интересное, что может дать некоторое представление о том, почему это происходит. В моем собственном ядре я просто установил значение альфа на 1. Я попробовал второе ядро (см. Конец поста), которое устанавливает все пиксели в красный цвет. Очевидно, что зеленые и синие значения равны нулю. Тем не менее, я получаю этот результат при проверке значений из точечного рисунка:

RGB: 255 43 25

Но я просто установил G и B на ноль! Это кажется частью проблемы, которая указывает на управление цветом. Но поскольку я явно устанавливаю значения в ядре,Только один блок кода, где это может происходить - преобразование в NSBitmapImageRep из CIImage из фильтра:

NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:kernelOutput];
unsigned char *buf = [bitmapRep bitmapData];

Как только я установил пиксели в RGB 255 0 0, затем выполнил эти строки, затем прочитал буфер, все значения RGB равны 255 43 25. Далее я попытался установить цветовое пространство исходного CGImageRef, на котором основан весь рабочий процесс:kCGColorSpaceGenericRGB, думая, что цветовой профиль может проходить, но безрезультатно.

Может кто-нибудь сказать мне, почемуCIFilter Ядро будет вести себя таким образом, и как я мог бы решить это?

Как упоминалось ранее, здесь приведены копии функций ядра CIFilter, которые я использую. Во-первых, тот, который устанавливает альфа в 1:

kernel vec4 adjustHistogram(sampler src)
{
    vec4 pix = sample(src, destCoord());
    pix.a = 1.0;
    return pix;
}

И затем тот, который устанавливает все пиксели в RGB 255 0 0, но заканчивает 255 43 25, как только он преобразуется в:NSBitmapImageRep

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;
}

Заранее спасибо за помощь.

Ответы на вопрос(1)

Ваш ответ на вопрос