Обработка изображений. Часть 1.

Эта статья написана для людей, которые хорошо знают что такое БПФ, знают как с его помощью отфильтровать сигнал, вычислить функцию взаимной корреляции в одномерном случае, но испытывают определённые трудности в переносе этих алгоритмов в 2D.
Цикл статей будет посвящен обработке изображений с помощью двумерного быстрого преобразования Фурье.
Будут рассмотрены вопросы корреляции, фильтрации и элементарных преобразованиях изображений (масштабирование, поворот).

Прямое двумерное преобразование Фурье.
Двумерное преобразование очень просто получить делая обычное одномерное FFT сначала по строкам исходной матрицы, а потом по столбцам.
Программа прямого и обратного 2D FFT написана но Фортране. Использует кошерную библиотеку IMSL для вызова одномерного прямого/обратного одномерного комплексного FFT.
Претензии любителей Си, Дельфи, PHP и 1С-бухгалтерия — не принимаются!
Специально для любителей Дельфи отмечу, что применение Фортрановской библиотеки IMSL может дать прирост производительности до 15%
N,M — размерность входной матрицы изображения
U — входная матрица (комплексная)
UFFT — преобразование Фурье входной матрицы (комплексная матрица)

subroutine FFTF_2D(N,M,U,UFFT)
use IMSL
integer*4 i,j,N,M
double complex , dimension (512,512) :: U,UFFT
double complex , dimension (512) :: 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				
	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,M
double complex , dimension (512,512) :: U,UFFT
double complex , dimension (512) :: 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			
	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


Программа настолько элементарна, что не было смысла искать аналог в учебниках или на просторах Интернета.
Некоторое преимущество (в моём понимании): программа на Фортране легко переводится на любой язык. Надо только помнить, что индексы в Фортране начинаются с 1. :)
Естественно, в собственной реализации можно использовать любую, нравящуюся Вам, программу одномерного комплексного FFT.
Для простоты будем использовать информацию из цветных (8 бит на цвет) *.bmp — файлов.
Но никто не мешает Вам получить изображение с оптической мыши, как описано в здесь.
Или использовать для «тупых» приложений, типа «Аналитическое продолжение карты силы тяжести на земной поверхности в верхнее полупространство на высоту 16 км с помощью двумерного преобразования Фурье».
Мы на первом этапе, по совету классиков, будем тренироваться на кошках колонках. :-)

Возьмём обычный *.bmp — файл. Структура файла описана здесь.
Использовать файлы будем цветные 24 бита (1 байт на цвет). При желании можно превратить их в градации серого:
Y= 0.0721*B+ 0.7154*G+0.2125*R
Сделаем двумерное преобразование Фурье над каждым цветом:

	W1=132    !Width
	H1=132    !Height	
	call FFTF_2D(H1,W1,UR,UFFTR)
	call FFTF_2D(H1,W1,UG,UFFTG)
	call FFTF_2D(H1,W1,UB,UFFTB)

UR,UG,UB — комплексные матрицы R,G,B. В действительной части- информация о цвете из *.bmp — файла. Мнимая часть =0.
Нужно каждое значение выходных матриц комплексного спектра UFFTR, UFFTG, UFFTB разделить на Width*Height
Вот так выглядит модуль двумерного спектра:

Если сделать обратное двумерное БПФ

	call FFTB_2D(H1,W1,UFFTR,UR)
	call FFTB_2D(H1,W1,UFFTG,UG)
	call FFTB_2D(H1,W1,UFFTB,UB)

в действительной части выходных массивов UR,UG,UB будет информация о соответствующем цвете. Округлив это значение до байта можно создать новый *.bmp — файл полностью совпадающий с исходным.
Вот теперь самое интересное :-)
Делая элементарные преобразования комплексных матриц UFFTR, UFFTG, 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

После обратного двумерного преобразования Фурье массивов UFFT1R, UFFT1G, UFFT1B получим картинку:

