Полосовой фильтр FFT-изображения. (Как алгоритм полосового фильтра ImageJ) - PullRequest
2 голосов
/ 05 апреля 2010

Мне нужна хорошая функция, которая реализована в программе Java: ImageJ. Мне нужно понять алгоритм, используемый там. Функция имеет несколько параметров: текст ссылки

А перед использованием FFT он конвертирует изображение в специальное: Полосовой фильтр использует специальный алгоритм для уменьшения краевых артефактов (перед преобразованием Фурье изображение увеличивается в размере за счет прикрепления зеркальных копий частей изображения вне исходного изображения, поэтому на краях не происходит скачков)

Можете ли вы рассказать мне больше об этом специальном преобразовании? Собственно мозаичное зеркальное изображение.

Я пишу на C ++ и хочу переписать эту часть программы на C ++.

EDIT1: Мне нужно понять, как это работает с мозаичным изображением, может быть, оно особенное. На самом деле сначала он преобразует изображение в изображение нового размера, поэтому для моих изображений это будет: преобразование изображения размером от 600х480 до 1024х1024. Как здесь используется плитка?

EDIT2: Также трудно понять это описание функции tileMirrored:

Помещает ImageProcessor (ROI) в новый ImageProcessor размером ширина x высота y в позиции (x, y). Изображение зеркально отражается по краям, чтобы избежать эффектов FFT. Что подразумевается под "... размера ширина x высота y в позиции (x, y)."?

EDIT3: Я реализовал этот полосовой фильтр, и он дает те же результаты, что и оригинальная программа. Но сам алгоритм в оригинальной программе (также в моей программе) очень медленный Я хочу использовать этот фильтр не один раз в моей программе, но он рассчитывает примерно 0,5-2 секунды на каждый вызов (в зависимости от значения параметра). Там используется преобразование FHT (не FFT), это быстрее, чем FFT? Я думаю, что сам фильтр не оптимизирован, см. Реализацию функции filterLargeSmall: исходный код

1 Ответ

1 голос
/ 05 апреля 2010

Я не знаю точно, как работает эта функция, но вот основной алгоритм для аналогичной функции:

  1. Определите наименьшую степень двух (назовите ее newSize), которая большечем большее из двух измерений изображения (назовите их xSize & ySize).

  2. Создайте новое квадратное изображение размера newSize с помощью newSize и скопируйте содержимое изображения в центрнового изображения (т. е. верхний левый угол изображения должен начинаться с (newSize / 2 - xSize / 2, newSize / 2 - ySize / 2)).

  3. Заполните оставшиеся пиксели следующим образом для каждого пикселя с (x, y):

    • , если x < (newSize / 2 - xSize / 2), скопировать пиксель в столбец (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x и строку y.
    • , если y < (newSize / 2 - ySize / 2), скопировать пиксель в строку (newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y и столбец x.
    • , если оба вышеприведенных значения верны, скопируйте пиксель в столбец (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x, строку (newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y.
    • , если x > (newSize / 2 + xSize / 2), скопируйте пиксель в столбец (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x и строкуy.
    • если y > (newSize / 2 + ySize / 2), скопируйте пиксель в строке (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y и столбце x.
    • , если оба приведенных выше факта верны, скопируйте пиксель в столбце (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x и строка (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y.

Возможно, есть библиотеки, которые упростят эту задачу (т.е.перелистывание и копирование данных изображений), но я не знаком с C ++, и это должно быть довольно просто для самостоятельного кодирования, если производительность не является большой проблемой.Будьте осторожны с проблемами округления для изображений с нечетными размерами: убедитесь, что они согласованы.

...