O que significa "frequência" em uma imagem?

29

Não entendo como as frequências são definidas nas imagens / fotografias. Até onde eu entendo agora, as altas frequências são como coisas nítidas nas imagens, como bordas mais ou menos, e as baixas frequências são o oposto?

Eu também gostaria de entender o resultado das Transformações Discretas de Fourier, como ler corretamente.

Seria legal se alguém pudesse me explicar o seguinte:

  1. O que são frequências nas imagens e como elas são definidas?

  2. Como você lê o resultado de uma Transformação Discreta de Fourier?

Jakob Abfalter
fonte
obrigado, eu já li isso, me ajudou, mas ainda estou um pouco sem noção.
Jakob Abfalter

Respostas:

44

Responderei apenas à primeira pergunta: o que são frequências nas imagens?

A Transformada de Fourier é uma técnica matemática em que a mesma informação de imagem é representada não para cada pixel separadamente, mas para cada frequência. Pense nisso desta maneira. O mar tem ondas, algumas das quais são muito lentas (como marés), outras são de tamanho médio e outras ainda são pequenas, como as ondulações formadas por uma rajada. Você pode pensar nelas como três ondas separadas, mas em cada ponto da superfície do mar e em um momento, você obtém apenas uma altura de água.

O mesmo se aplica às imagens. Você pode pensar na imagem composta de várias ondas ou frequências. Para criar sua imagem, comece com a cor média (na verdade, pensar em imagens em escala de cinza é mais fácil). Em seguida, adicione ondas de comprimentos e força diferentes para criar lentamente detalhes na imagem.

Imagem de origem:

Imagem de origem

Primeira Frequência (Média):

Média

A segunda frequência ao longo da dimensão vertical é uma onda começando no zero na parte inferior da imagem, subindo, tornando-se zero novamente ao longo do horizonte central e caindo abaixo de zero para finalmente se tornar zero no topo da imagem. (Descrevi uma série de Fourier sem mudança de fase, mas a analogia ainda se mantém.)

Aqui você pode ver a segunda frequência ao longo da horizontal e vertical. Observe que você pode descobrir onde a montanha estará (escura) e onde o céu e o lago estarão (mais claros).

Segunda Frequência:

Primeiro componente

Cada onda ou frequência adicional traz mais ondulações e, como tal, mais detalhes. Para obter imagens diferentes, a altura / amplitude da onda pode ser alterada, bem como o ponto inicial da onda, também chamada de Fase.

Terceira Frequência:

Terceiro

Curiosamente, a quantidade de informações é a mesma nessa representação e pode-se ir e voltar entre imagens normais (domínio espacial) e imagens transformadas de Fourier (domínio de frequência). No domínio da frequência, precisamos manter as informações de todas as frequências junto com a amplitude e as informações da fase.

Aqui está usando 50% das frequências:

50%

Existem variantes de tudo isso, com distinções a serem feitas entre as séries de Fourier, transformada de Fourier e transformada discreta de Fourier e transformada discreta de cosseno (DCT).

Uma aplicação interessante está no uso de algoritmos de compactação como o JPEG. Aqui, o DCT é usado para salvar mais partes importantes da imagem (as frequências baixas) e menos as altas.

Escrevi isso na esperança de que leitores iniciantes possam obter um entendimento básico da idéia das transformadas de Fourier. Por isso fiz algumas simplificações que espero que os leitores mais avançados me perdoem.

Animado

O vídeo gerado por Thomas Devoogdt pode ser visto no Vimeo .

animado


Frequências no pós-processamento

Existem vários métodos que dependem de frequências para pós-processamento, principalmente porque nunca olhamos para pixels únicos individualmente. Muitos algoritmos funcionam com frequência, porque é mais natural pensar neles dessa maneira. Mas também porque a Transformada de Fourier contém as mesmas informações, podemos expressar qualquer operação matemática (ou etapa de pós-processamento) na frequência e nos domínios espaciais! Às vezes, a descrição em pixels é melhor, mas geralmente a descrição da frequência é melhor. (Melhor significa principalmente mais rápido neste contexto.)

Uma técnica que eu gostaria de apontar por nenhuma razão específica, exceto que são artistas trabalhando diretamente com frequências e que é * separação de frequências *. Não vou descrevê-lo, mas você pode ver como ele funciona no YouTube para Photoshop e GIMP.

Você cria duas camadas, uma com as frequências baixas e outra com as altas frequências. Para retratos, você pode suavizar a pele nas altas frequências sem afetar os tons de pele nas baixas frequências.