Картинка отзеркалилась и повернулась на 90° против часовой стрелки.
Как можно видеть цвет отдельных пикселей исказился. Дело в том, что после обратного 2D FFT цвета (после округления в 1 байт) не всегда будут лежать в диапазоне 0-255. Могут появиться значения -1 или 256. Но это легко компенсировать :-)
Поворот на произвольный угол:

Масштабирование.
Очень полезная статья о масштабировании здесь.
К сожалению там не упоминается напрямую метод с использование 2D FFT.
Пример уменьшения картинки в 2 раза методом обрезания высокочастотных составляющих двумерного спектра:

Литература:
habrahabr.ru/post/265781/
www.liralab.it/teaching/SINA_10/slides-current/fourier-mellin-paper.pdf
ru.dsplib.org/forum/viewtopic.php?t=6423
habrahabr.ru/post/243285/
istina.msu.ru/media/dissertations/dissertation/db5/db8/10278509/Pavelieva_dissertation.pdf
  • +7
  • 02 апреля 2016, 10:12
  • Santik

Комментарии (71)

RSS свернуть / развернуть
Интересует мнение Сообщества о возможности создания измерительных приборов на основе оптической мыши. Например компаса или инклинометра :-)
+1
Добавил картинку модуля двумерного спектра.
0
Не совсем понял идею. Вы хотите использовать датчик от мыши в качестве камеры, которая «смотрит» на стрелку компаса и определяет ее положение?
0
Да.
0
Думаю, идея вполне жизнеспособна.

Но какие Вы видите плюсы в сравнении с использованием MEMS датчиков? ИМХО, для компаса и инклинометра проще взять соответствующие готовые датчики.
0
Статья плохая — школоло и «дебилы» не понимае и не одобряе.

Даже я нихуя не понял: Как же мы узнаем угол θ поворота суслика имея два разных его bmp? Тема не раскрыта.



P/S Куда приносить Нобелевскую премию?
-1
Даже я нихуя не понял...
Цель первой части статьи — показать
школоло
, что 2D-Фурье вещь совсем не страшная. Легко получается если исходную матрицу подвергнуть обычному одномерному Фурье сначала по строкам, а потом по столбцам.
Причём меня совершенно не интересует из какого пакета вы возьмёте программу одномерного Фурье. Берите, какую Вам удобно!
В части 2 я собирался рассказать про 2D корреляцию, которая тоже мало чем отличается от одномерной. 2D корреляции уже позволит искать в картинке заданный фрагмент. Более сложная задача — когда фрагмент не просто вырезан из исходной картинки, а имеет свой масштаб и угол наклона решается поворотом картинки, её масштабированием и корреляцией. В общем случае надо находить максимум функции взаимной корреляции ФВК(масштаб, угол поворота)
0
Вот это будет очень интересно почитать!
0
Тема интересная, хотелось бы сравнительный анализ. Поворот с двумерным БПФ и без него, также про масштабирование и корреляцию. Есть датчики достаточно дешевые для компаса и инклинометра.
0
Однократный поворот на заданный угол конечно и без двумерного БПФ можно сделать. А если неоднократный поворот + неоднократное масштабирование + корреляция на каждом шаге (как в системах распознавания текста), то выигрыш с БПФ будет существенен.
0
Для распознавания лучше подходят векторные методы (инвариантные к масштабу и повороту). А вот панораму собрать из кусочков, тут может пригодиться.
0
Что-то повернутого кота слегка в цветах покорежило. Почему?

По поводу измерительных приборов из мыши — один мой друг(с) придумал прикрутить этот датчик к коптеру для контроля перемещения при отсутствии GPS (например, внутри помещений). Пока на уровне мыслей.
0
Что-то повернутого кота слегка в цветах покорежило. Почему?
Есть такое дело :) Это не совсем корректно переход сделан от вещественного к целому без знака. Ну может ещё шумы преобразования сказались. Появилась градация 2.556Е+02 которая при переводе в байт даёт 0.
Можно для коптера измеритель скорости Vx, Vy попытаться сделать. Но для пересчета скорости смещения картинки в реальную скорость объекта нужно значение высоты.
Или даже можно смещение измерять. Смещение наверное даже лучше, чем гироскоп.
0
В сети достаточно много информации о оптических датчиках для коптеров. В том числе и о применении датчиков от мышки, например вот. Идея интересная, но на практике там не все так просто. В отличии от мышки, коптер летает с поворотами по всем трем осям и на разной высоте.
0
Да, и маленький наклон будет показывать оптическому сенсору большое перемещение, тем большее, чем больше высота. Поэтому нужно связывать все датчики вместе, но вот алгоритм этого взаимодействия только предстоит придумать.

Хотя для помещения, где есть ограничение по высоте, может и подойдет. Еще пару дальномеров сверху и снизу добавить ))))
0
Тогда надо сенсор «подвешивать». Но всё равно с его раскачиванием придется бороться.
0
Для простых случаев (летаем низко и над ровным полом) особых проблем быть не должно. Я делал стабилизацию положения через камеру (коптер зависал над светодиодом и удерживал позицию, «гонялся» за пятном от лазерной указки).

У меня была другая идея — разместить на коптере лазурную указку с насадкой, чтобы она проецировала на пол окружность. А потом анализировать то, что видит камера, выделить окружность и проанализировать. Диаметр окружности будет пропорционален высоте, при наклоне окружность будет вытягиваться в эллипс, можно попробовать рассчитать и высоту и угол наклона…
0
Окружность… А четырёх опорных точек будет недостаточно?
0
Достаточно для анализа.

Просто пример с окружностью мне кажется более наглядным для пояснения идеи «на пальцах».
0
Плюс, если поверхность, на которую мы «светим» не является плоскостью, мы получим не эллипс или окружность а некую замкнутую кривую произвольной формы. На основании этого мы можем временно исключить оптический датчик из расчетов высоты и углов. А с четырьмя точками так сделать не получится.
0
А еще проекция окружности красиво смотрится и уже давно стоит на вооружении у НЛО


(хотя не все знают, что данный конус используется для определения высоты и углов крена и тангажа).

:)
+2
совершенно непонятно для кого и под что это написано (имею ввиду кусок кода).
далее, когда пишите статьи то не стоит писать вот так:
разразиться статьёй
да ещё и с троеточиями в конце — это сразу как бы намекает на качество и отбивает охоту читать дальше.

Для полноты картины добавлю что есть libFFTW (она, правда, не на фортране, но, думаю, биндинги есть), которая оптимизирована почти для всего и для разных размерностей. Кроме того, она умеет комплексные и действительные, чётные и нечётные преобразования. Ещё в документации libFFTW написано про переход от комплексных к действительным и чётным-нечётным, что очень полезно начинающим поклонникам дедушки Фурье, хотя, БПФ придумал ещё Эйлер задолго до него.
0
совершенно непонятно для кого и под что это написано (имею ввиду кусок кода).
Написано для начинающих, а не для крутых спецов, как Вы.
далее, когда пишите статьи то не стоит писать вот так:
Отбивает охоту читать — не читайте. Здесь свободный Форум :-)
БПФ придумал ещё Эйлер задолго до него.
Это бред!
БПФ придумали только в середине 20 века.
0
В 1965 году два МНС-а (PhD) Кули и Тьюки (Cooley & Tukey) из IBM опубликовали коротенькую (4 стр.) статью «An algorithm for the machine calculation of complex Fourier series», в которой описали алгоритм БПФ (FFT). Ну т.е. подбросили говна на вентилятор, после чего и начался ошеломительно бурный чес всей этой темы.
0
охохо. введите history of FFT.
есть куча статей про то как Кули и Тьюки просто повторно изобрели колесо, которым пользовались чуть ли не начиная с Эйлера. Кроме него там засветились и Гаусс и другие светила математики.

Да чего там, вот в вики уже это есть оказывается.

Просто эти 2 парня придумали это в нужное время и годно применили.
0
Мы все тоже гуглили и читали педевикию, но с Гауссом и прочими — там не все так ясно.

