Dado um filtro, se for fornecido como uma equação, como:
Ou em um kernel como:
Se ajudar, o contexto é o processamento de imagens.
obrigado
Dado um filtro, se for fornecido como uma equação, como:
Ou em um kernel como:
Se ajudar, o contexto é o processamento de imagens.
obrigado
Respostas:
Como outros já mencionaram, executar uma FFT 2D no kernel fornecerá a resposta de frequência do filtro. No entanto, vale ressaltar que os filtros 2D podem ser analisados usando a transformação Z , que pode ou não fornecer informações mais detalhadas, dependendo do filtro (e do que você deseja saber).
Por exemplo, dado o kernel que você especificou, a equação de diferença correspondente seria
Sua transformação Z é
que, após a reorganização, produz a seguinte função de transferência para o filtro:
Para determinar a resposta de magnitude, basta conectar um par de exponenciais complexas e simplificar da seguinte maneira:
Avaliar a resposta de magnitude em frequências extremas fornecerá uma sensação de passa-alto vs. passa-baixo para o filtro. Por exemplo,
Obviamente, a função de transferência pode ser avaliada diretamente para traçar também a resposta de magnitude do filtro. Aqui está um exemplo usando numpy :
import numpy as np
import pylab as py
from mpl_toolkits.mplot3d import axes3d
def H(z1,z2):
return z1 + z2 + 1./z1 + 1./z2 - 4.0
n = 100
w1 = w2 = np.linspace(-np.pi,np.pi, n)
mag = np.zeros((n,n))
for i1 in xrange(0,n):
for i2 in xrange(0,n):
z1 = np.exp(1j*w1[i1])
z2 = np.exp(1j*w2[i2])
mag[i1,i2] = np.abs(H(z1,z2))
fig = py.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y = np.meshgrid(w1,w2)
ax.plot_surface(X, Y, mag, cmap='bone', alpha=.5)
py.show()
Lembre-se de que, se você usar a técnica 2D FFT do kernel, as magnitudes resultantes não serão necessariamente centralizadas em zero, como no gráfico acima.
O negativo da segunda derivada de um núcleo gaussiano, como você descreveu, acaba sendo o que é chamado de 'Chapéu Mexicano' . núcleo. Você pode ver alguns de seus usos no wiki.
Tal como está, esse filtro pode ser usado para detectar arestas. O kernel que você forneceu também pode ser usado na mesma capacidade.
A melhor maneira de saber se um filtro é passa baixa / banda / passa alto é observá-lo no domínio da frequência, pois isso informa quais bandas estão sendo suprimidas ou deixadas em paz. A realização da DFT bidimensional e a magnitude do resultado devem fornecer essas informações.
Se você tiver a Caixa de ferramentas de processamento de imagem MATLAB, poderá usar o freqz2: http://www.mathworks.com/help/images/ref/freqz2.html
Código Scipy para uma DFT / FFT 2-d, conforme observado por @endolith e @Mohammad
h = array([[0,1,0],[1,-4,1],[0,1,0]])
N=32;
figure();
imshow(abs(fft2(h,s=(N,N))),interpolation='nearest');
colorbar()