Сглаживание:Предпочтительные способы определения максимальной частоты?

StackOverflow https://stackoverflow.com/questions/591476

  •  09-09-2019
  •  | 
  •  

Вопрос

Я немного почитал о сглаживании, и это, кажется, имеет смысл, но есть одна вещь, в которой я не слишком уверен.Как именно вы находите максимальную частоту сигнала (в контексте графики).

Я понимаю, что существует более одного случая, поэтому предполагаю, что существует более одного ответа.Но сначала позвольте мне изложить простой алгоритм, который, как я думаю, будет представлять максимальную частоту, чтобы кто-нибудь мог сказать мне, не неправильно ли я его концептуализирую.

Допустим, это для одномерного, конечного изображения в оттенках серого (в пикселях).Правильно ли я предполагаю, что вы могли бы просто просканировать всю пиксельную линию (в пространственной области) в поисках a для минимального колебания, и обратной величиной этого наименьшего колебания была бы максимальная частота?

Исходные значения {23,26,28,22,48,49,51,49}

Частота: Относящаяся к набору {}

(1/2) = .5 : {28,22}

(1/4) = .25 : {22,48,49,51}

Так будет ли .5 максимальной частотой?

И каков был бы идеальный способ вычислить это для такой же пиксельной линии, как приведенная выше?

И на более теоретической ноте, что, если бы ваша выборка входных данных была бесконечной (больше похоже на реальный мир)?Был бы допустимый процесс чем-то вроде:

Predetermine a decent interval for point sampling
Determine max frequency from point sampling
while(2*maxFrequency >  pointSamplingInterval)
{
pointSamplingInterval*=2
Redetermine maxFrequency from point sampling (with new interval)
}

Я знаю, что эти алгоритмы чреваты неэффективностью, так каковы же некоторые из предпочтительных способов?(Не ищу что-то безумно оптимизированное, просто принципиально лучшие концепции)

Это было полезно?

Решение

Правильный способ приблизиться к этому - использовать преобразование Фурье (на практике, БПФ или быстрое преобразование Фурье)

Теория работает следующим образом:если у вас есть набор пикселей с цветом / оттенками серого, то мы можем сказать, что изображение представлено пикселями в "пространственной области".;то есть каждый отдельный номер определяет изображение в определенном пространственном местоположении.

Однако то, что мы действительно хотим, - это представление изображения в "частотной области".Вместо каждого отдельного числа, определяющего каждый пиксель, каждое число представляет амплитуду определенной частоты на изображении в целом.

Инструментом, который преобразует из "пространственной области" в "частотную область", является преобразование Фурье.Выходной сигнал FT будет представлять собой последовательность чисел, определяющую относительный вклад различных частот.

Чтобы найти максимальную частоту, вы выполняете FT и смотрите на амплитуды, которые вы получаете для высоких частот - тогда это просто вопрос поиска от самой высокой частоты вниз, пока вы не достигнете своего порога "минимально значимой амплитуды".

Вы можете закодировать свой собственный FFT, но на практике гораздо проще использовать предварительно упакованную библиотеку, такую как FFTW

Другие советы

Вы не сканируете сигнал на самую высокую частоту, а затем выбираете свою частоту дискретизации:Вы выбираете частоту дискретизации, которая достаточно высока, чтобы запечатлеть то, что вы хотите запечатлеть, а затем вы Фильтр сигнал к удалить высокие частоты.Вы выбрасываете все, что превышает половину частоты дискретизации до того , как вы пробуете это на вкус.

Правильно ли я предполагаю, что вы могли бы просто просканировать всю пиксельную линию (в пространственной области) в поисках для минимального колебания и обратного этому наименьшему колебанию была бы максимальная частота?

Если у вас есть строка из пикселей, значит, выборка уже выполнена.Уже слишком поздно применять фильтр сглаживания.Самая высокая частота, которая может присутствовать, составляет половину частоты дискретизации ("1/2 пикселя", я полагаю).

И на более теоретической ноте, что, если бы ваш ввод выборки был бесконечным (больше похоже на реальный мир)?

Да, это когда вы используете фильтр.Во-первых, у вас есть непрерывная функция, подобная реальному изображению (бесконечная частота дискретизации).Затем вы фильтруете его, чтобы удалить все, что указано выше fs / 2, затем вы пробуете его в fs (оцифровываете изображение в пикселях).Камеры на самом деле не выполняют никакой фильтрации, вот почему вы получаете Муаровые узоры когда вы фотографируете кирпичи и т.д.

alt text

Если вы выполняете сглаживание компьютерной графики, сначала вам нужно подумать об идеальной непрерывной математической функции и продумать, как вы будете ее фильтровать и оцифровывать для вывода на экран.

Например, если вы хотите сгенерировать прямоугольную волну с помощью компьютера, вы не можете просто наивно чередовать максимальные и минимальные значения.Это было бы точно так же, как выборка реального сигнала без предварительной фильтрации.Высшие гармоники возвращаются в основную полосу частот и вызывают множество ложных всплесков в спектре.Вам нужно сгенерировать точки так, как если бы они были взяты из отфильтрованной непрерывной математической функции:

alt text

Я думаю, что эта статья с сайта O'Reilly также может быть полезна для вас ... http://www.onlamp.com/pub/a/python/2001/01/31/numerically.html ...там они ссылаются на частотный анализ звуковых файлов, но вам это дает представление.

Я думаю, что то, что вам нужно, это применение анализа Фурье (http://en.wikipedia.org/wiki/Fourier_analysis).Я изучал это, но никогда не использовал, так что отнеситесь к этому с недоверием, но я верю, что если вы правильно примените это к своему набору чисел, вы получите набор частот, которые являются компонентами серии, а затем сможете выбрать самую высокую.

Я не могу указать вам на фрагмент кода , который делает это , но я уверен , что он должен быть где - то там .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top