Гаусс, ваще, был странный интроверт с раздутым ЧСВ(которое, впрочем, он заслужил). Кучу чего он якобы знал или догадывался об этом, оставил некие наброски-каракули в записных книжках, но не публиковал в уже оформленном и читабельном виде, т.е. со стандартным доказательством. Эдакий типичный математик — человек-калькулятор математических формул и теорем.

Известная история с неевклидовой геометрией. Когда вундеркинд Янош Бойяи отправил ему свою работу, тот только ухмыльнулся: Хе-хе, я давно уже это все знал (что на самом деле в окружающием нас мире нет прямых линий, а все кривое, т.е. закругленное) и доказал. Тоже самое он сказал и Лобачевскому, хотя вроде бы и похвалил его искренне за его работу. Но СВОИХ РАБОТ ТО ОН НЕ ПУБЛИКОВАЛ — да так, это хуйня все — можно на салфеточке за завтраком набросать. Хорошо, что все эти «салфеточки» и записные книжки с его каракулями сохранили его пунктуальные родственники.

Математики того времени видимо испытывали дикий баттхерт или просто религиозный благовейный ужас, общаясь с Гауссом: Да что он себе позволяет, этот охуевший с мега-раздутым ЧСВ старикашка! А может быть он и на самом деле Бог, т.к. только Бог знает математическое устройство мироздания и все его законы в самом простом и полном их виде, а не мою частичную интерпретацию их некой части с какого-то одного боку?
0
Здесь еще надо добавить, что с какого-то времени (с первой половины XIX века) тупую прусскую немчуру торкнуло, что надо усиленно защищать и пиарить своих национальных гениев.

Ну, как это делали англичане, иезуитски затроллив «подлого плагиатора» Лейбница, который «все спиздил» у Великого Гения всея Британского народа Исаака Ньютона.

Нищеброда Гаусса поставил на неплохое довольствие какой-то местный курфюрст, хотя до этого тот же бедняга Эйлер нахуй не нужный никому в Пруссии 28! лет прогастарбайствовал в Российской Академии Наук (в детстве я видел марку почты СССР: «Леонард Эйлер — великий русский математик» !!!).

В XX и XXI веке весь этот тупой националистический пиар Гаусса а-ля «Самолет Можайского»(из деревянной лодки и с паровым двигателем!, КАРЛ!) успешно продолжился. Те самые записные книжки с каракулями изрядно в этом помогли, т.е. на основании их Гаусса можно было выдвинуть в пионеры многих разделов математики, задвинув при этом тех, кто опубликовал конкретные научные работы.

Кто-то где-то юзал частные случаи и варианты похожие на БПФ для каких-то своих узких целей, даже возможно и не понимая полностью к чему он может приблизится в итоге. Но 2 чувака описали КОНКРЕТНЫЙ и ОБЩИЙ алгоритм БПФ на 4-х страницах — бери и юзай, говнокодируй на здоровье. Можно даже алгоритмически и изменить кое-что, оттюнинговать, когда know-how и основная суть алгоритма уже ясны и показаны тебе.
0
чего вы так на Гаусса то.
0
ну, читателя надо уважать. а то получается как бы «я тут у вас в форуме насрал разразился статьёй, не нравится — уе6Ь! вай не читай»
-1
«я тут у вас в форуме насрал разразился статьёй, не нравится — уе6Ь! вай не читай»

Именно таким принципом ВПОЛНЕ ДОПУСТИМО руководствоваться, если человек хранит статью в личном блоге, но не сует его НАГЛО и САМОУВЕРЕННО сразу же в тематический.

P/S Это ж всего-лишь бложек в инторнете — выпей чайку, bro.
0
Вы путаете математическое понятие преобразования Фурье и собственно технику эффективного численного выполнения этого преобразования в дискретном случае — ПБФ.
0
нет, именно БПФ.
лет 15 уж у меня кругом БПФ, так что, уж точно не путаю :)
0
fftw3 FTW!

Самописный FFT на фортране? Вы серьёзно?
0
О, да! Меня всегда смущает, когда люди пишут обучающие статьи. Рассказывают там про всякие разные алгоритмы, их применение, прочую фигню… Кнут – так тот ваще три тома наструячил про эти ваши алгоритмы …

