Задать вопрос

Как оптимизировать алгоритм поворота изображения на угол, кратный 90 гр?

Есть изображение в виде массива данных размером w х h. Алгоритм должен поворачивать изображение на угол 90, -90 и 180 градусов.

Для таких углов синусы и косинусы вырождаются в простой алгоритм, например, для 90 градусов:
new_w = h;
new_h = w;
for (int i = 0; i < h; i++)
{
    for (int j = 0; j < w; j++)
    {
        dest[j * new_w + new_w - i - 1] = source[i * w + j];
    }
}

Скорость такого копирования в 4-5 раз меньше скорости копирования без поворота. Причина, скорее всего, в непоследовательном доступе к памяти при записи в dest: запись идет по элементам, отстоящих друг от друга на размер строки изображения.
Кто знает способы ускорения случайного доступа к памяти?
  • Вопрос задан
  • 3269 просмотров
Подписаться 5 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Интернет-маркетолог с нуля до PRO
    4 месяца
    Далее
  • Digital Skills Academy
    Mini-MBA: Интернет-маркетолог
    4 месяца
    Далее
  • Rush Academy
    Нейросети для SEO
    1 месяц
    Далее
Пригласить эксперта
Ответы на вопрос 1
@encyclopedist
Эта задача хоть и не полностью идентична, но похожа на задачу о траспонированиии матрицы, и к ней применимы те же методы оптимизации. Для улучшения доступа к памяти можно разбивать на блоки.

Посмотрите этот ответ на StackOverflow, особенно два метода в самом конце:
stackoverflow.com/a/16743203

Ещё можете глянуть вот эту статью в википедии: In-place matrix transposition
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы