ฉันพยายามใช้การแปลง Hough สำหรับการตรวจจับขอบและต้องการใช้ภาพไล่ระดับสีเป็นพื้นฐาน
สิ่งที่ฉันได้ทำเพื่อให้ห่างไกลได้รับภาพI
ที่มีขนาด[M,N]
และอนุพันธ์บางส่วนของมันgx
, คือการคำนวณมุมการไล่ระดับสีในแต่ละพิกเซลgy
ในทำนองเดียวกันผมคำนวณขนาดการไล่ระดับสีเป็นthetas = atan(gy(x,y) ./ gx
magnitudes = sqrt(gx.^2+gy.^2)
เพื่อสร้างการแปลง Hough ฉันใช้รหัส MATLAB ต่อไปนี้:
max_rho = ceil(sqrt(M^2 + N^2));
hough = zeros(2*max_rho, 101);
for x=1:M
for y=1:N
theta = thetas(x,y);
rho = x*cos(theta) + y*sin(theta);
rho_idx = round(rho)+max_rho;
theta_idx = floor((theta + pi/2) / pi * 100) + 1;
hough(rho_idx, theta_idx) = hough(rho_idx, theta_idx) + magnitudes(x,y);
end
end
การแปลง Hough ที่เกิดขึ้นนั้นดูเป็นไปได้ (ดูhttp://i.stack.imgur.com/hC9mP.png ) แต่เมื่อฉันพยายามใช้ maxima เป็นพารามิเตอร์ edge ในภาพต้นฉบับผลลัพธ์จะดูสุ่มมากขึ้นหรือน้อยลง ฉันทำสิ่งผิดปกติในการสร้างการแปลง Hough หรือไม่?
UPDATE : ฉันมีความผิดพลาดโง่ในรหัสของฉัน: rho
ที่คำนวณได้เป็นแทนx*cos(theta)+y*cos(theta)
x*cos(theta)+y*sin(theta)
นั่นคือฉันใช้สองโคไซน์แทนโคไซน์และไซน์ ฉันได้แก้ไขโค้ดด้านบนและภาพผลลัพธ์ใหม่อยู่ด้านล่าง สิ่งนี้ไม่ได้ให้ขอบที่ดีกว่ามากนัก
@endolith: ในการพล็อตขอบกำหนดค่าสูงสุดในhough
-matrix at rho_idx, theta_idx
ฉันจะแปลดัชนีเป็นrho,theta
ค่า:
theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;
y= (rho - x*cos(theta)) / sin(theta)
ในที่สุดผมก็พล็อตขอบเป็น