Что означает «частота» на изображении?

29

Я не понимаю, как частоты определены в изображениях / фотографиях. Насколько я понимаю, высокие частоты на изображениях похожи на острые предметы, например, на края или около того, а низкие частоты - на противоположность?

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

Было бы здорово, если бы кто-нибудь мог объяснить мне следующее:

  1. Какие частоты на картинках и как они определены?

  2. Как вы читаете результат дискретного преобразования Фурье?

Якоб Абфальтер
источник
Связанный: photo.stackexchange.com/questions/21762/…
coneslayer
спасибо, я уже прочитал это, это помогло мне, но я все еще немного невежественен.
Якоб Абфальтер

Ответы:

44

Я отвечу только на первый вопрос: каковы частоты на изображениях?

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

То же самое относится и к изображениям. Вы можете думать о том, что изображение состоит из различных волн или частот. Чтобы создать свое изображение, начните со среднего цвета (на самом деле думать об изображениях в оттенках серого легче). Затем добавьте волны разной длины и силы, чтобы постепенно создавать детали на картинке.

Исходное изображение:

Исходное изображение

Первая частота (средняя):

Средний

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

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

Вторая частота:

Первый компонент

Каждая дополнительная волна или частота приносят больше пульсаций и, как таковые, больше деталей. Чтобы получить разные изображения, можно изменить высоту / амплитуду волны, а также начальную точку волны, также называемую фазой.

Третья частота:

Третий

Интересно, что объем информации в этом представлении одинаков, и можно переходить между обычными изображениями (пространственная область) и изображениями с преобразованием Фурье (частотная область). В частотной области нам необходимо хранить информацию обо всех частотах, а также информацию об амплитуде и фазе.

Здесь используется 50% частот:

50%

Существуют варианты всего этого с различиями между рядами Фурье, преобразованием Фурье и дискретным преобразованием Фурье и дискретным косинусным преобразованием (DCT).

Одним из интересных приложений является использование алгоритмов сжатия, таких как JPEG. Здесь DCT используется для сохранения большего количества важных частей изображения (низких частот) и меньшего количества высоких частот.

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

Анимационная

Видео, сгенерированное Thomas Devoogdt, можно посмотреть на Vimeo .

анимированные


Частоты в пост-обработке

Существует множество методов, которые полагаются на частоты для постобработки, в основном потому, что мы никогда не смотрим на отдельные пиксели по отдельности. Многие алгоритмы работают на частоте, потому что о них более естественно думать. Но также потому, что преобразование Фурье содержит ту же информацию, мы можем выразить любую математическую операцию (или шаг последующей обработки) в частотной и пространственной областях! Иногда попиксельное описание лучше, но часто частотное описание лучше. (Лучше, прежде всего, значит быстрее в этом контексте.)

Одна техника, которую я хотел бы указать без особой причины, за исключением того, что это художники, работающие непосредственно с частотами, это * разделение частот *. Я не буду описывать это, но вы можете увидеть, как это работает на YouTube для Photoshop и GIMP.

Вы создаете два слоя, один с низкими частотами и один с высокими частотами. Для портретов вы можете делать сглаживание кожи на высоких частотах, не затрагивая тона кожи на низких частотах.

Код

Это некоторый код для генерации приведенных выше примеров. Его можно запустить как простую программу на Python.

from PIL import Image
from numpy.fft import rfft2, irfft2
import numpy as np

def save_dims(ft, low, high, name):
    ft2 = np.zeros_like(ft)
    # copy the frequencies from low to high but all others stay zero.
    ft2[low:high, low:high] = ft[low:high, low:high]
    save(ft2, name)

def save(ft, name):
    rft = irfft2(ft)
    img = Image.fromarray(rft)
    img = img.convert('L')
    img.save(name)

def main():
    # Convert input into grayscale and save.
    img = Image.open("input.jpg")
    img = img.convert('L')
    img.save('input_gray.png')
    # Do Fourier Transform on image.
    ft = rfft2(img)
    # Take only zeroth frequency and do Inverse FT and save.
    save_dims(ft, 0, 1, 'output_0.png')
    # Take first two frequencies in both directions.
    save_dims(ft, 0, 2, 'output_1.png')
    save_dims(ft, 0, 3, 'output_2.png')
    # Take first 50% of frequencies.
    x = min(ft.shape)
    save_dims(ft, 0, x/2, 'output_50p.png')