Ведь всем понятно, чтобы сделать ХХХ нужно просто выкачать libХХХ.so и вызвать метод justDoIT(); Зачем вникать в суть, если есть готовая libХХХ.so?
+1
Кнут – так тот ваще три тома наструячил про эти ваши алгоритмы …
3.5 даже.
0
Простите, но я в вашей статье не увидел никакого обучения тому, что такое FFT, как оно устроено, какие есть конкретные алгоритмы (например, как обходиться с простыми размерами). Вы учите как FFT можно применять для обработки изображений — прекрасно. Про собственно FFT вы тут не учите ничему. И зачем в такой ситуации шлёпать сомнительного качества реализацию на, буем честны, в ембеддед, мало кем используемом языке програмимрования без единого комментария — не ясно.

В libfftw3.so нет никаких методов justDoIT(), тем более связанных с обработкой изображений. Но уж если вы хотите рассказать людям про применение FFT — то лучше начать с двух слов об state-of-art реализации, а не показывать без комментариев совершенно бесполезный код из учебника.

Ссылаться в рамках основательности и фундаментальности этой статьи на Кнута — это такое предеёргивание, что у меня просто нет слов.
0
мало кем используемом языке програмимрования

Математики, статистики и геофизики юзали и юзают FORTRAN, они занимаются более высокими вещами: им не надо дергать GPIO PIN5 PORTA, калькулировать барыгам остатки/баланс/трафик/бабло или проверять какие кнопки тыкает юзер в очередном новом GUI. Счастливые, блаженные люди.
0
А вы не цитируйте фигурно, не надо. Я этого ещё в FIDO наелся — фигурная резка по квоте. Там было «в ембеддед».

Ну и вот это ваше слово — барыги — ясно говорит, что нам с вами не о чем разговаривать, мы живём в разных мирах.
+1
Предполагалось, что читатель хорошо знает, что такое
FFT, как оно устроено,
для одномерного случая и знает как для одномерного случая вычислить при помощи FFT функцию взаимной корреляции. Но испытывает определённые затруднения при переносе этих алгоритмов в 2D. Показано, как сделать 2D — Фурье на основе подпрограммы одномерного FFT. Про
сомнительного качества реализацию на… мало кем используемом языке программирования
я даже спорить не буду. Это типа «Фортрана не читал, но осуждаю!» :-).
0
Я-то как раз фортран читал :) А так же я читал промышленный код FFT, который используется например теми, кто занимается физикой плазмы. Нет, он не похож, на то, что написано в этой статье :)

Про малоиспользуемый язык — я специально сделал оговорку про ембеддед.

Но, да, в своём первом комментарии я был слишком краток а потом, возможно, слишком резок в формулировках. Прошу прощения.
0
А так же я читал промышленный код FFT, который используется например теми, кто занимается физикой плазмы.
Вот интересно было бы посмотреть на этот хитрый код, который делает одномерное FFT сначала по строкам, а потом по столбцам :)
Возможно код который Вы видели предназначен для параллельных вычислений. А здесь всё тупо и элементарно! Одномерное FFT из библиотеки IMSL.
0
НО ВЕДЬ НИ ДЛЯ КОГО НЕ СЕКРЕТ ЧТО БОЛЬШИНСТВО КОДА НА ЗЕМЛЕ НАПИСАНО НА КОБОЛЕ!!!
0
Вы ошибаетесь, я не автор статьи.

Просто я не понимаю зачем в статьях где автор хочет что-то рассказать, поделится опытом люди пишут комментарии «а зачем это все, если есть готовое, которое можно просто взять/купить»

Именно так я понял Вше высказывание
fftw3 FTW! 

Потом, в комментариях ниже, Вы дали уже более обоснованную критику статьи, с которой я частично согласен.
+2
Т.е. я что хочу сказать.

