ฉันพยายามใช้การแปลง Hough สำหรับการตรวจจับขอบและต้องการใช้ภาพไล่ระดับสีเป็นพื้นฐาน
สิ่งที่ฉันได้ทำเพื่อให้ห่างไกลได้รับภาพIที่มีขนาด[M,N]และอนุพันธ์บางส่วนของมันgx, คือการคำนวณมุมการไล่ระดับสีในแต่ละพิกเซลgy ในทำนองเดียวกันผมคำนวณขนาดการไล่ระดับสีเป็นthetas = atan(gy(x,y) ./ gxmagnitudes = 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)ในที่สุดผมก็พล็อตขอบเป็น
