Hough Transformation เป็นเทคโนโลยีการสกัดคุณสมบัติในการประมวลผลภาพ กระบวนการนี้ในพื้นที่พารามิเตอร์จะคำนวณค่าสูงสุดในท้องถิ่นของผลลัพธ์ที่สะสมกับชุดที่สอดคล้องกับรูปร่างที่เฉพาะเจาะจงเป็นผลการแปลง Hough
ประวัติความเป็นมาของการพัฒนา:
เสนอครั้งแรกโดย Paul Hough ในปี 1962 เพื่อตรวจจับเส้นตรงและเส้นโค้ง
ได้รับการเลื่อนตำแหน่งโดย Richard Duda & Peter Hart ในปี 1972 มันขยายไปสู่การรับรู้วัตถุที่มีรูปร่างใด ๆ
หลักการ:
เส้นตรงจะแสดงในระบบพิกัดสี่เหลี่ยมเป็น y = k*x+b และในระบบพิกัดขั้วเป็น r = x*cos (theta)+y*sin (theta) แนวคิดของการเปลี่ยนแปลง Hough คือจุดในระบบพิกัดสี่เหลี่ยมสอดคล้องกับเส้นตรงภายใต้ระบบพิกัดขั้วโลกและในทำนองเดียวกันจุดในระบบพิกัดขั้วโลกสอดคล้องกับเส้นตรงภายใต้ระบบพิกัดสี่เหลี่ยม ในเส้นตรงในระบบพิกัดสี่เหลี่ยมความลาดชันและการสกัดกั้นมีความแน่นอนดังนั้นจุดทั้งหมดของเส้นตรงนี้จะเน้นที่จุดหนึ่งในระบบพิกัดขั้วโลกและจุดโฟกัสดังกล่าวแสดงถึงเส้นตรงในระบบพิกัดสี่เหลี่ยม
สำหรับเส้นตรง x = c ในการใช้งานจริงจะใช้สมการพารามิเตอร์ p = x*cos (theta)+y*sin (theta) ด้วยวิธีนี้จุดบนระนาบภาพสอดคล้องกับเส้นโค้งบนระนาบพารามิเตอร์ r-theta และส่วนที่เหลือเหมือนกัน
การเปลี่ยนแปลงมาตรฐาน Hough:
imgproc.houghlines (ภาพเสื่อ, เส้นเสื่อ, คู่ rho, double theta, threshold int, double srn, double stn, double min_theta, double max_theta)
คำอธิบายพารามิเตอร์:
รูปภาพ: ภาพต้นทาง
บรรทัด: เวกเตอร์เอาท์พุทของเส้นที่ตรวจพบจะถูกเก็บไว้หลังจากการแปลง Hough
Rho: ความแม่นยำระยะทางในพิกเซล
Theta: ความแม่นยำของมุมในเรเดียน
Threshold: ค่าที่ต้องเข้าถึงเมื่อชิ้นส่วนเป็นเส้นตรง
SRN: ระยะห่างจากตัวหารของพารามิเตอร์ Rho โดยมีค่าเริ่มต้นที่ 0
STN: ระยะห่างจากตัวหารพารามิเตอร์ค่าเริ่มต้นค่าเริ่มต้น 0
min_theta: มุมต่ำสุดของเส้นที่ตรวจพบ
max_theta: มุมสูงสุดของเส้นที่ตรวจพบ
รหัสตัวอย่าง:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.loadLibrary (core.native_library_name); mat srcimage = imgcodecs.imread ("f: //6597210504144579394.jpg"); mat dstimage = srcimage.clone (); imgproc.canny (srcimage, dstimage, 400, 500, 5, false); การจัดเก็บเสื่อ = mat ใหม่ (); imgproc.houghlines (dstimage, ที่เก็บ, 1, math.pi / 180, 200, 0, 0, 0, 10); สำหรับ (int x = 0; x <storage.rows (); x ++) {double [] vec = storage.get (x, 0); double rho = vec [0]; สอง theta = vec [1]; จุด PT1 = จุดใหม่ (); จุด PT2 = จุดใหม่ (); double a = math.cos (theta); double b = math.sin (theta); double x0 = a * rho; double y0 = b * rho; pt1.x = math.round (x0 + 1000 * (-b)); pt1.y = math.round (y0 + 1000 * (a)); pt2.x = math.round (x0 - 1000 * (-b)); pt2.y = math.round (y0 - 1000 * (a)); if (theta> = 0) {imgproc.line (srcimage, pt1, pt2, สเกลาร์ใหม่ (255, 255, 255, 255), 1, imgproc.line_4, 0); }} imgcodecs.imwrite ("f: //dst2.jpg", srcimage); - ความน่าจะเป็นแบบสะสม Hough Transformation:
imgproc.houghlinesp (ภาพเสื่อ, เส้นเสื่อ, คู่ rho, สอง theta, เกณฑ์ int, minlinelength คู่, double maxlineGap)
คำอธิบายพารามิเตอร์:
รูปภาพ: ภาพต้นทาง
บรรทัด: เวกเตอร์เอาท์พุทของเส้นที่ตรวจพบจะถูกเก็บไว้หลังจากการแปลง Hough
Rho: ความแม่นยำระยะทางในพิกเซล
Theta: ความแม่นยำของมุมในเรเดียน
Threshold: ค่าที่ต้องเข้าถึงเมื่อชิ้นส่วนเป็นเส้นตรง
Minlinelength: ความยาวของส่วนบรรทัดต่ำสุดเริ่มต้นถึง 0
MaxLineGap: ระยะทางสูงสุดที่อนุญาตให้เชื่อมต่อคะแนนกับคะแนนในบรรทัดเดียวกันค่าเริ่มต้นคือ 0
รหัสตัวอย่าง:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.loadLibrary (core.native_library_name); mat srcimage = imgcodecs.imread ("f: //6597210504144579394.jpg"); mat dstimage = srcimage.clone (); imgproc.canny (srcimage, dstimage, 400, 500, 5, false); การจัดเก็บเสื่อ = mat ใหม่ (); imgproc.houghlinesp (dstimage, ที่เก็บ, 1, math.pi / 180, 50, 0, 0); สำหรับ (int x = 0; x <storage.rows (); x ++) {double [] vec = storage.get (x, 0); double x1 = vec [0], y1 = vec [1], x2 = vec [2], y2 = vec [3]; จุดเริ่มต้น = จุดใหม่ (x1, y1); จุดสิ้นสุด = จุดใหม่ (x2, y2); imgproc.line (srcimage, start, end, scalar ใหม่ (255, 255, 255, 255), 1, imgproc.line_4, 0); } imgcodecs.imwrite ("f: //dst2.jpg", srcimage); - ภาพต้นทาง:
ผลการแปลงมาตรฐาน Hough:
ผลการเปลี่ยนแปลงความน่าจะเป็นแบบสะสม: ผลการเปลี่ยนแปลง:
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น