Тут можно идти двумя путями. Можно писать статью про БПФ. Его историю (нет, не со статьи Кули и Тьюки, а раньше), развитие, очевидные примеры для степени двойки (с разобранным примером простого, понятного кода без хитростей и оптимизаций), всякие сложные случае (элегантнейший алгоритм Радера для случая простой рзамерности!), и зверкшить коротким рассказом о том как устроена та самая fftw3, которая тоже превосходный пример остроумного кода, пользы кодогенерации и метапрограммирования и вообще одна из жемчужин инженерного программирования. Я не видел таких подробных и хороших статей на русском, кстати. Было бы полезно несомненно.

Или можно рассказывать о малоизвестных ПРИЛОЖЕНИЯХ БПФ. Например, для обработки двумерных изображений. На каждом углу пишут про КИХ-фильтр через БПФ, например, а вот хороший рассказ о применении БПФ бОльшей размерности — тоже редкость.

Эта же статья представляет собой ни то ни сё. Зачем-то приведён непрокомментированный но при этом совершенно учебный код на фортране, зачем-то упомянуто получение изображений с оптической мышки, показан пример поворота изображения на 90 градусов (что вовсе и не поворот даже а транспонирование матрицы по сути), ни сказано какой выигрыш тут даёт БПФ (никакого! Матрицу транспонировать всё равно пришлось плюс два БПФ!), поворот на произвольный угол записан в общем виде, но, учитывая что до этого были исключительно матрицы (т.е. целочисленные координаты) — непонятно как его сюда приткнуть (нет, я-то знаю как повернуть картинку на произвольный угол), и, опять же зачем здесь БПФ?

Так о чём эта статья, которая нужна так же, как фундаментальные труды Кнута?
0
Эта же статья представляет собой ни то ни сё.
В какой-то степени согласен. Действительно полезные приложения (2D корреляция) планировались во 2 части.
Зачем-то приведён непрокомментированный но при этом совершенно учебный код на фортране
Код настолько учебный, что в комментариях не нуждается :-)
Есть такое понятие «быстрый старт». Эта статья написана для людей, которые хорошо знают что такое БПФ, знают как с его помощью вычислить функцию взаимной корреляции в одномерном случае, но испытывают определённые трудности в переносе этих алгоритмов в 2D.
0
Эта статья написана для людей, которые хорошо знают что такое БПФ, знают как с его помощью вычислить функцию взаимной корреляции в одномерном случае, но испытывают определённые трудности в переносе этих алгоритмов в 2D.
С этого стоит начинать статью, в порядке предисловия. Меньше непоняток в комментах будет.
0
fftw3 FTW!

«Модные господа»

Встречаются два хабра-мена — говнокодеры корпоративного финансового ПО. Один, как бы невзначай роняет: Э-э, STM32 вот… Другой, совершенно не вздрогнув, но нарочито лениво: Вот думаю FFT на F407…
0
Что вы вообще несёте? Какой хабр? Какое финансовое ПО? Я вообще реалтайм-данным занимаюсь и их обработкой. Без FFT, это да, данные не те, к которым преобразование Фурье осмысленно применять.

А FFT на F407 отлично работает, кстати ;-)
0
Ну и да, прежде чем кидаться словами типа «говнокодер» было бы не плохо давать ссылку на свой гитхаб.
+1
Извините, что я случайно наступил на Ваше ЧСВ. Но это просто такое, чисто обиходное название профессии/работы. Вот если бы здесь кто третий показал свой некий конкретный код, ну уж совсем который ни в какие ворота, вот тогда, да! Вы бы сказали: Да это же говнокод натуральный! И я бы тоже согласился: Да-а, несомненно, — вот это настоящий говнокод!