def generateGif():
    ''' Generates images to be later converted to a gif.
    This requires ImageMagick:
    convert -delay 100 -loop 0 output_*.png animation.gif
    '''
    # Requires images2gif from code.google.com/p/visvis/source/browse/vvmovie/images2gif.py 
    # from images2gif import writeGif

    img = Image.open('input.jpg')
    img = img.convert('L')
    # Resize image before any calculation.
    size = (640,480)
    img.thumbnail(size, Image.ANTIALIAS)
    ft = rfft2(img)

    images = []
    for x in range(0, max(ft.shape)):
        ft2 = np.zeros_like(ft)
        ft2[0:x, 0:x] = ft[0:x,0:x]
        rft = irfft2(ft2)
        img_out = Image.fromarray(rft).convert('L')
        fname = 'animation/output_%05d.jpg' %(x, )
        img_out.save(fname, quality=60, optimize=True)

    #writeGif('animation.gif', images, duration=0.2)


if __name__=='__main__':
    main()
    #generateGif()
Unapiedra
источник
Следует уточнить, что, хотя теоретически мы могли бы, предполагая, что у нас было бесконечное знание об изображении, разложить его на составляющие частоты и перекомпоновать его без потерь ... в реальном мире мы не можем. Свертывание изображения реального мира, которое происходит на каждом «интерфейсе» вдоль оптического конвейера, является фактически необратимым процессом. Мы не можем знать все факторы свертки, и поэтому восстановление БПФ обратно в изображение затруднительно, а экстремальные модификации обычно приводят к артефактам и потере данных.
Йриста
@jrista Я думаю, что смысл Unapiedra в отношении обратимости заключался в том, что, как только вы работаете с цифровым изображением (массивом пикселей на компьютере), вы можете перейти в частотное пространство и обратно и получить то же изображение, с которого начинали. Вы смотрите на более широкую картину физической системы визуализации (линзы и т. Д.), Где налагаются ограничения реального мира.
Coneslayer
3
Комментарий jrista вводит в заблуждение, поскольку FT обвиняют в потере информации. Конечно, фотография - это процесс с потерями и пост-обработка. Если я преобразовываю дискретное изображение в пространство Фурье, выполняю там некоторую обработку с потерями, а затем преобразую обратно, конечно, я теряю информацию. Но это происходит на этапе обработки, а не на этапе преобразования. Да, из-за точности машины каждая математическая операция теряет информацию, но если мы говорим о 8-битных изображениях на канал, мы не заметим ошибок точности машины.
Унапьедра
1
@ Turkephant, я не помню, почему я упоминаю диагональ в этом контексте. Вы можете видеть, что основным направлением второй частоты является именно эта диагональ. Может быть, поэтому. Чтобы ответить на ваш вопрос, вам нужно всего лишь две оси для представления 2D-изображения. Важно, чтобы две оси были ортогональны. Горизонтальная и вертикальная оси соответствуют этому критерию. (Также они практичны.) С дискретными изображениями (т. Е. Составленными из пикселей) сглаживание ухудшит все остальные углы.
Унапьедра
1
Коррекция @Turkeyphant, Unapiedra описала вторую частоту , а не первую, как 0, -1, 0, +1, 0. Параграфы, описывающие 2-ю частоту, находятся сразу после 1-го частотного изображения (однородное серое изображение), и я могу Посмотрите, как может быть заманчиво прочитать этот абзац как описание предыдущего изображения (статьи часто показывают изображение, а затем описывают его в тексте после изображения), но не в этом случае. =)
scottbb
8

Я попытаюсь объяснить с помощью самых простых математических терминов, возможных. Если вы хотите пропустить математику, перейдите к части II, если вы хотите получить короткий ответ, перейдите к части III

Часть I

Частота сигнала означает количество повторений события в единицу времени. Так, если единица времени - секунды, то частота измеряется с Герцем: 1 Гц = 1 / с. Таким образом, сигнал с частотой 100 Гц имеет шаблон, который повторяется 100 раз в секунду.

Самый базовый сигнал (с точки зрения обработки сигналов) - это синусоидальный сигнал.

у (т) = грех (2 фута)

где f - частота этого синусового сигнала, а t - время. Если этот сигнал был звуковым и f был около 50 Гц, вы услышите один очень низкий басовый тон. с более высокой частотой, такой как 15 кГц, это будет более высокий тон.

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

