В документах для рутинных правил ядра сказано: «Программа ядра вычисляет выходной пиксель, используя обратное отображение обратно к соответствующим пикселям входных изображений. Хотя вы можете выразить большинство вычислений пикселей таким образом - более естественно, чем другие, - есть некоторые операции обработки изображений, для которых это сложно, если не невозможно. Например, вычисление гистограммы сложно описать как обратное сопоставление с исходным изображением ».Как написать гистограммный фильтр ядра для CoreImage?
Однако, яблоко, очевидно, делает это как-то потому, что у них есть CIAreaHistogram Core Image Filter, который делает именно это.
Я вижу один теоретический способ сделать это с заданными ограничениями:
Допустим, вы хотите 256 элементов гистограммы красно-канала ...
У вас есть 256x1 выходного пикселя изображения. Функция ядра вызывается для каждого из этих 256 пикселей. Функция ядра должна была бы читать КАЖДЫЙ ПИКСЕЛ В ПОЛНОМ ИЗОБРАЖЕНИИ каждый раз, когда его вызывали, проверяя, соответствует ли это красное значение этого пикселя этому ведру и увеличивает счетчик. Когда он обрабатывает каждый пиксель во всем изображении для этого выходного пикселя, он делит на общее количество пикселей и устанавливает значение выходного пикселя для этого расчетного значения. Проблема заключается в том, что, предположив, что это действительно работает, это ужасно неэффективно, поскольку каждый входной пиксель обращается 256 раз, хотя каждый выходной пиксель записывается только один раз.
Что было бы оптимальным, было бы ядром для итерации по каждому пикселю INPUT, и давайте обновим любой из выходных пикселей на основе этого значения. Тогда входные пикселы будут считываться только один раз, а выходные пикселы будут считываться и записываться в общей сложности (ширина ввода) x (высота входа) в целом.
Кто-нибудь знает какой-либо способ заставить этот фильтр работать? Очевидно, есть фильтр, доступный из яблока для выполнения гистограммы, но мне нужно это для более ограниченной формы гистограммы. (Например, синяя гистограмма ограничена образцами, которые имеют красное значение в заданном диапазоне.)