Но что я, обычный человек, увижу такого в Вашем (т.е. человека среднего ума из среднего класса) гитхабе такого, чего я еще не видел?
0
Я немного не понял — почему всё пропадает, если отредактируешь свою статью…
Короче — всем спасибо за обсуждение.Многих я искренне не понял. Но учту все замечания в окончательной редакции перед высылкой темы в «коллективные».
Может быть и прав well-men2000, что такие статьи ещё рано запускать даже для «крутых» эмбедерщиков? :-)
0
Я понимаю людей, которые возмущаются выложенной программой. Добавлю только от себя — это универсальная реализация. Естественно — при обработке изображений на фига двойная точность FFT? Но надо понимать, что программа писалась совсем не для обработки 8-битных (на цвет) изображений :-)
Это всё для «тупых» приложений, типа «Аналитическое продолжение карты силы тяжести на земной поверхности в верхнее полупространство на высоту 16 км с помощью двумерного преобразования Фурье». А обработка изображений — это некий «побочный продукт».
И никакие вопли «крутых эмбедорщиков» во внимание приниматься (почти) не будут.
Отмазки:
1. Это мой личный блог. Хочу «кошечек» вклеиваю, но мне ближе колонки.
2. Надеюсь на нашу молодёжь. Мне лично переход к 2D — дался с трудом.(Чисто морально). Хотя отличия, как выяснилось — минимальные!
0
Но что я, обычный человек, увижу такого в Вашем (т.е. человека среднего ума из среднего класса) гитхабе такого, чего я еще не видел?
А вы свой покажите. Что бы человек среднего ума поучился у вас, гения из дворян. Вы так легко ярлыки вешаете. Впрочем, всё про ваше дворянство понятно выше. Мы и правда из разных миров.
0
Мне нечего показать сильно интеллектуального — я не занимаюсь созданием новых языков программирования и прорывных технологий в информатике, не изобретаю новые простые или быстрые алгоритмические решения математических задач, как это делали Брезенхем или эти же Cooley & Tukey.

Я просто утилитарно конструирую — компоную уже готовое, известное и давно открытое (в документации и software_packs к продуктам и популярным проектам, да просто в инторнете — этого всего навалом). Т.е. просто занимаюсь copy-paste :DDD

По некоторым причинам (корыстным и общегуманистичным) я не испражняюсь (если конечно за это не заплатят) в СЕТЬ своим говнокодом куда-нить в Bitbucket или github по каждому случаю. Чего и Вам желаю :DDD

«Все метим мы в Наполеоны — двуногих тварей миллионы.»
Ремесленник (простой человек, как я, или среднего ума, как Вы) должен кайлить, выдавать на гора валовой продукт, зарабатывать на хлеб насущный!
0
Well-man2000, от тебя только короткая фраза нужна — поддерживаешь — или нет подобные статьи на этой площадке.
0
Конечно поддерживаю!

Но их же всегда можно дописать или довести до ума, т.е. до уровня понимаемости среднестатистического посетителя этого pop-сайта (а главное молодежи). Здесь не должно быть так, как бывает у математиков — Перельман доказал теорему, доказательство которой понимают во всем мире не более 3-5 человек, и которые в свою очередь в течении 5 лет занимались доказательством того, что это доказательство верное, а сабж достоин куля с зеленью.
0
Santik, не надо падать духом!

Так бывает, что написав статью, особенно вумную(т.е. не для средних умов) или о чем-то новом и нестандартном пока, можно заметить, что под ней нет шквала восторженных комментариев, заинтересованных вопросов и поздравлений (это вполне понятно, т.к. большинство просто, возможно, не поняли ее). В этот момент может появится неприятное чувство — что-то начнет зудеть в голове — это ЧСВ. Fuck ЧСВ! Придави его нахрен, от него нет никакой пользы — только одно расстройство :D
0
По некоторым причинам (корыстным и общегуманистичным) я не испражняюсь (если конечно за это не заплатят) в СЕТЬ своим говнокодом куда-нить в Bitbucket или github по каждому случаю.

Эх, старый дружище well-man2000 , а может Вам вообще завязать с испражнениями в сеть?

Просто у меня сложилось такое впечатление, что испражняетесь вы исключительно на данном ресурсе. При этом из Вас «выходят» исключительно комментарии с сомнительным юмором и (неожиданно!) со ссылками на фрагменты экранизации Ильфа и Петрова.

