У меня есть изображение, 2D-массив uint8_ts.Я хочу изменить размер изображения, используя отдельный фильтр.Попробуйте уменьшить ширину в первую очередь.Поскольку исходный и целевой размеры не связаны, мы будем использовать различный набор коэффициентов для каждого целевого пикселя.Для определенного размера in & out для всех y у нас может быть:
out(500, y) = in(673, y) * 12 + in(674, y) * 63 + in(675, y) * 25
out(501, y) = in(674, y) * 27 + in(675, y) * 58 + in(676, y) * 15
Как я могу использовать Eigen, чтобы ускорить это, например, векторизовать его для меня?Это можно выразить как умножение матрицы на разреженную матрицу размера in_width * out_width, где в каждой строке только 3 из значений in_width отличны от нуля.В случае фактического использования от 4 до 8, как правило, будут отличны от нуля.Но эти ненулевые значения будут смежными, и было бы неплохо использовать SSE или что-то еще, чтобы ускорить его.
Обратите внимание, что исходная матрица имеет 8-битные скаляры.Окончательный результат, после масштабирования и ширины и высоты будет 8 бит.Было бы неплохо, чтобы промежуточная матрица (изображение) и фильтр были более точными, скажем, 16 бит.Но даже если они умножены на 8 бит, при умножении нам нужно взять самые значимые биты продукта, а не наименее значимые.
Неужели это слишком далеко от Eigen?Этот вид свертки с ядром, которое отличается в каждом пикселе (только потому, что выходной размер не является целым кратным входного размера), кажется достаточно распространенным.