Terapkan filter Gabor ke gambar input

11

Saya mencoba menerapkan filter Gabor dengan skala tertentu (sesuai dengan nilai saya lambda dan sigma, jadi itu adalah ( 7x7 ) dan untuk 4 orientasi (0, , dan ) ke gambar skala abu-abu input.π4π23π4

Dalam kode saya, tiga langkah dicapai:

  1. Buat Filter Gabor

  2. Baca gambar RGB, lalu ubah menjadi skala abu-abu dan akhirnya menjadi dua kali lipat.

  3. Terapkan gabor yang dibuat ke gambar input (di sini, saya tidak yakin apakah kode saya benar, itu sebabnya saya perlu pendapat Anda )

1) -------------- buat filter Gabor (ukuran = 7x7 dan 4 orientasi)

%define the five parameters
theta=....; %either 0 or pi/4 or pi/2 or 3pi/4
lambda=3.5;
gamma=0.3;
sigma=2.8;
psi=0;

sigma_x = sigma;
sigma_y = sigma/gamma;

nstds = 5;
xmax = max(abs(nstds*sigma_x*cos(theta)),abs(nstds*sigma_y*sin(theta)));
xmax = ceil(max(1,xmax));
ymax = max(abs(nstds*sigma_x*sin(theta)),abs(nstds*sigma_y*cos(theta)));
ymax = ceil(max(1,ymax));
xmin = -xmax; ymin = -ymax;
[x,y] = meshgrid(xmin:xmax,ymin:ymax);

x_theta=x*cos(theta)+y*sin(theta);
y_theta=-x*sin(theta)+y*cos(theta);

gb= exp(-.5*(x_theta.^2/sigma_x^2+y_theta.^2/sigma_y^2)).*cos(2*pi/lambda*x_theta+psi);

figure(2);
imshow(gb);
title('theta=...');
%imagesc(gb);
%colormap(gray);
%title('theta=...');

masukkan deskripsi gambar di sini

2) ------------ Baca gambar input

I=imread('piano.jpg');
image_resize=imresize(I, [160,160]);
image_gray=rgb2gray(image_resize);
image_double=im2double(image_gray);
figure(1);
imshow(image_double);

masukkan deskripsi gambar di sini

3) ----- terapkan gabor yang dibuat di atas ke gambar input (ingat bahwa saya tidak yakin apakah kode dalam langkah ini 100% benar, itu sebabnya saya butuh pendapat dan bantuan Anda jika Anda memiliki jawaban yang benar. )

figure(3);
filtered = conv2(image_double,gb);
imagesc(filtered);
colormap(gray);
title('theta=....');

masukkan deskripsi gambar di sini

Liszt
sumber
Juga, jika Anda menggunakan conv2 silakan gunakan dengan opsi 'sama'.
Tolga Birdal
Kesalahan: File: practise1.m Baris: 3 Kolom: 7 Ekspresi di sebelah kiri tanda sama dengan bukan target yang valid untuk suatu tugas. Saya menemukan kesalahan ini ketika saya menjalankan kode ini
Engr Rao Zaka
filter ini bukan 7x7?
jiggunjer

Jawaban:

1

Kode Anda benar dan hasilnya konsisten. Anda mungkin akan terkejut oleh mereka karena beberapa 'fitur tersembunyi'.

Pertama, conv2mengembalikan konvolusi penuh secara default, sehingga hasilnya adalah ukuran gambar ditambah batas setengah ukuran kernel (yaitu, ukuran total jika ukuran gambar ditambah ukuran kernel). Saat Anda menginterpretasikan hasil Anda, waspadalah!

Kedua, hasilnya mewakili koefisien yang lebih kuat untuk korelasi yang lebih tinggi antara kernel Anda dan patch gambar lokal Anda: seperti yang diharapkan Anda juga mengekstrak batas-batas gambar. Lihat khususnya hasil paling kiri Anda yang menunjukkan garis vertikal yang kuat.

Terakhir, imagescskala secara default skala antara koefisien tertinggi ke terendah. Itu sebabnya di hasil paling kiri, Anda terutama melihat perbatasan.

Ada beberapa opsi untuk conv2dijelaskan help conv2yang memungkinkan untuk mengontrol perilaku ini.

Perlu diketahui juga bahwa ada banyak definisi kernel yang berbeda untuk mendeteksi tepi, seperti log-Gabor

berbagai jenis filter.

Jika Anda tertarik pada implementasi penuh (dengan python), Anda dapat melihat di: https://pythonhosted.org/LogGabor/ (plug-shameless self-.).

meduz
sumber
0

Kode Anda benar. Anda hanya perlu melakukan konvolusi 2-D dengan kernel filter yang Anda lakukan dengan sangat baik.

Semoga berhasil

Ujjwal Aryan
sumber
Aku tidak bisa mengerti kamu Anda sedang melakukan Konvolusi 2-D (karena Anda menggunakan fungsi conv2). Cara lain adalah pergi untuk perkalian dalam domain frekuensi (karena konvolusi dalam waktu atau ruang-domain setara dengan perkalian dalam domain frekuensi). Namun Anda tidak perlu melakukan itu, karena conv2 pada dasarnya melakukan hal yang sama (secara internal !!!)
Ujjwal Aryan
Tepat :) ,, apakah Anda tahu model HMAX? (lapisan S1, C1, S2, C2 ...). Saya mencoba sekarang untuk menghitung lapisan C1 (operasi maksimum antara unit S1), apakah Anda tahu beberapa ide tentang itu (kode matlab)?
Liszt