у (х) = грех (2πfx)

где f - частота сигнала, а x - пространственная переменная. Здесь f больше не измеряется с 1 / с, а 1 / (единица пространства).

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

Используя анализ Фурье, можно написать любую функцию y (x) в виде суммы синусоидальных и косинусных сигналов с разными частотами, поэтому функцию y (x) можно переписать в терминах нескольких функций, связанных с частотой Y (f). Можно сказать, что y (x) = Some_Function (Y (f)). или Y (f) = Reverse_of_Some_Function (y (x))

Преобразование Фурье - это функция F, которая преобразует сигнал из области x в частотную область.

Y(f) = F( y(x) )

y(x) = F_inv(Y(f))

F - аналоговая функция. Дискретное преобразование Фурье. DFT - числовое приближение F. Быстрое преобразование Фурье. FFT - это способ сделать ДПФ оптимизированным по скорости.

Ok...

Часть II

Теперь компьютерные изображения состоят из пикселей, и каждый пиксель имеет значение интенсивности для красного, зеленого и синего значений RGB. На изображениях в градациях серого интенсивность R, G, B любого пикселя равна, R = G = B = I, поэтому мы можем говорить о I для изображений в градациях серого.

Изображение в градациях серого 800px X 100px ниже было сгенерировано с использованием I (x) = sin (2πfx), где f = 1 повторение / 800px = 0.00125 повторений / px

введите описание изображения здесь

Вы можете создать его самостоятельно с помощью Python3

from PIL import Image, ImageDraw
from math import sin, pi

img = Image.new('RGB', (800,100), color='black')
draw = ImageDraw.draw(img)

#cacluate the frequency
n = 10 #repetitions
f = n/img.width #

#iterate of the width pixels
for x in range(img.width):
 #calculate the intensity i in that pixel x
 y = sin(2*pi*f*x - pi/2) #this will generate values between -1 and +1, -pi/2 is to make sure that i starts with value 0 in the next line.
 i = (255+255*y)/2 #shifting and scaling y so that the values are between 0 and 255
 draw.line((i,0,i,img.height), fill=(int(i),int(i),int(i)))

img.show()

Изображение в градациях серого 800px X 100px ниже было сгенерировано с использованием I (x) = sin (2πfx), где f = 10 повторений / 800px = 0,0125 повторений / пикс.

введите описание изображения здесь

Теперь легко увидеть, что это изображение имеет горизонтальную частоту 10. Давайте увеличим частоту в 10 раз, чтобы n = 100. f = 100/800 = 1/8 = 0,125 повторений / px:

введите описание изображения здесь

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

Часть III

Таким образом, 1-мерное изображение А в градациях серого имеет более высокие частоты, чем другое изображение В в градациях серого, если А имеет «более мелкие» детали.

Вы можете обобщить этот принцип для цветных 2D и даже 3D изображений. Чем мельче «детализация» изображения, тем выше частотное содержание этого изображения.

Таким образом, голубое небо имеет низкую частоту по сравнению с изображением цветка.

Вы можете узнать больше об этом, читая об анализе Фурье и о цифровой обработке изображений.

Ус
источник
4

Вкратце, частота относится к скорости изменения. Точнее говоря, частота является обратной величиной периода изменения, то есть количества времени, которое требуется для перехода от одной яркости (или любой другой) к другой яркости и обратно. Чем быстрее затем произойдет изменение (например, от светлого к темному), тем выше визуальная «частота», необходимая для представления этой части изображения.

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

Когда мы говорим о DCT и FFT и других подобных преобразованиях, мы обычно делаем их на части изображения (например, для сжатия JPEG, обнаружения краев и т. Д.). Поэтому имеет смысл говорить о преобразованиях в контексте блока преобразования заданного размера.

Представьте себе, если хотите, блок данных изображения размером 32 × 32 пикселя. (Это число произвольно.) Предположим, что изображение представляет собой простой градиент, который является белым с левой стороны, черным по центру и белым с правой стороны. Мы бы сказали, что этот сигнал имеет период, равный примерно одной длине волны на 32 пикселя ширины, потому что он проходит полный цикл от белого до черного и снова белого через каждые 32 пикселя.

