2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 двухмерная свертка (2d convolution) на основе дпф (dft)
Сообщение22.12.2014, 14:55 


05/12/14
12
Здравствуйте.

Я хотел бы реализовать двухмерные свертки для работы с изображениями. Ну, например, границы выделять, не суть.

Для понимания - я не имею опыта в таких задачах ВООБЩЕ. Собственно, "решение в лоб" я сделал. После этого я погуглил и обнаружил ускоренный вариант через дискретное преобразование Фурье. Вот оно вкратце:
1) сделать прямое ДПФ на изображении
2) сделать прямое ДПФ на ядре (фильтре)
3) поэлементно перемножить получившиеся комплексные числа
4) на перемноженном - сделать обратное ДПФ
и утверждается, что результат должен быть тот же самый, что и в "наивном" случае. Однако, у меня это не так.
Привожу псведокод C# + AForge.NET:
Код:
//двумерное прямое ДПФ
            FourierTransform.DFT2(
                imgcomplex2d, //изображение в виде массива комплексных чисел с мнимой частью = 0
                FourierTransform.Direction.Forward
                );

//двумерное прямое ДПФ
            FourierTransform.DFT2(
                kcomplex2d, //ядро в виде массива комплексных чисел с мнимой частью = 0
                FourierTransform.Direction.Forward
                );

//перемножаем поэлементно
            for (var x = 0; x < imgcomplex2d.GetLength(0); x++)
            {
                for (var y = 0; y < imgcomplex2d.GetLength(1); y++)
                {
                    imgcomplex2d[x, y] = imgcomplex2d[x, y]*kcomplex2d[x, y];
                }
            }

//обратное преобразование
            FourierTransform.DFT2(
                imgcomplex2d,
                FourierTransform.Direction.Backward
                );


Прошу подсказать. Ситуация в том, что я решаю гораздо более общую задачу, соотв. 2д свертка это очень маленькая часть моей задачи. Поэтому хотелось бы получить подсказку по возможности конкретнее, без архиглубокого погружения в теоремы и суровый матан.
Прошу войти в положение.

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

 Профиль  
                  
 
 Re: двухмерная свертка (2d convolution) на основе дпф (dft)
Сообщение22.12.2014, 16:29 
Аватара пользователя


08/08/14

991
Москва
если обрабатывающее изображение намного меньше обрабатываемого, то фурье не стоит городить, а считать напрямую.

 Профиль  
                  
 
 Re: двухмерная свертка (2d convolution) на основе дпф (dft)
Сообщение22.12.2014, 17:01 
Заслуженный участник


27/04/09
28128
lsoft в сообщении #950715 писал(а):
Однако, у меня это не так.
Не проверяли, будет ли он каким-нибудь из отражений исходного результата, или умноженным на какую-то константу? Так было бы быстрее разобраться, тем более что кода наивного алгоритма свёртки вы не привели, и сравнить никак.

lsoft в сообщении #950715 писал(а):
доп. вопрос: также мне известно, что этот алгоритм требует модификации, если ядро и изображение разных размеров. у меня (пока) для тестов - размер одинаковый. как необходимо изменить алгоритм в случае, если размеры станут разные?
Дополнять ядро нулями до размера изображения. А ещё, говорят, изображение можно резать на куски размером ближе к ядру (и его, скорее всего, дополнять нулями придётся всё равно), но надо будет не забыть потом «склеить» правильно.

Кстати, если у вас исходно была не циклическая свёртка, то можно понять, почему результаты не сошлись. Чтобы получить с помощью Фурье не циклическую, нужно изображение дополнить по краям (распространить крайние строки, или просто нулями, или ещё чем — зависит от задач). И потом от результата эти края, конечно, отрезать.

 Профиль  
                  
 
 Re: двухмерная свертка (2d convolution) на основе дпф (dft)
Сообщение23.12.2014, 17:36 


05/12/14
12
levtsn
Спасибо за совет! Подскажите, на основании чего сделано такое наблюдение? Собственный опыт? Матем. оценка сложности алгоритмов?

