Сосредоточение внимания на том, как выполнять битовые операции, отвлекает. Только то, как вы выполняете эти операции, потому что вы без необходимости обрабатываете один и тот же пиксель снова и снова.
Вы вызываете медианный фильтр для каждого пикселя три раза, и вы получаете несколько пикселей вокруг пикселя на пиксель . Это означает, что вы выполняете всю эту битовую работу для одного и того же пикселя несколько раз. У вас есть for
петли, вложенные в четыре глубины!
Если ваш радиус равен 5, вы обрабатываете 121 пиксель. Затем вы перемещаетесь вниз на единицу и снова обрабатываете 121 пиксель, и вы уже преобразовали все, кроме 11 из них! Вы делаете то же самое для каждого пикселя вниз, затем перемещаетесь вправо на один пиксель. Для радиуса пять вы делаете на два порядка больше конверсий rgb, сколько вам нужно.
Я бы посоветовал сохранить ваше изображение или преобразовать его в отдельные массивы красного, синего и зеленого цветов first .
Если радиус велик, вы можете сохранить красную, синюю и зеленую суммы при перемещении, вычитая пиксели сверху и добавляя пиксели снизу при сканировании растрового изображения, но это может код на ощупь сложнее. Добавите ли вы код для дальнейшей оптимизации, зависит от ваших требований.
Кроме того, у вас есть куча мелочей, которые можно оптимизировать. Я не уверен, заботится ли о них компилятор или нет. Например, вы могли бы сделать некоторое снижение прочности. Вам не нужно умножения в строках, которые вычисляют neighbors
, destOffset
, rOffset
или kOffset
. Дополнение - это все, что вам нужно, если вы немного реорганизуете код.