Мне кажется, уж лучше бы Вы свой код публиковали по всяким Bitbucket или github … Это бы больше отвечало «общегуманистичным» принципам.
Сугубо ИМХО :)
+2
То же интересуюсь обработкой изображений. Но почему недокамера от мышки? Почему не взять камеру модуль и платку На Cortex A7-9 типа Orange Pi или Raspberry или подобное? Можно и STM32F4 и прицепить модуль.
0
Но почему недокамера от мышки?
В примерах, кстати рассматривается BMP 128x128 24 бита :-) Так что никто не мешает Вам использовать хорошую камеру :)
0
Несколько доработал статью, учитывая пожелания читателей.
0
У меня есть еще одно ОЧЕНЬ ВАЖНОЕ!111 замечание к статье. Почему вы взяли в качестве образца именно хорька? Ведь есть старая добрая традиция использовать Лену в научных статьях связанных с обработкой изображения. Ведь Лена — это святое, как Hello World для программистов, как чайник Юта для моделлеров, как Lorem ipsum для верстальщиков.
Нельзя вот так просто взять и изменить традиции :)

З.И. Хотел поблагодарить Вас за статью, а то я написал много комментариев, а поблагодарить Вас забыл.
+4
Почему вы взяли в качестве образца именно хорька?
Ну например в этой работе слоны и жирафы :-)
Без Лены конечно тоже не обошлось, но только для сравнения скорости обработки.
И пора эмбедорщикам свои собственные традиции создавать — эталонную картинку *.bmp 16x16 с оптической мыши. :-)
0
Найти оригинальный журнал PlayBoy за 72й год, открыть разворот и сделать снимок мышкой=))
+2
Читая подобное на ум приходит бородатый анекдот про интеграл и упавшие в сортир ключи.
Автор, нельзя ли для вящего понимания, хотя бы в комментариях, объяснить совсем на бытовом уровне, где это нужно на практике?
0
Упавшие в сортир ключи, действительно проще достать при помощи интеграла.
А вот если ты уронил табельное оружие, то тогда приходится идентифицировать объект с помощью взаимной двумерной корреляции, которую гораздо выгоднее проводить через двумерное преобразование Фурье.
Технология поиска такова:
1. Проводим ультразвуковое сканирование дна сортира. (см. картинку)

2. Проводим двумерную корреляцию УЗ скана и изображения своего табельного.
3. по максимуму функции взаимной корреляции находим точное положение объекта.
4. И только после этого применяем интеграл.
+1
На сколько я правильно понял, то основная тема для применения это аутентификация

Но я так понимаю (а понимаю я мало) пропагандируемый тут уровень это плоское изображение с поворотом в одной плоскости. И с пистолетом упавшим в сортир могут возникнуть сложности в плане узнавания если он вдруг упадёт стволом вверх.
А вот к примеру вышеупомянутую оптическую мышь можно в аппаратном плане использовать в качестве прототипа сканера отпечатка пальца? Или это я совсем не про то думаю?
+1
И с пистолетом упавшим в сортир могут возникнуть сложности в плане узнавания если он вдруг упадёт стволом вверх.
Да и с использованием интеграла в этом случае могут возникнуть определённые проблемы, особенно если пистолет взведён и не поставлен на предохранитель…
А вот к примеру вышеупомянутую оптическую мышь можно в аппаратном плане использовать в качестве прототипа сканера отпечатка пальца?
Да, можно. Хранить эталон можно сразу в виде двумерного образа Фурье. Масштабирование не нужно, только повороты и взаимная корреляция. Но я бы особенно сканерами отпечатка пальца не увлекался. Палец могут и отрезать! Дикари-с!!!
P.S. Про корреляцию есть продолжение в Часть 2.
+1
а этот случай снимают отпечатки всех пальцев обеих рук.Палец можно банально порезать, что приведет к временной блокировке идентификации
0
Ага, можно ещё и с пальцев ног. Про запас. На всякий случай…
0
Эта статья написана для людей, которые хорошо знают что такое БПФ, знают как с его помощью отфильтровать сигнал, вычислить функцию взаимной корреляции в одномерном случае, но испытывают определённые трудности в переносе этих алгоритмов в 2D.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.