Введение. На чем я работаю.
Привет всем! Я работаю над алгоритмом Demosaicing, который я использую для преобразования изображений с шаблоном Bayer в изображения, представляющие красный, зеленый и синий каналы. Я хочу, чтобы алгоритм имел следующие свойства:
-
Он сохраняет как можно больше необработанной информации.
-
Он не скрывает детали изображения, даже если это означает отсутствие шумоподавления.
- Он производит как можно меньше артефактов.
- Если размер мозаичного изображения равен N x N, три цветных изображения должны иметь размер N/2 x N/2.
- Алгоритм должен быть быстрым. Чтобы "быстро" перейти в контекст, позвольте мне сказать следующее: я соглашусь на то, что по крайней мере в два раза быстрее, чем алгоритм OpenCV, который использует билинейную интерполяцию.
То, что я достиг до сих пор.
До сих пор я придумал алгоритм, который использует билинейную интерполяцию и создает три изображения с половинным размером изображения мозаики. Алгоритм приблизительно в 3-4 раза быстрее, чем алгоритм OpenCV cvtColor, который выполняет преобразование CV_BayerBG2BGR (билинейная интерполяция).
См. эскиз шаблона Bayer ниже, чтобы получить представление о том, как он работает. Я выполняю интерполяцию в точках, отмеченных кружками. Цифры представляют коэффициенты, по которым множится множитель, лежащий в основе, чтобы получить интерполированное значение в точке, отмеченной черным кругом.
Ниже вы можете увидеть результаты моего алгоритма. Я также добавил результаты обоих алгоритмов демозаизации, доступных в OpenCV (билинейная интерполяция и переменное число градиентов). Обратите внимание, что хотя результаты моего алгоритма выглядят очень плохо в сравнении, результаты билинейной интерполяции OpenCV выглядят почти точно так же, если я их уменьшаю. Это, конечно, ожидается, так как основной алгоритм один и тот же.
... так наконец: вопрос.
Мое текущее решение дает приемлемые результаты для моего проекта, и это также приемлемо быстро. Тем не менее, я бы хотел использовать алгоритм с удвоением медленности, если это приведет к улучшению любого из 5 критериев, перечисленных выше. Тогда возникает вопрос: как улучшить мой алгоритм без существенного снижения производительности?
У меня достаточно опыта программирования для этой задачи, поэтому я специально не прошу фрагменты кода - приветствуются ответы любого рода (код, ссылки, предложения, особенно те, которые основаны на прошлом опыте).
Дополнительная информация:
- Я работаю на С++.
- Алгоритм сильно оптимизирован, он использует инструкции SSE и непараллелен.
- Я работаю с большими изображениями (размером несколько МБ); кэш-осведомленность и избежание нескольких проходов через изображение очень важны.
Я не ищу общий совет по программированию (например, оптимизацию вообще и т.д.), но, с другой стороны, некоторые ответы на конкретные задачи более чем приветствуются. Заранее благодарю вас.