¿Cómo se aplican estos filtro de Gabor wavelets en una imagen ?

Cómo aplicar Gabor wavelets a una imagen?

close all;
clear all;
clc;
% Parameter Setting
R = 128;
C = 128;
Kmax = pi / 2;
f = sqrt( 2 );
Delt = 2 * pi;
Delt2 = Delt * Delt;
% Show the Gabor Wavelets
for v = 0 : 4
for u = 1 : 8
GW = GaborWavelet ( R, C, Kmax, f, u, v, Delt2 ); % Create the Gabor wavelets
figure( 2 );
subplot( 5, 8, v * 8 + u ),imshow ( real( GW ) ,[]); % Show the real part of Gabor wavelets
end
figure ( 3 );
subplot( 1, 5, v + 1 ),imshow ( abs( GW ),[]); % Show the magnitude of Gabor wavelets
end
function GW = GaborWavelet (R, C, Kmax, f, u, v, Delt2)
k = ( Kmax / ( f ^ v ) ) * exp( 1i * u * pi / 8 );% Wave Vector
kn2 = ( abs( k ) ) ^ 2;
GW = zeros ( R , C );
for m = -R/2 + 1 : R/2
for n = -C/2 + 1 : C/2
GW(m+R/2,n+C/2) = ( kn2 / Delt2 ) * exp( -0.5 * kn2 * ( m ^ 2 + n ^ 2 ) / Delt2) * ( exp( 1i * ( real( k ) * m + imag ( k ) * n ) ) - exp ( -0.5 * Delt2 ) );
end
end

Edición: esta es la dimensión de mi imagen

Cómo aplicar Gabor wavelets a una imagen?

  • Si los tamaños están dando problemas, usted podría considerar la posibilidad de establecer R=size(img,1); C=tamaño(img,2) y el uso img=doble(rgb2gray(img)) para convertir a escala de grises de un hacer cálculos que.
  • Usted está utilizando una imagen en color, que es una matriz 3D. Usted debe leer un tutorial básico sobre representación de la imagen.
  • hice convertirlo en una imagen gris
  • Hola, Cómo aplicar la inversa de Gabor wavelets fórmula para reconstruir la imagen original ? cualquier ayuda será muy apreciada
  • Christina, su pregunta es diferente y debe ser publicado en su propio. Siéntase libre para vincular a tu nueva pregunta en un comentario, aunque, como es muy relevante aquí.
  • Una pregunta le ayudará a cabo

InformationsquelleAutor vini | 2012-01-25