arseniiv
Не является отражением и т.п. Я именно дополняю изображение нулями по краями, то есть после свертки итоговый размер такой же.
Прилагаю свой мини-проект: https://www.dropbox.com/s/h3ucbsdoy8tbdet/Do2DConvolution.7z?dl=0 . Буду благодарен за помощь!

Кстати говоря, вот нашел такой документ: http://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CBwQFjAA&url=http%3A%2F%2Fdeveloper.download.nvidia.com%2Fcompute%2Fcuda%2F2_2%2Fsdk%2Fwebsite%2Fprojects%2FconvolutionFFT2D%2Fdoc%2FconvolutionFFT2D.pdf&ei=mH2ZVIvQIcf7ygPTh4LACw&usg=AFQjCNGfO1K1OtP7O9UsNP82qoTclNwD1g&bvm=bv.82001339,d.bGQ&cad=rjt
В нем описываются модификации ядра как раз в случае разных размеров. Но пока глубоко не разбирался с этими модификациями, так как даже с одноразмерными не работает.

 Профиль  
                  
 
 Re: двухмерная свертка (2d convolution) на основе дпф (dft)
Сообщение25.12.2014, 19:16 


05/12/14
12
Все без идей? :)

 Профиль  
                  
 
 Re: двухмерная свертка (2d convolution) на основе дпф (dft)
Сообщение25.12.2014, 21:00 
Аватара пользователя


31/10/08
1244
lsoft в сообщении #952212 писал(а):
Все без идей? :)

Я вам ссылку хотел дать. Обыскал весь интернет, а она куда-то потерялась.
А что ошибку с тем что в одном случае у вас линейная а в другом циклическая свёртка уже исправили?
lsoft в сообщении #950715 писал(а):
и утверждается, что результат должен быть тот же самый, что и в "наивном" случае.

Известно что это справедливо только для 1D случая и то для циклической свёртки. Для 2D ещё и дополнительное условие, изображение должно быть круглым.

 Профиль  
                  
 
 Re: двухмерная свертка (2d convolution) на основе дпф (dft)
Сообщение26.12.2014, 15:56 
Заслуженный участник


27/04/09
28128
Pavia в сообщении #952277 писал(а):
Для 2D ещё и дополнительное условие, изображение должно быть круглым.
:shock: Зачем? Преобразованием Фурье от прямоугольника $m\times n$ чисел будет прямоугольник $m\times n$ чисел.

 Профиль  
                  
 
 Re: двухмерная свертка (2d convolution) на основе дпф (dft)
Сообщение26.12.2014, 20:11 


05/12/14
12
Pavia
Спасибо за ответ. Как я уже сказал выше, я в этой сфере "сверток и фурье" совсем-совсем не разбираюсь. В институте что-то учил 10 лет назад, но все забыл, конечно же.
Поэтому я не понимаю, что значит циклическая и линейная свертка.
Вероятно, чтобы продолжить диалог мне надо будет это найти и понять.
Еще раз спасибо за ответ, разберусь - возможно будут еще вопросы.
(если не лень устроить мне ликбез простыми словами - был бы признателен!)


Друзья!
может у кого есть простой пример в виде с\с++\java программы - поделитесь!

-- 26.12.2014, 23:00 --

Pavia
прочитал про свертки. сделал циклическую. ничего не изменилось.
у меня картинка и ядро размером 3х3 пикселя. и в картинке установлен только один пиксель - центральный. соотв. в данном случае, насколько я разумею, нет разницы между циклической и линейной сверткой. измененный код подтверждает это.
итого: все равно не сходятся значения между наивной сверткой и фурье-сверткой.

Друзья! Вы мне просто ответьте: приведенный алгоритм фурье-свертки правильный? если нет - пожалуйста, дайте правильный алгоритм!

 Профиль  
                  
 
 Re: двухмерная свертка (2d convolution) на основе дпф (dft)
Сообщение01.01.2015, 17:41 
Аватара пользователя


08/08/14

991
Москва
а побольше не пробовали?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

Сейчас этот форум просматривают: mihaild


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group