2016-07-22 1 views
0

В документах для рутинных правил ядра сказано: «Программа ядра вычисляет выходной пиксель, используя обратное отображение обратно к соответствующим пикселям входных изображений. Хотя вы можете выразить большинство вычислений пикселей таким образом - более естественно, чем другие, - есть некоторые операции обработки изображений, для которых это сложно, если не невозможно. Например, вычисление гистограммы сложно описать как обратное сопоставление с исходным изображением ».Как написать гистограммный фильтр ядра для CoreImage?

Однако, яблоко, очевидно, делает это как-то потому, что у них есть CIAreaHistogram Core Image Filter, который делает именно это.

Я вижу один теоретический способ сделать это с заданными ограничениями:

Допустим, вы хотите 256 элементов гистограммы красно-канала ...

У вас есть 256x1 выходного пикселя изображения. Функция ядра вызывается для каждого из этих 256 пикселей. Функция ядра должна была бы читать КАЖДЫЙ ПИКСЕЛ В ПОЛНОМ ИЗОБРАЖЕНИИ каждый раз, когда его вызывали, проверяя, соответствует ли это красное значение этого пикселя этому ведру и увеличивает счетчик. Когда он обрабатывает каждый пиксель во всем изображении для этого выходного пикселя, он делит на общее количество пикселей и устанавливает значение выходного пикселя для этого расчетного значения. Проблема заключается в том, что, предположив, что это действительно работает, это ужасно неэффективно, поскольку каждый входной пиксель обращается 256 раз, хотя каждый выходной пиксель записывается только один раз.

Что было бы оптимальным, было бы ядром для итерации по каждому пикселю INPUT, и давайте обновим любой из выходных пикселей на основе этого значения. Тогда входные пикселы будут считываться только один раз, а выходные пикселы будут считываться и записываться в общей сложности (ширина ввода) x (высота входа) в целом.

Кто-нибудь знает какой-либо способ заставить этот фильтр работать? Очевидно, есть фильтр, доступный из яблока для выполнения гистограммы, но мне нужно это для более ограниченной формы гистограммы. (Например, синяя гистограмма ограничена образцами, которые имеют красное значение в заданном диапазоне.)

ответ

1

Проблема заключается в том, что пользовательский код ядра в Core Image работает как функция, которая переставляет пиксель за пикселем. На самом деле у вас не хватает информации, кроме пикселя, который вы сейчас используете. Фильтр персонализированных основного вида идет как этого

for i in 1 ... image.width 
    for j in 1 ... image.height 
     New_Image[i][j] = CustomKernel(Current_Image[i][j]) 
    end 
end 

Так на самом деле, это не совсем правдоподобно, чтобы сделать свою собственную гистограмму с помощью пользовательских ядер, потому что вы в буквальном смысле не имеете никакого контроля над новым имиджем, кроме как в этом CustomKernel которая была выполнена. Это на самом деле одна из причин, по которой CIImageProcessor был создан для iOS10, вам, вероятно, было бы легче сделать гистограмму с помощью этой функции (а также произвести другие интересные эффекты при обработке изображений), и я предлагаю проверить видео WWDC 2016 на нем (Сырые изображения и сеанс живых изображений).

IIRC, если вы действительно хотите сделать гистограмму, это все еще возможно, но вам придется работать с версией UIImage, а затем преобразовать полученный образ в образ RBG, для которого вы можете делать подсчет, и храня их в бункерах. Я бы порекомендовал книгу Саймона Гладмана об этом, так как у него есть глава, посвященная гистограммам, но есть гораздо больше, что входит в стандартную версию изображения по умолчанию, потому что у них есть БОЛЬШЕ больше контроля над изображением, чем мы используем фреймворк.

Смежные вопросы