Código

Este é um código para gerar os exemplos acima. Pode ser executado como um simples programa 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
fonte
Deveria ser esclarecido que, embora teoricamente pudéssemos, supondo que tivéssemos um conhecimento infinito da imagem em questão, decompô-la em frequências componentes e recompô-la sem perda ... no mundo real, não podemos. A convolução de uma imagem do mundo real, que ocorre em todas as "interfaces" ao longo do pipeline óptico, é efetivamente um processo irreversível. Não podemos conhecer todos os fatores de convolução e, portanto, a reconstrução de uma FFT em uma imagem é difícil, e modificações extremas geralmente resultam em artefatos e perda de dados.
Jrista
@jrista Acho que o ponto que a Unapiedra estava fazendo sobre a reversibilidade era que, quando você trabalha com uma imagem digital (uma matriz de pixels em um computador), pode ir para o espaço de frequência e voltar e obter a mesma imagem com a qual começou. Você está vendo uma imagem maior do sistema de imagem física (lentes e outras), onde as limitações do mundo real se intrometem.
coneslayer
3
O comentário de jrista é enganoso, pois o FT é responsabilizado pela perda de informações. Obviamente, a fotografia é um processo com perdas e também o pós-processamento. Se eu converter uma imagem discreta em Fourier Space, faça algum processamento com perdas e depois converta novamente, é claro que perco informações. Mas isso acontece na etapa de processamento e não na etapa de conversão. É verdade que, devido à precisão da máquina, todas as operações matemáticas perdem informações, mas se falamos de imagens de 8 bits por canal, não notamos erros de precisão da máquina.
Unapiedra
1
@ Turkeyphant, não me lembro porque mencionei a diagonal nesse contexto. Você pode ver que a direção principal da segunda frequência parece ser aquela diagonal específica. Talvez seja por isso. Para responder sua pergunta, você só precisa de dois eixos para representar uma imagem 2D. É importante que os dois eixos sejam ortogonais. Os eixos horizontal e vertical atendem a esse critério. (Também são práticas.) Com imagens discretas (ou seja, compostas de pixels), o aliasing tornará todos os outros ângulos piores.
Unapiedra
1
@ Correção de Turkeyphant, Unapiedra descreveu a segunda frequência , não a primeira, como 0, -1, 0, +1, 0. Os parágrafos que descrevem a 2ª frequência são imediatamente após a 1ª imagem de frequência (a imagem cinza uniforme), e posso veja como pode ser tentador ler esse parágrafo como uma descrição da imagem anterior (os artigos geralmente mostram uma imagem e depois a descrevem no texto após a imagem), mas não neste caso. =)
scottbb 7/08/19
8

Vou tentar explicar com os termos matemáticos mais simples possíveis. Se você quiser pular a matemática, pule para a parte II, se quiser obter a resposta curta pule para a Parte III

Parte I

Frequência de um sinal significa o número de ocorrências de um evento repetido por unidade de tempo. Portanto, se a unidade de tempo for segundos, a frequência será medida com Herz: 1Hz = 1 / s. Portanto, um sinal com 100Hz, tem um padrão que se repete 100 vezes por segundo.

O sinal mais básico (do ponto de vista do processamento do sinal) é um sinal sinusal.

y (t) = sin (2πft)

onde f é a frequência desse sinal sinusal e t é o tempo. Se esse sinal foi emitido ef estava em torno de 50Hz, você ouvirá um tom baixo muito baixo. com uma frequência mais alta como 15kHz, será um tom mais alto.

Agora, para generalizar o conceito, o sinal pode ser um sinal espacial, em vez de um sinal temporal ... como se você desenhasse a onda sinusal em um pedaço de papel, com um eixo chamado x apontando para a direita e o eixo y perpendicular para o eixo x.

y (x) = sin (2πfx)

onde f é a frequência do sinal ex é a variável espacial. f aqui não é mais medido com 1 / s, mas 1 / (unidade de espaço).

Fourier, um matemático francês, mostrou que você pode gerar qualquer sinal adicionando vários sinais seno e cosseno com diferentes amplitudes e frequências. Isso é chamado de Análise de Fourier.

Utilizando a análise de Fourier, é possível escrever qualquer função y (x) como uma soma dos sinais seno e cosseno com frequências diferentes, para que uma função y (x) possa ser reescrita em termos de várias funções relacionadas à frequência Y (f). Pode-se dizer que y (x) = AlgumaFunção (Y (f)). ou Y (f) = Função inversa de algumas funções (y (x))