Мы можем произвольно назвать эту частоту «1» - 1 цикл на 32 пикселя, то есть. Я смутно вспоминаю, что это обычно называется θ в учебниках по преобразованию, или, может быть, θ / 2, но я могу помнить неправильно. В любом случае, мы пока назовем это 1, потому что это действительно произвольно в абсолютном смысле; важна связь между частотами в относительном смысле. :-)

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

Если бы мы хотели воспроизвести эти простые изображения, мы могли бы буквально сказать, что каждая строка состоит из сигнала с частотой 1 или 2, и вы бы знали, как выглядят изображения. Если изображения стали черными до 50% серого, вы могли бы сделать то же самое, но вы должны были бы сказать, что они имели частоту 1 или 2 при интенсивности 50%.

Конечно, изображения в реальном мире - это не просто градиент. Изображение меняется часто, а не периодически при сканировании слева направо. Однако в достаточно маленьком блоке (например, 8 пикселей, 16 пикселей) вы можете аппроксимировать этот ряд пикселей как сумму последовательности сигналов, начиная со среднего значения пикселей в строке, за которым следует значение " Частота 0,5 "сигнала (черный с одной стороны, затемнение до белого) для смешивания (или с отрицательным значением, количества этого сигнала для вычитания), за которым следуют величина частоты 1, частоты 2, частоты 4 и т. д. ,

Теперь изображение уникально тем, что оно имеет частоту в обоих направлениях; он может становиться все светлее и темнее при движении как по горизонтали, так и по вертикали. По этой причине мы используем 2D-преобразования DCT или FFT вместо 1D. Но принцип все еще в основном тот же. Вы можете точно представить изображение 8x8 с сеткой 8x8 из одинаковых по размеру блоков.

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

Что касается того, как читать результаты преобразования, это зависит от того, смотрите ли вы на 1D преобразование или 2D преобразование. Для 1D-преобразования у вас есть ряд бинов. Первый - это среднее значение всех входных значений. Второе - это количество добавляемого сигнала частоты 1, третье - это количество добавляемого сигнала частоты 2 и т. Д.

Для 2D-преобразования у вас есть сетка значений n x n . Верхний левый угол, как правило, является таким средним, и когда вы идете в горизонтальном направлении, каждое ведро содержит количество сигнала, который нужно смешать с горизонтальной частотой 1, 2, 4 и т. Д., А когда вы идете в вертикальном направлении, он количество сигнала для смешивания с частотой вертикальной развертки 1, 2, 4 и т. д.

Это, конечно, полная история, если вы говорите о DCT; напротив, каждая ячейка для БПФ содержит действительные и мнимые части. БПФ по-прежнему основывается на той же самой базовой идее (своего рода), за исключением того, что способ отображения частот в ячейках различен, а математика более привлекательна. :-)

Конечно, наиболее распространенная причина для генерации такого рода преобразований состоит в том, чтобы затем сделать еще один шаг и выбросить некоторые данные. Например, DCT используется в сжатии JPEG. При чтении значений в виде зигзагообразного паттерна, начиная с верхнего левого угла (среднее значение) и перемещаясь к нижнему правому краю, в первую очередь записываются наиболее важные данные (средняя и низкочастотная информация), за которыми следуют постепенно увеличивающиеся данные о частоте. В какой-то момент вы в основном говорите «это достаточно хорошо» и выбрасываете данные с самой высокой частотой. Это существенно сглаживает изображение, отбрасывая его мелкие детали, но все равно дает примерно правильное изображение.

И IIRC, FFT также иногда используются для обнаружения краев, где вы отбрасываете все, кроме высокочастотных компонентов, в качестве средства обнаружения областей с высокой контрастностью на острых краях.

У National Instruments есть хорошая статья, которая объясняет это фотографиями. :-)

dgatwood
источник
0

Представьте, что вы сканируете изображение построчно с фотоэлементом и подаете результаты на плоттер (эти плоские машины, которые делают черные волны на бумаге), осциллограф (эти коробки, которые создают мерцающие зеленые волны на экране) или анализатор спектра (большие коробки, которые сделать зеленый или разноцветный забор). Или даже громкоговоритель. Чем мельче структуры на изображении, тем выше будут частоты (высота звука в динамике) показанного / услышанного сигнала. Чем больше контраст в тонких структурах, тем выше будет амплитуда высокочастотных частей сигнала.

rackandboneman
источник