Двухмерное преобразование Фурье

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Двухмерное преобразование Фурье

Сообщение Santik » 03 мар 2016, 09:21

Рассмотрим сначала одномерный случай.
Пусть 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: Двухмерное преобразование Фурье

Сообщение Santik » 03 мар 2016, 09:27

Прямое 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
Обратное 2D Преобразование Фурье:

Код: Выделить всё

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: Двухмерное преобразование Фурье

Сообщение Santik » 04 мар 2016, 11:44

Прежде чем приступить к обработке, необходимо "вытащить" информацию из файла картинки. Проще всего использовать bmp- файлы. Структура файла приведена здесь: http://c-site.h1.ru/infa/bmp_struct.htm

Как превратить 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: Двухмерное преобразование Фурье

Сообщение Santik » 04 мар 2016, 17:33

Итак исходная картинка:
01.JPG
01.JPG (5.49 КБ) 5419 просмотров
Картинка, переведена массив в 256 градаций серого и выведена в Surfer8:
101.jpg
Качество, конечно низкое, т.к. в Surfer8 не удалось подобрать соответствующую шкалу.
Но на этом этапе это не критично, так как файл A(x,y) мы получили и теперь можем его подвергнуть 2D преобразованию Фурье :D

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: Двухмерное преобразование Фурье

Сообщение Santik » 06 мар 2016, 20:30

Обрежем исходную картинку до размера 132х132 и выполним прямое и обратное БПФ
102.jpg
Рис.1 - исходная картинка.
Рис.2 -логарифм модуля двухмерного преобразования Фурье
Рис.3 - восстановленная картинка

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: Двухмерное преобразование Фурье

Сообщение Santik » 07 мар 2016, 18:55

Теперь с помощью функции взаимной корреляции найдём координаты фрагмента изображения.
В середине - исходная картинка 132х132. Справа вверху - фрагмент картинки 56х56 (дополнен нулями до 132х132)
Внизу - функция взаимной корреляции.
103.jpg
Полезная ссылка: http://forum.algolist.ru/algorithm-imag ... m-bpf.html

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: Двухмерное преобразование Фурье

Сообщение Santik » 28 мар 2016, 20:04

Поворот изображения на 180 градусов.
01_180град.jpg
01_180град.jpg (38.82 КБ) 5362 просмотра

Код: Выделить всё

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: Двухмерное преобразование Фурье

Сообщение Santik » 30 мар 2016, 09:10

Иногда удобнее всё же работать с цветной картинкой. Но надо делать двумерное преобразование Фурье для каждого цвета. Продолжим делать элементарные преобразования над двумерной матрицей коэффициентов Фурье.

Код: Выделить всё

	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)
Исходная картинка:
01.JPG
01.JPG (4.25 КБ) 5351 просмотр
Преобразованная (отзеркаливание и поворот на 90 градусов по часовой стрелке):
000001.JPG
000001.JPG (4.3 КБ) 5351 просмотр

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: Двухмерное преобразование Фурье

Сообщение Santik » 31 мар 2016, 06:12

Дальнейшие тренировки за неимением кошек будем проводить на колонках :D
Простой поворот на 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)
колонок132.JPG
колонок132.JPG (4.25 КБ) 5347 просмотров
000003Re.JPG
000003Re.JPG (4.63 КБ) 5347 просмотров

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: Двухмерное преобразование Фурье

Сообщение Santik » 31 мар 2016, 08:34

А вот такое преобразование

Код: Выделить всё

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
даёт "отзеркаливание" картинки и поворот на 90 градусов против часовой стрелки.
000004Re.JPG
000004Re.JPG (4.61 КБ) 5344 просмотра

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей