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, Супермодераторы



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

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


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

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