Bandpact Filter из FFT прикладного изображения. (Как ALGORITH MILLED BANDPAPS ImageJ)

StackOverflow https://stackoverflow.com/questions/2579444

Вопрос

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

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

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

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

Редактировать1: Мне нужно понять, как он делает то, что оно делает операцию зеркального изображения, может быть, это особенная. На самом деле сначала он преобразует изображение на новое размещение изображения, поэтому для моих изображений будет: конвертация от 600x480 до 1024x1024 размером изображения. Как здесь используется плитка?

Редактировать2: Также трудно понять это описание Tilemirred функций:

Укладывает ImageProcessor (ROI) в новый образ процессора шириной размеров х высота Y в положении (x, y). Изображение отражается вокруг его краев, чтобы избежать обертывания влияния FFT. Что подразумевается под «... по размеру ширина х высота Y в положении (X, Y)».?

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

Это было полезно?

Решение

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

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

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

  3. Заполните оставшиеся пиксели следующим образом, для каждого пикселя AT (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 и столбец х.
    • Если оба из вышеперечисленных верны, скопируйте пиксель в столбце (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 и столбец х.
    • Если оба из вышеперечисленных верны, скопируйте пиксель в столбце (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x и строка (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top