2 Comentarios

  1. 16

    Un uso típico de los filtros de Gabor es calcular el filtro de respuestas en cada una de las diferentes orientaciones, por ejemplo, para la detección de bordes.

    Puede convolución de un filtro con una imagen utilizando la Teorema De La Convolución, tomando la transformada de Fourier inversa del elemento sabio producto de las transformadas de Fourier de la imagen y el filtro. Aquí está la fórmula básica:

    %# Our image needs to be 2D (grayscale)
    if ndims(img) > 2;
    img = rgb2gray(img);
    end
    %# It is also best if the image has double precision
    img = im2double(img);
    [m,n] = size(img);
    [mf,nf] = size(GW);
    GW = padarray(GW,[n-nf m-mf]/2);
    GW = ifftshift(GW);
    imgf = ifft2( fft2(img) .* GW );

    Normalmente, la FFT de convolución es superior para los núcleos de tamaño > 20. Para más detalles, recomiendo Recetas Numéricos en C, que tiene una buena, independiente del idioma descripción del método y de sus advertencias.

    Sus granos ya están grandes, pero con el método de la FFT se puede ser tan grande como el de la imagen, ya que se rellenan a que el tamaño de la independencia. Debido a la periodicidad de la FFT, el método realiza la convolución circular. Eso significa que el filtro se envuelven alrededor de los bordes de la imagen, así tenemos que la almohadilla de la propia imagen, así como para eliminar este efecto de borde. Por último, ya que queremos que la respuesta total a todos los filtros (al menos en una implementación típica), tenemos que aplicar a cada uno para la imagen, y la suma de las respuestas. Usualmente se utiliza sólo 3 a 6 orientaciones, pero también es común para hacer el filtrado en varias escalas (kernel diferentes tamaños, así que en ese contexto un mayor número de filtros se utiliza.

    Usted puede hacer todo con un código como este:

    img = im2double(rgb2gray(img)); %# 
    [m,n] = size(img); %# Store the original size.
    %# It is best if the filter size is odd, so it has a discrete center.
    R = 127; C = 127;
    %# The minimum amount of padding is just "one side" of the filter.
    %# We add 1 if the image size is odd.
    %# This assumes the filter size is odd.
    pR = (R-1)/2;
    pC = (C-1)/2;
    if rem(m,2) ~= 0; pR = pR + 1; end;
    if rem(n,2) ~= 0; pC = pC + 1; end;
    img = padarray(img,[pR pC],'pre'); %# Pad image to handle circular convolution.
    GW = {}; %# First, construct the filter bank.
    for v = 0 : 4
    for u = 1 : 8
    GW =  [GW {GaborWavelet(R, C, Kmax, f, u, v, Delt2)}];
    end
    end
    %# Pad all the filters to size of padded image.
    %# We made sure padsize will only be even, so we can divide by 2.
    padsize = size(img) - [R C];
    GW = cellfun( ...
            @(x) padarray(x,padsize/2), ...
            GW, ...
            'UniformOutput',false);
    imgFFT = fft2(img); %# Pre-calculate image FFT.
    for i=1:length(GW)
    filter = fft2( ifftshift( GW{i} ) ); %# See Numerical Recipes.
    imgfilt{i} = ifft2( imgFFT .* filter ); %# Apply Convolution Theorem.
    end
    %# Sum the responses to each filter. Do it in the above loop to save some space.
    imgS = zeros(m,n);
    for i=1:length(imgfilt)
    imgS = imgS + imgfilt{i}(pR+1:end,pC+1:end); %# Just use the valid part.
    end
    %# Look at the result.
    imagesc(abs(imgS));

    Tenga en cuenta que este es esencialmente el mínimo de implementación. Usted puede elegir de la almohadilla con la replica de la frontera en lugar de ceros, aplicar un sistema de ventanas de la función de la imagen o hacer la almohadilla de mayor tamaño con el fin de obtener la resolución de la frecuencia. Cada uno de estos es un estándar de aumento a la técnica que he descrito anteriormente y debe ser trivial para la investigación a través de Google y Wikipedia. También tenga en cuenta que no he añadido ningún básicos de MATLAB optimizaciones como pre-asignación, etc.

    Como nota final, es posible que desee omitir la imagen de relleno (es decir, usa el primer ejemplo de código) si los filtros son siempre mucho menor que el de la imagen. Esto es debido a que, añadiendo ceros a una imagen crea una artificial borde característica, en donde el relleno empieza. Si el filtro es pequeño, la envolvente de la circular de convolución no causa problemas, porque sólo los ceros en la del filtro relleno estará involucrado. Pero tan pronto como el filtro es suficientemente grande, el efecto envolvente se vuelven severos. Si usted tiene que usar grandes filtros, puede que tenga que utilizar más complicado esquema de relleno, o recortar el borde de la imagen.

    • ¿Dónde pongo el mencionado código : [m,n] = size(img); [mf,nf] = size(GW); GW = padarray(GW,[n-nf m-mf]/2); GW = ifftshift(GW); imgf = ifft2( fft2(img) .* fft2(img) );
    • Que el código fue sólo para dar la fórmula básica. He editado para hacer que sea más claro, y añadido algo más de información. El segundo bloque de código debe cubrir.
    • Estoy recibiendo un error en padarray ??? Error en la utilización ==> iptcheckinput Función PADARRAY espera su segunda entrada, PADSIZE, para ser de valor entero. Error en ==> padarray>ParseInputs en 233 iptcheckinput(padSize, {‘doble’}, {‘real’ de ‘vector’ ‘nonnan’ ‘positivo’ … Error en ==> padarray a los 65 años [a, método, padSize, padVal, dirección] = ParseInputs(varargin{:}); Error en ==> @(x)padarray(x,[m,n]/2) Error en el ==> GaborExample a los 28 GW = cellfun(@(x)padarray(x,[m n]/2),GW,’UniformOutput’,false);
    • He añadido el código para asegurarse de que los tamaños de salir a la derecha para evitar que.
    • ??? Índice supera matriz de dimensiones. Error en ==> GaborExample en 32 GW = [GW{GaborWavelet(R,C,Kmax,f,u,v,Delt2)}]; I dun sé por qué me sale este error
    • estoy tratando pero sus apareciendo de nuevo y de nuevo
    • ¿Tiene el espacio en el que hay? Que [GW {stuff}] línea de forma dinámica, se amplía el GW celda de la matriz por el empaque de la salida de stuff en una celda y, a continuación, la concatenación con los corchetes.
    • He arreglado un error por el imgS suma de la línea. Es que donde está su error era en realidad? El código funciona para mí cuando puedo copiar y pegar de vuelta de esta respuesta, independientemente de las dimensiones de la imagen.
    • ??? Error en la utilización ==> menos de la Matriz de dimensiones deben estar de acuerdo. Error en ==> GaborExample en la 42 me sale este error ahora padsize = tamaño(img) – [R, C];
    • Es su img variable 3D? Si se parte de una matriz 3D, tiene el tamaño de m X n X 1, y necesita utilizar shiftdim para deshacerse de el singleton dimensión. size en una matriz 2D es una longitud de 2 vectores y [R C] es también una longitud de 2 vectores.
    • También sugiero utilizar el depurador para que pueda ver porque el error se produce (por ejemplo, tamaño de img etc.) así como donde.
    • compruebe la edición de mis dimensiones de la imagen
    • He añadido la conversión de colores de código para mi primer ejemplo de código. Le recomiendo que lea la documentación de MATLAB en representación de la imagen y la manipulación.

  2. 7

    A «aplicar» una wavelet de una imagen generalmente se toma el producto interior de la onda y la imagen para obtener un solo número cuya magnitud representa la relevancia que wavelet es la imagen. Si usted tiene un conjunto completo de wavelets (llamado un «ortonormales base») para una imagen de 128 filas y 128 columnas que habría de 128*128 = 16,384 diferentes wavelets. Usted sólo tiene 40 aquí, pero usted trabajar con lo que tienes.

    Para obtener el coeficiente wavelet se puede tomar una imagen, por ejemplo este:

    t = linspace(-6*pi,6*pi,128);
    myImg = sin(t)'*cos(t) + sin(t/3)'*cos(t/3);

    y tomar el producto interior de este y uno de los vectores de la base de GW como este:

    myCoef = GW(:)'*myImg(:);

    Me gusta a la pila de todos mis ondas en una matriz GW_ALL donde cada fila es uno de los 32 GW(:)’ wavelets que tiene y, a continuación, calcular todos los coeficientes wavelet de una vez por escrito

    waveletCoefficients = GW_ALL*myImg(:);

    Si se hace una gráfica de estos con la madre(abs(waveletCoefficients)) te darás cuenta de que algunos son más grandes que otros. Los valores grandes son las que coinciden con la imagen.

    Finalmente, asumiendo que su wavelets ortogonales (que no son, en realidad, pero eso no es terriblemente importante aquí), usted podría intentar reproducir la imagen con su wavelets, pero tenga en cuenta que usted sólo tiene 32 del total de las posibilidades y todos ellos están en el centro de la imagen… así que cuando escribimos

    newImage = real(GW_ALL'*waveletCoefficients);

    obtendremos algo similar a nuestra imagen original en el centro, pero no en el exterior.

    He añadido a su código (abajo) para obtener los siguientes resultados:
    Cómo aplicar Gabor wavelets a una imagen?

    Donde las modificaciones son:

    % function gaborTest()
    close all;
    clear all;
    clc;
    % Parameter Setting
    R = 128;
    C = 128;
    Kmax = pi / 2;
    f = sqrt( 2 );
    Delt = 2 * pi;
    Delt2 = Delt * Delt;
    % GW_ALL = nan(32, C*R);
    % Show the Gabor Wavelets
    for v = 0 : 4
    for u = 1 : 8
    GW = GaborWavelet ( R, C, Kmax, f, u, v, Delt2 ); % Create the Gabor wavelets
    figure( 2 );
    subplot( 5, 8, v * 8 + u ),imshow ( real( GW ) ,[]); % Show the real part of Gabor wavelets
    GW_ALL( v*8+u, :) = GW(:);
    end
    figure ( 3 );
    subplot( 1, 5, v + 1 ),imshow ( abs( GW ),[]); % Show the magnitude of Gabor wavelets
    end
    %% Create an Image:
    t = linspace(-6*pi,6*pi,128);
    myImg = sin(t)'*cos(t) + sin(t/3)'*cos(t/3);
    figure(3333);
    clf
    subplot(1,3,1);
    imagesc(myImg);
    title('My Image');
    axis image
    %% Get the coefficients of the wavelets and plot:
    waveletCoefficients = GW_ALL*myImg(:);
    subplot(1,3,2);
    stem(abs(waveletCoefficients));
    title('Wavelet Coefficients')
    %% Try and recreate the image from just a few wavelets.
    % (we would need C*R wavelets to recreate perfectly)
    subplot(1,3,3);
    imagesc(reshape(real(GW_ALL'*waveletCoefficients),128,128))
    title('My Image Reproduced from Wavelets');
    axis image

    Este enfoque constituye la base para la extracción de los coeficientes wavelet y la reproducción de una imagen. Gabor Wavelets son (como se indica) no ortogonal (referencia) y son más propensos a ser utilizados para la extracción de características mediante la convolución como se describe por reve_etrange. En este caso, usted podría mirar a agregar esto a su interior bucle:

     figure(34);
    subplot(5,8, v * 8 + u );
    imagesc(abs(ifft2((fft2(GW).*fft2(myImg)))));
    axis off
    • no se puede trabajar para las imágenes
    • ¿Qué estás buscando? He hecho un poco de edición, pero tiendo a estar de acuerdo con reve que usted puede estar buscando convolución. Retirar la referencia disp.ee.ntu.edu.tw/~pujols/…
    • sí, eso es lo que estoy buscando en realidad ! estoy implementando un papel
    • ¿Cuál es la diferencia entre los filtros de Gabor y Gabor wavelets ? ¿Gabor wavelets es la más óptima?? Por favor agradezco su respuesta 🙂 Gracias de antemano!
    • Me estaba preguntando lo mismo. Supongo que se refieren a la misma cosa, que de 40 miembros del banco de filtros. Y otra pregunta. ¿Por qué tomamos el interior del producto en lugar de la convolución? O son la misma cosa ?
    • La wavelet está siendo utilizado como un filtro, de modo que en el contexto de Gabor wavelets == filtro de Gabor. El interior del producto NO es la misma como la convolución. El uso del producto interior da a un solo número, la semejanza de la imagen con el filtro, que puede ser utilizado para la clasificación. Convolución da una nueva imagen que indica la similitud con el filtro de en cada punto. Esto es lo que es útil para la detección de bordes y similares.

Dejar respuesta

Please enter your comment!
Please enter your name here