A transformação de Fourier é a função F que transforma um sinal do domínio x para o domínio da frequência.

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

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

F é uma função analógica, Transformação Discreta de Fourier DFT é a aproximação numérica de F. Transformação Rápida de Fourier A FFT é uma maneira de executar a DFT otimizada para velocidade.

Está bem...

parte II

Agora, as imagens de computador são compostas por pixels, e cada pixel tem um valor de intensidade para os valores Vermelho, Verde e Azul, também conhecido como RGB. Nas imagens em escala de cinza, a intensidade de R, G, B de qualquer pixel é igual, R = G = B = I, para que possamos falar sobre I para imagens em escala de cinza.

A imagem em escala de cinza 800px X 100px abaixo foi gerada usando I (x) = sin (2πfx) em que f = 1 repetição / 800px = 0,00125 repetição / px

insira a descrição da imagem aqui

Você pode gerá-lo você mesmo com 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()

A imagem 800px X 100px em escala de cinza abaixo foi gerada usando I (x) = sin (2πfx) em que f = 10repetições / 800px = 0,0125 repetições / px

insira a descrição da imagem aqui

Agora é fácil ver que esta imagem tem uma frequência horizontal de 10. Vamos aumentar a frequência em um fator de 10, de modo que n = 100. f = 100/800 = 1/8 = 0,125 repetições / px:

insira a descrição da imagem aqui

Como mencionado anteriormente, você pode representar qualquer sinal (imagem em escala de cinza 1D) como uma série de sinais senoidais (imagens em seno em escala de cinza 1D) com frequências diferentes.

Parte III

Portanto, uma imagem em escala de cinza 1D A tem frequências mais altas que outra imagem em escala de cinza B se A tiver detalhes "mais finos".

Você pode generalizar esse princípio para imagens coloridas em 2D e até 3D. Quanto mais refinados os "detalhes" de uma imagem, maior é o conteúdo de frequência dessa imagem.

Portanto, um céu azul é de baixa frequência em comparação com a imagem de uma flor.

Você pode aprender mais sobre isso lendo sobre a análise de Fourier e sobre o processamento digital de imagens.

Ouss
fonte
4

Resumidamente, a frequência refere-se à taxa de mudança. Mais precisamente, a frequência é o inverso do período da mudança - ou seja, a quantidade de tempo que leva para alternar de um brilho (ou qualquer outro) para um brilho diferente e voltar novamente. Quanto mais rápido a mudança (por exemplo, do claro para o escuro), maior a "frequência" visual necessária para representar essa parte da imagem.

Em outras palavras, você pode pensar na frequência em uma imagem como a taxa de mudança. Partes da imagem que mudam rapidamente de uma cor para outra (por exemplo, bordas nítidas) contêm altas frequências e partes que mudam gradualmente (por exemplo, grandes superfícies com cores sólidas) contêm apenas baixas frequências.

Quando falamos sobre DCT e FFT e outras transformações similares, geralmente as fazemos em uma parte da imagem (por exemplo, para compactação JPEG, detecção de borda e assim por diante). Faz mais sentido falar sobre as transformações, então, no contexto de um bloco de transformação de um determinado tamanho.

Imagine, se desejar, um bloco de 32 pixels x 32 pixels de dados de imagem. (Esse número é arbitrário.) Suponha que a imagem seja um gradiente simples, branco no lado esquerdo, preto no meio e branco no lado direito. Diríamos que esse sinal tem um período de aproximadamente um comprimento de onda por 32 pixels de largura, porque passa por um ciclo completo de branco para preto e branco novamente a cada 32 pixels.

Arbitrariamente, podemos chamar essa frequência de 1 a 1 ciclo por 32 pixels. Lembro-me vagamente de que isso é comumente chamado θ nos livros de transformação, ou talvez θ / 2, mas eu poderia estar lembrando errado. De qualquer maneira, vamos chamá-lo de 1 por enquanto, porque isso é verdadeiramente arbitrário em um sentido absoluto; o que importa é a relação entre frequências em um sentido relativo. :-)

Suponha que você tenha uma segunda imagem que seja branca em uma borda e desbotada duas vezes mais rapidamente, de modo que ela passe de branco para preto, para branco, para preto e para branco novamente para a outra borda. Então, chamaríamos essa frequência de "2" porque ela muda duas vezes mais que a largura desse bloco de 32 pixels.

