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.
Dalam kode saya, tiga langkah dicapai:
Buat Filter Gabor
Baca gambar RGB, lalu ubah menjadi skala abu-abu dan akhirnya menjadi dua kali lipat.
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=...');
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);
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=....');
Jawaban:
Kode Anda benar dan hasilnya konsisten. Anda mungkin akan terkejut oleh mereka karena beberapa 'fitur tersembunyi'.
Pertama,
conv2
mengembalikan 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,
imagesc
skala secara default skala antara koefisien tertinggi ke terendah. Itu sebabnya di hasil paling kiri, Anda terutama melihat perbatasan.Ada beberapa opsi untuk
conv2
dijelaskanhelp conv2
yang memungkinkan untuk mengontrol perilaku ini.Perlu diketahui juga bahwa ada banyak definisi kernel yang berbeda untuk mendeteksi tepi, seperti log-Gabor
.
Jika Anda tertarik pada implementasi penuh (dengan python), Anda dapat melihat di: https://pythonhosted.org/LogGabor/ (plug-shameless self-.).
sumber
Kode Anda benar. Anda hanya perlu melakukan konvolusi 2-D dengan kernel filter yang Anda lakukan dengan sangat baik.
Semoga berhasil
sumber