ใช้ตัวกรอง Gabor กับภาพอินพุต


11

ฉันพยายามใช้ตัวกรอง Gabor ที่มีสเกลเฉพาะ (ตามค่าของแลมบ์ดาและซิกมาดังนั้นจึงเป็น ( 7x7 ) และสำหรับการหมุน 4 ทิศทาง (0, ,และ ) ไปยังอิมเมจสเกลสีเทาอินพุตπ4π23π4

ในรหัสของฉันประสบความสำเร็จในสามขั้นตอน:

  1. สร้างตัวกรอง Gabor

  2. อ่านภาพ RGB จากนั้นแปลงเป็นระดับสีเทาและสุดท้ายเป็นสองเท่า

  3. ใช้ gabor ที่สร้างขึ้นกับภาพอินพุต ( ที่นี่ฉันไม่แน่ใจว่ารหัสของฉันเป็นจริงหรือไม่นั่นเป็นเหตุผลที่ฉันต้องการความเห็นของคุณ )

1) -------------- สร้างตัวกรอง Gabor (ขนาด = 7x7 และ 4 การหมุน)

%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) ------------ อ่านภาพอินพุต

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) ----- ใช้ gabor ที่สร้างขึ้นด้านบนกับภาพอินพุต (จำได้ว่าฉันไม่แน่ใจว่ารหัสในขั้นตอนนี้เป็นจริง 100% หรือไม่นั่นเป็นเหตุผลว่าทำไมฉันต้องการความคิดเห็นและความช่วยเหลือของคุณหากคุณมีคำตอบที่ถูกต้อง )

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

ป้อนคำอธิบายรูปภาพที่นี่


นอกจากนี้หากคุณใช้ Conv2 โปรดใช้ด้วยตัวเลือก 'เดียวกัน'
Tolga Birdal

ข้อผิดพลาด: ไฟล์: practise1.m บรรทัด: 3 คอลัมน์: 7 นิพจน์ทางด้านซ้ายของเครื่องหมายเท่ากับไม่ใช่เป้าหมายที่ถูกต้องสำหรับการกำหนด ฉันพบข้อผิดพลาดนี้เมื่อฉันเรียกใช้รหัสนี้
Engr Rao Zaka

ตัวกรองนี้ไม่ใช่ 7x7 ใช่ไหม
jiggunjer

คำตอบ:


1

รหัสของคุณถูกต้องและผลลัพธ์สอดคล้องกัน คุณอาจแปลกใจกับพวกเขาเนื่องจาก 'คุณสมบัติที่ซ่อนอยู่'

ขั้นแรกให้ conv2ผลตอบแทนเต็มที่โดยปริยายเช่นผลลัพธ์ที่ได้คือขนาดของภาพบวกเส้นขอบขนาดครึ่งหนึ่งของเคอร์เนล (นั่นคือขนาดทั้งหมดถ้าขนาดของภาพบวกกับเคอร์เนล) เมื่อคุณตีความผลลัพธ์ของคุณโปรดระวัง!

ประการที่สองผลลัพธ์แสดงถึงค่าสัมประสิทธิ์ที่แข็งแกร่งสำหรับความสัมพันธ์ที่สูงขึ้นระหว่างเคอร์เนลและแพทช์ภาพท้องถิ่นของคุณ: ตามที่คาดไว้คุณจะแยกเส้นขอบของภาพ เห็นผลซ้ายสุดของคุณโดยเฉพาะแสดงเส้นแนวตั้งที่แข็งแกร่ง

สุดท้ายimagescปรับขนาดตามค่าเริ่มต้นระหว่างค่าสูงสุดถึงค่าสัมประสิทธิ์ต่ำสุด นั่นเป็นเหตุผลที่ผลลัพธ์ที่อยู่ทางซ้ายสุดคุณจะเห็นเส้นขอบเป็นหลัก

มีตัวเลือกต่าง ๆ ให้conv2อธิบายhelp conv2ซึ่งอนุญาตให้ควบคุมพฤติกรรมนี้

โปรดระวังด้วยว่ามีคำจำกัดความที่แตกต่างกันมากมายสำหรับการตรวจจับขอบเช่น log-Gabors

ตัวกรองประเภทต่าง ๆ.

หากคุณมีความสนใจในการนำไปใช้อย่างเต็มรูปแบบ (ในภาษาไพ ธ อน) คุณอาจดูได้ที่: https://pythonhosted.org/LogGabor/ (shameless self-plug 😇)


0

รหัสของคุณถูกต้อง คุณเพียงแค่ต้องทำการแปลง 2-D กับเคอร์เนลตัวกรองซึ่งคุณทำได้ดีมาก

โชคดี


ฉันไม่สามารถเข้าใจคุณ คุณกำลังทำการแปลง 2-D (เช่นเดียวกับที่คุณใช้ฟังก์ชัน conv2) อีกวิธีคือการคูณในโดเมนความถี่ (เนื่องจากการแปลงในเวลาหรือโดเมนอวกาศเท่ากับการคูณในโดเมนความถี่) อย่างไรก็ตามคุณไม่จำเป็นต้องทำเช่นนั้นเนื่องจาก Conv2 ทำสิ่งเดียวกันเป็นหลัก (ภายใน !!!)
Ujjwal Aryan

แน่นอน :) คุณรู้จักรุ่น HMAX หรือไม่ (เลเยอร์ S1, C1, S2, C2 ... ) ตอนนี้ฉันกำลังพยายามคำนวณเลเยอร์ C1 (การทำงานสูงสุดระหว่างหน่วย S1) คุณรู้แนวคิดบางอย่างเกี่ยวกับเรื่องนั้น (รหัส matlab) หรือไม่
ลิซท์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.