Se quiséssemos reproduzir essas imagens simples, poderíamos literalmente dizer que cada linha consiste em um sinal com uma frequência de 1 ou 2, e você saberia como são as imagens. Se as imagens passassem de preto para 50% de cinza, você poderia fazer o mesmo, mas diria que elas tinham uma frequência de 1 ou 2 a uma intensidade de 50%.

Imagens do mundo real, é claro, não são apenas um simples gradiente. A imagem muda frequentemente e não periodicamente conforme você digitaliza da esquerda para a direita. No entanto, dentro de um bloco pequeno o suficiente (por exemplo, 8 pixels, 16 pixels), você pode aproximar essa linha de pixels como a soma de uma série de sinais, começando com a média dos valores de pixels na linha, seguidos pela quantidade de " sinal de frequência 0,5 "(preto de um lado, desbotando para branco) para combinar (ou com uma quantidade negativa, a quantidade desse sinal a subtrair), seguido pela quantidade de frequência 1, frequência 2, frequência 4 e assim por diante .

Agora, uma imagem é única, pois tem frequência nas duas direções; pode ficar mais claro e mais escuro ao se mover na horizontal e na vertical. Por esse motivo, usamos transformações 2D DCT ou FFT em vez de 1D. Mas o princípio ainda é basicamente o mesmo. Você pode representar com precisão uma imagem 8x8 com uma grade 8x8 de buckets de tamanhos semelhantes.

As imagens também são mais complexas por causa das cores, mas vamos ignorar isso por enquanto, e assumiremos que estamos vendo apenas uma imagem em escala de cinza, como você pode ver ao ver o canal vermelho de uma fotografia isoladamente.

Quanto a como ler os resultados de uma transformação, isso depende se você está olhando para uma transformação 1D ou 2D. Para uma transformação 1D, você tem uma série de posições. O primeiro é a média de todos os valores de entrada. O segundo é a quantidade do sinal de frequência 1 a ser adicionado, o terceiro é a quantidade do sinal de frequência 2 a ser adicionado, etc.

Para uma transformação 2D, você tem uma grade de valores n x n . O canto superior esquerdo é tipicamente essa média e, à medida que você avança na direção horizontal, cada balde contém a quantidade de sinal a ser misturado com uma frequência horizontal de 1, 2, 4 etc. e, na direção vertical, ele é a quantidade de sinal para misturar com uma frequência vertical de 1, 2, 4 etc.

Essa é, obviamente, a história completa, se você estiver falando de um DCT; Por outro lado, cada compartimento para uma FFT contém peças reais e imaginárias. A FFT ainda é baseada na mesma idéia básica (mais ou menos), exceto que a maneira como as frequências são mapeadas nas caixas é diferente e a matemática é mais complicada. :-)

Obviamente, o motivo mais comum para gerar esse tipo de transformação é dar um passo adiante e jogar alguns dados fora. Por exemplo, o DCT é usado na compactação JPEG. Ao ler os valores em um padrão em zigue-zague, começando com o canto superior esquerdo (a média) e movendo-se para o canto inferior direito, os dados mais importantes (as informações de média e baixa frequência) são registrados primeiro, seguidos pelos dados de frequência progressivamente mais altos. Em algum momento, você basicamente diz "isso é bom o suficiente" e joga fora os dados de maior frequência. Isso suaviza essencialmente a imagem jogando fora os detalhes finos, mas ainda fornece aproximadamente a imagem correta.

E IIRC, FFTs também são algumas vezes usados ​​para detecção de bordas, onde você joga fora todos, exceto os componentes de alta frequência, como um meio de detectar as áreas de alto contraste em bordas afiadas.

A National Instruments tem um belo artigo que explica isso com fotos. :-)

dgatwood
fonte
0

Imagine digitalizar a imagem linha por linha com uma fotocélula e alimentar os resultados com uma plotadora (essas máquinas planas que produzem ondas negras no papel), um osciloscópio (essas caixas que produzem ondas verdes tremulantes na tela) ou um analisador de espectro (caixas maiores que faça cercas verdes ou multicoloridas). Ou um alto-falante mesmo. Quanto mais refinadas as estruturas em uma imagem, maiores serão as frequências (o tom no alto-falante) do sinal mostrado / ouvido. Quanto mais contraste houver nas estruturas finas, maior será a amplitude das partes de alta frequência do sinal.

rackandboneman
fonte