Двухмерное преобразование Фурье
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Двухмерное преобразование Фурье
Рассмотрим сначала одномерный случай.
Пусть x(t), y(t) две действительные функции.
Можно представить представить комплексную функцию f(t)=x(t)+i y(t)
Обозначив F(W) преобразование Фурье функции f(t),получим:
X(W)=[F(W)+F*(N-W)]/2
Y(W)=[F(W)-F*(N-W)]/(2i)
А можно ли аналогично поступить в двухмерном случае?
Пусть x(t), y(t) две действительные функции.
Можно представить представить комплексную функцию f(t)=x(t)+i y(t)
Обозначив F(W) преобразование Фурье функции f(t),получим:
X(W)=[F(W)+F*(N-W)]/2
Y(W)=[F(W)-F*(N-W)]/(2i)
А можно ли аналогично поступить в двухмерном случае?
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Двухмерное преобразование Фурье
Прямое 2D Преобразование Фурье:
Обратное 2D Преобразование Фурье:
Код: Выделить всё
subroutine FFTF_2D(N,M,U,UFFT)
use IMSL
integer*4 i,j,n
double complex , dimension (256,256) :: U,UFFT
double complex , dimension (256) :: XK,YK
do j=1,M
do i=1,N
XK(i)=U(i,j) ! по строкам
end do
call DFFTCF(n,XK,YK)
do i=1,N
UFFT(i,j)=YK(i)
end do
end do ! UX(i,j)
do i=1,N
do j=1,M
XK(j)=UFFT(i,j)
end do
call DFFTCF(M,XK,YK)
do j=1,M
UFFT(i,j)=YK(j)
end do
end do
return
end
Код: Выделить всё
subroutine FFTB_2D(N,M,U,UFFT)
use IMSL
integer*4 i,j,n
double complex , dimension (256,256) :: U,UFFT,UX,UY
double complex , dimension (256) :: XK,YK
do j=1,M
do i=1,N
XK(i)=U(i,j) ! по строкам
end do
call DFFTCB(N,XK,YK)
do i=1,N
UFFT(i,j)=YK(i)
end do
end do ! UX(i,j)
do i=1,n
do j=1,M
XK(j)=UFFT(i,j)
end do
call DFFTCB(M,XK,YK)
do j=1,M
UFFT(i,j)=YK(j)
end do
end do
return
end
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Двухмерное преобразование Фурье
Прежде чем приступить к обработке, необходимо "вытащить" информацию из файла картинки. Проще всего использовать bmp- файлы. Структура файла приведена здесь: http://c-site.h1.ru/infa/bmp_struct.htm
Как превратить RGB в градации серого написано здесь: http://www.cyberforum.ru/csharp-beginne ... 01822.html
Как превратить RGB в градации серого написано здесь: http://www.cyberforum.ru/csharp-beginne ... 01822.html
...согласно стандарту BT.709 интенсивность пикселя может быть вычислена следующим образом: Y = 0.2125·R + 0.7154·G + 0.0721·B. Соответственно, если для каждого пикселя значение каждой из его компонент заменить на вычисленную интенсивность, получится изображение в оттенках серого в цветовой модели RGB.
... и не забывайте про то, что все значения, большие 255, должны становиться равными 255.
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Двухмерное преобразование Фурье
Итак исходная картинка:
Но на этом этапе это не критично, так как файл A(x,y) мы получили и теперь можем его подвергнуть 2D преобразованию Фурье
Картинка, переведена массив в 256 градаций серого и выведена в Surfer8:
Качество, конечно низкое, т.к. в Surfer8 не удалось подобрать соответствующую шкалу.Но на этом этапе это не критично, так как файл A(x,y) мы получили и теперь можем его подвергнуть 2D преобразованию Фурье
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Двухмерное преобразование Фурье
Обрежем исходную картинку до размера 132х132 и выполним прямое и обратное БПФ
Рис.2 -логарифм модуля двухмерного преобразования Фурье
Рис.3 - восстановленная картинка
Рис.1 - исходная картинка.Рис.2 -логарифм модуля двухмерного преобразования Фурье
Рис.3 - восстановленная картинка
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Двухмерное преобразование Фурье
Теперь с помощью функции взаимной корреляции найдём координаты фрагмента изображения.
В середине - исходная картинка 132х132. Справа вверху - фрагмент картинки 56х56 (дополнен нулями до 132х132)
Внизу - функция взаимной корреляции. Полезная ссылка: http://forum.algolist.ru/algorithm-imag ... m-bpf.html
В середине - исходная картинка 132х132. Справа вверху - фрагмент картинки 56х56 (дополнен нулями до 132х132)
Внизу - функция взаимной корреляции. Полезная ссылка: http://forum.algolist.ru/algorithm-imag ... m-bpf.html
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Двухмерное преобразование Фурье
Поворот изображения на 180 градусов.
Литература:
https://habrahabr.ru/post/265781/
http://www.liralab.it/teaching/SINA_10/ ... -paper.pdf
Код: Выделить всё
W1=Width
H1=Height
call FFTF_2D(H1,W1,U,UFFT)
do k=1,H1
do i=1,W1
UFFT3(i,k)=UFFT(W1-i+1,H1-k+1)
end do
end do
call FFTB_2D(H1,W1,UFFT3,U3)
https://habrahabr.ru/post/265781/
http://www.liralab.it/teaching/SINA_10/ ... -paper.pdf
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Двухмерное преобразование Фурье
Иногда удобнее всё же работать с цветной картинкой. Но надо делать двумерное преобразование Фурье для каждого цвета. Продолжим делать элементарные преобразования над двумерной матрицей коэффициентов Фурье.
Исходная картинка:
Преобразованная (отзеркаливание и поворот на 90 градусов по часовой стрелке):
Код: Выделить всё
W1=Width
H1=Height
call FFTF_2D(H1,W1,UR,UFFTR)
call FFTF_2D(H1,W1,UG,UFFTG)
call FFTF_2D(H1,W1,UB,UFFTB)
do k=1,H1
do i=1,W1
UFFT1R(i,k)=UFFTR(k,i)
UFFT1G(i,k)=UFFTG(k,i)
UFFT1B(i,k)=UFFTB(k,i)
end do
end do
call FFTB_2D(H1,W1,UFFT1R,UR)
call FFTB_2D(H1,W1,UFFT1G,UG)
call FFTB_2D(H1,W1,UFFT1B,UB)
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Двухмерное преобразование Фурье
Дальнейшие тренировки за неимением кошек будем проводить на колонках
Простой поворот на 180 градусов
Простой поворот на 180 градусов
Код: Выделить всё
W1=Width
H1=Height
call FFTF_2D(H1,W1,UR,UFFTR)
call FFTF_2D(H1,W1,UG,UFFTG)
call FFTF_2D(H1,W1,UB,UFFTB)
do k=1,H1
do i=1,W1
UFFT1R(i,k)=DCONJG(UFFTR(i,k)) !DCONJG - функция комплексного сопряжения
UFFT1G(i,k)=DCONJG(UFFTG(i,k))
UFFT1B(i,k)=DCONJG(UFFTB(i,k))
end do
end do
call FFTB_2D(H1,W1,UFFT1R,UR)
call FFTB_2D(H1,W1,UFFT1G,UG)
call FFTB_2D(H1,W1,UFFT1B,UB)
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Двухмерное преобразование Фурье
А вот такое преобразование
даёт "отзеркаливание" картинки и поворот на 90 градусов против часовой стрелки.
Код: Выделить всё
do k=1,H1
do i=1,W1
UFFT1R(i,k)=DCONJG(UFFTR(k,i)) !DCONJG - функция комплексного сопряжения
UFFT1G(i,k)=DCONJG(UFFTG(k,i))
UFFT1B(i,k)=DCONJG(UFFTB(k,i))
end do
end do