ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ν—ˆν”„ λ³€ν™˜ (Hough Transformation)
    AI\ML\DL/Computer Vision 2023. 8. 9. 23:07
    λ°˜μ‘ν˜•

    ✣

    ν—ˆν”„ λ³€ν™˜μ˜ λ™μž‘μ„ μš”μ•½ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€. μž…λ ₯된 각각의 점 $(x_{i},y_{i})$ 에 λŒ€ν•΄ $(a,b)$ 곡간에 직선 $b=-ax_{i}+y_{i}$λ₯Ό κ·Έλ¦° λ‹€μŒ 이듀 직선이 λ§Œλ‚˜λŠ” 점 $(a,b)$λ₯Ό μ°Ύμ•„ $a$λ₯Ό 기울기, $b$λ₯Ό $y$절편으둜 μ·¨ν•œλ‹€. λ§Œλ‚˜λŠ” 점은 νˆ¬ν‘œλ‘œ μ•Œμ•„λ‚Έλ‹€.

     

    "νˆ¬ν‘œ"의 의미?

    각각의 직선은 μžμ‹ μ΄ μ§€λ‚˜λŠ” 점에 1λ§ŒνΌμ”© νˆ¬ν‘œλ₯Ό ν•œλ‹€. κ²°κ΅­ 직선이 μ§€λ‚˜μ§€ μ•ŠλŠ” 곳은 0, 직선이 μ§€λ‚˜λŠ” 곳은 1ν‘œ, 두 직선이 λ§Œλ‚˜λŠ” 곳은 2ν‘œλ₯Ό λ°›λŠ”λ‹€. 

    ν—ˆν”„ λ³€ν™˜μ˜ 원리

    μ•žμ„œ μ„€λͺ…ν•œ ν—ˆν”„ λ³€ν™˜μ€ 이상적인 상황을 κ°€μ •ν–ˆλ‹€. μ‹€μ œ μƒν™©μ—μ„œ κ΅¬ν˜„ν•˜ λ•ŒλŠ” λͺ‡ 가지 사항을 μ‹ μ€‘νžˆ κ³ λ €ν•΄μ•Ό ν•œλ‹€. 

    1) μœ„ κ·Έλ¦Όμ—μ„œλŠ” 두 점만 κ³ λ €ν–ˆλŠ”λ° ν˜„μ‹€μ—μ„œλŠ” λ§Žμ€ 점이 있고 점듀이 μ™„λ²½νžˆ 일직선을 이루지 λͺ»ν•¨
    -> 이 λ¬Έμ œλŠ” (a,b)곡간을 μ΄μ‚°ν™”ν•˜μ—¬ ν•΄κ²°ν•œλ‹€. 예λ₯Ό λ“€μ–΄ a와 b의 λ²”μœ„λ₯Ό -1000~1000으둜 μ„€μ •ν•˜κ³  각각을 크기가 20인 ꡬ간 50개둜 λ‚˜λˆ„μ–΄ 칸이 50x50=2500 개인 2차원 λˆ„μ  λ°°μ—΄ vλ₯Ό λ§Œλ“ λ‹€. vλ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•œ λ‹€μŒ (a,b)κ³΅κ°„μ—μ„œ 각각의 직선은 μžμ‹ μ΄ μ§€λ‚˜λŠ” λͺ¨λ“  칸에 1λ§ŒνΌμ”© νˆ¬ν‘œν•œλ‹€.

    2) νˆ¬ν‘œκ°€ 이루어진 λˆ„μ  배열에 작음이 λ§Žλ‹€.

    -> 이 λ¬Έμ œλŠ” λΉ„μ΅œλŒ€ μ–΅μ œλ₯Ό μ‚¬μš©ν•œλ‹€. 지역 μ΅œλŒ€μ (극점, extreme point)만 남기고 μž„κ³„κ°’μ„ μ„€μ •ν•˜μ—¬ 칸을 μ΅œμ’… μ„ νƒν•œλ‹€. 

     

    λΉ„μ΅œλŒ€ μ–΅μ œλ‘œ 찾은 극점 2개. κ·Έλ¦Όμ—μ„œ λΉ„μ΅œλŒ€ μ–΅μ œλ‘œ 점이 3개 λ‚¨μ•˜λŠ”λ° μž„κ³—κ°’μ„ 5둜 μ„€μ •ν•˜λ©΄ λ…Έλž€μƒ‰μœΌλ‘œ μΉ ν•œ 점 2개만 μ΅œμ’… μ„ νƒλœλ‹€.

    ν—ˆν”„ λ³€ν™˜μ€ 직선 뿐 μ•„λ‹ˆλΌ μ΄λ‘ μ μœΌλ‘œλŠ” μ–΄λ–€ λ„ν˜•μ΄λΌλ„ κ²€μΆœν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ 원을 κ²€μΆœν•˜λ €λ©΄ μ›μ˜ 방정식을 μ΄μš©ν•œλ‹€. 이 식은 a와 b,r을 ν¬ν•¨ν•˜λ―€λ‘œ (a,b,r) 3차원 λˆ„μ  배열을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 

    $$(x-a)^{2}+(y-b)^{2}=r^{2}$$

     

    ν—ˆν”„ λ³€ν™˜ ν™œμš©

     

    원을 κ²€μΆœν•˜λŠ” ν—ˆν”„ λ³€ν™˜μœΌλ‘œ 사과 λ‚˜λ¬΄ μ˜μƒμ—μ„œ 사과λ₯Ό κ²€μΆœν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€μ–΄ 보자. 

    cv.HougCircles ν•¨μˆ˜λŠ” λͺ…μ•” μ˜μƒμ—μ„œ 원을 κ²€μΆœν•΄ 쀑심과 λ°˜μ§€λ¦„μ„ μ €μž₯ν•œ 리슀트λ₯Ό λ°˜ν™˜λ‹€. 

    두 번째 μΈμˆ˜λŠ” μ—¬λŸ¬ λ³€ν˜• μ•Œκ³ λ¦¬μ¦˜ μ€‘μ˜ ν•˜λ‚˜λ₯Ό μ§€μ •ν•˜λŠ”λ° cv.HOUGH_GRADIENTλŠ” 에지 λ°©ν–₯ 정보λ₯Ό μΆ”κ°€λ‘œ μ‚¬μš©ν•˜λŠ” 방법이닀. 

    μ„Έ 번째 μΈμˆ˜λŠ” λˆ„μ  λ°°μ—΄μ˜ 크기λ₯Ό μ§€μ •ν•˜λŠ”λ° 1둜 μ„€μ •ν•˜λ©΄ μž…λ ₯ μ˜μƒκ³Ό 같은 크기λ₯Ό μ‚¬μš©ν•œλ‹€. 

    λ„€ 번째 μΈμˆ˜λŠ” 원 μ‚¬μ΄μ˜ μ΅œμ†Œ 거리λ₯Ό μ§€μ •ν•˜λŠ”λ° μž‘μ„μˆ˜λ‘ λ§Žμ€ 원이 κ²€μΆœλœλ‹€. λ‹€μ„― 번째 μΈμˆ˜λŠ” μΊλ‹ˆ 에지 μ•Œκ³ λ¦¬μ¦˜μ΄ μ‚¬μš©ν•˜λŠ” $T_{high}$λ‹€. μ—¬μ„― 번째 μΈμˆ˜λŠ” λΉ„μ΅œλŒ€ μ–΅μ œλ₯Ό μ μš©ν•  λ•Œ μ“°λŠ” μž„κ³„κ°’μ΄λ‹€. μΌκ³±λ²ˆμ§Έμ™€ μ—¬λŸλ²ˆμ§ΈλŠ” μ›μ˜ μ΅œμ†Œμ™€ μ΅œλŒ€ λ°˜μ§€λ¦„μ„ μ§€μ •ν•œλ‹€. 

     

    import cv2
    import cv2 as cv
    
    img = cv.imread('apples.jpg')
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    
    
    apples = cv.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=40,
    minRadius=15, maxRadius=60)
    
    for i in apples[0]:
        cv.circle(img, (int(i[0]), int(i[1])), int(i[2]), (255, 0, 0), 2)
    cv.imshow('Apple detection', img)
    
    cv.waitKey()
    cv.destroyAllWindows()

    μ‹€ν–‰ κ²°κ³Ό 사과λ₯Ό μ œλŒ€λ‘œ 찾은 κ²½μš°λ„ μžˆμ§€λ§Œ, μ—†λŠ” 곳을 κ²€μΆœν•œ 거짓 긍정과, μžˆλŠ”λ° λ†“μΉœ 거짓 뢀정도 μžˆλ‹€. 

    λ˜ν•œ μœ„μΉ˜κ°€ 틀어진 κ²½μš°λ„ μžˆλ‹€. HoughCircles ν•¨μˆ˜μ˜ μΈμˆ˜κ°’μ„ 이리저리 λ³€κ²½ν•˜λ©° μ‹€ν—˜μ΄ ν•„μš”ν•˜λ‹€. 

Designed by Tistory.