วิธีการใช้การแปลง Hough แบบไล่ระดับสี


9

ฉันพยายามใช้การแปลง 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)ในที่สุดผมก็พล็อตขอบเป็น

ใหม่ผล


"เมื่อฉันพยายามใช้ maxima เป็นพารามิเตอร์ขอบในภาพต้นฉบับ" คุณเป็นอย่างไรบ้าง
endolith

@Jonas Due Vesterheden เพียงแค่สงสัยว่านี่เป็นภาพ VS vs doppler frequency หรือไม่ ...
Spacey

@ Mohammad: ไม่ใช่ที่ฉันรู้ ภาพต้นฉบับเป็นของแผงวงจรบางอย่าง คุณหมายถึงอะไร "VS"
Jonas Due Vesterheden

@JonasDueVesterheden 'VS' หมายถึง 'กับ' (เวลากับความถี่ doppler ') :-)
Spacey

คุณควรทำให้แผนที่ hough ของคุณราบรื่นก่อนที่จะใช้การปราบปรามแบบไม่แม็กซ์

คำตอบ:


2

คำถามของคุณค่อนข้างสับสน การแปลง Hough ใช้เพื่อตรวจจับเส้นไม่ใช่ขอบ

หากสิ่งที่คุณต้องการคือแผนที่ขอบคุณควรกำหนดขนาดการไล่ระดับสีหรือใช้สิ่งที่แฟนซีกว่าเช่นเครื่องตรวจจับขอบ Canny

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

สำหรับการนำไปใช้ของคุณฉันคิดว่าปัญหาคือถังขยะในเมทริกซ์ Hough ของคุณเล็กเกินไป โดยพื้นฐานแล้วขนาด bin ในมิติ rho คือ 1 และขนาด bin ในมิติ theta นั้นน้อยกว่า 2 องศา นั่นหมายความว่าการไล่ระดับสีแบบลาดเอียงจะต้องลงอย่างแม่นยำเพื่อสร้างแนวซึ่งไม่ค่อยเกิดขึ้นในทางปฏิบัติ หากคุณคำนวณ rho_idx และ theta_idx เพื่อให้ถังขยะมีขนาดใหญ่ขึ้นนั่นจะทำให้เครื่องตรวจจับเส้นของคุณทนต่อข้อผิดพลาดได้มากขึ้นและคุณอาจได้เส้นที่ดีขึ้น


1

ฉันไม่รู้ว่านี่เป็นปัญหาหรือไม่ แต่ atan () ให้มุมจาก -90 ถึง +90 องศาเท่านั้นเพราะความกำกวมของ Quadrant ในการรับมุมการไล่ระดับสีเต็มรูปแบบ (จาก -180 ถึง 180) คุณต้องใช้ atan2 ()


ขอบคุณสำหรับคำแนะนำ! ตามที่ฉันเข้าใจแล้วมันควรจะเพียงพอที่จะใช้มุมจาก -90 ถึง +90 องศาเนื่องจาก "ทิศทาง" ของขอบไม่สำคัญ ฉันลองใช้atan2แต่ดูเหมือนจะไม่สามารถแก้ไขปัญหาได้
Jonas Due Vesterheden
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.