π λ³Έ μμ λ Window10μ VSCode, Python3.11.0λ‘ μμ±λμμ΅λλ€.
μμμμ μμ§(edge)λ νμͺ½ λ°©ν₯μΌλ‘ ν½μ κ°μ΄ κΈκ²©νκ² λ°λλ λΆλΆμ κ°λ¦¬ν¨λ€.
μ¦, μ΄λμ΄ μμμμ κ°μκΈ° λ°μμ§κ±°λ λλ λ°λλ‘ λ°μ μμμμ κΈκ²©νκ² μ΄λμμ§λ λΆλΆμ μμ§λΌκ³ νλ€.
μΌλ°μ μΌλ‘ κ°μ²΄μ λ°°κ²½μ κ²½κ³, λλ κ°μ²΄μ λ€λ₯Έ κ°μ²΄μ κ²½κ³μμ μμ§κ° λ°μνλ€.
μ΄λ¬ν μμ§λ₯Ό μ°Ύμλ΄λ μμ μ μμ λ΄ κ°μ²΄μ μ€κ³½μ μμλΌ μ μλ μ μ©ν λ°©λ²μ΄λ©°, λ€μν Computer Vision μμ€ν μμ κ°μ²΄ νλ³μ μν μ μ²λ¦¬λ‘ μμ§ κ²μΆμ΄ μ¬μ©λλ€.
κΈ°λ³Έμ μΌλ‘ μμμμ μμ§λ₯Ό μ°Ύμλ΄λ €λ©΄ ν½μ κ°μ λ³νμ¨μ΄ ν° ν½μ μ μ νν΄μΌ νλ€.
- μνμμ ν¨μ λλ λ°μ΄ν°μ λ³νμ¨μ λ―ΈλΆ(derivative)μ΄λΌκ³ νλ€.
- μμμ 2μ°¨μ νλ©΄μμ μ μλ ν¨μμ΄κΈ° λλ¬Έμ μμμ κ°λ‘, μΈλ‘ λ°©ν₯μΌλ‘ κ°κ° λ―ΈλΆν΄μΌ νλ€.
μ λ§μ€ν¬λ‘ μ€μ μ°¨λΆμ μ΄μ©ν μμμ λ―ΈλΆ κ·Όμ¬λ λ§μ€ν¬ μ°μ°μ μ΄μ©νμ¬ κ΅¬ν μ μλ€.
(βνΈλ―ΈλΆ κ·Όμ¬ μμμ κ·Έλλ‘ μ μ©νμ¬ κ³μ°νλ €λ©΄ νν° λ§μ€ν¬ κ°μ 1/2λ₯Ό κ³±ν΄μΌ νμ§λ§ λ³΄ν΅ λ―ΈλΆ κ°μ μλμ ν¬κΈ°λ₯Ό μ€μμ νκΈ° λλ¬Έμ μμ κ°μ΄ λ¨μνμν¨ λ§μ€ν¬λ₯Ό μ£Όλ‘ μ¬μ©νλ€.)
μ΄ λ§μ€ν¬λ€μ μ¬μ©νμ¬ νν°λ§νλ©΄ κ°λ‘ λ°©ν₯κ³Ό μΈλ‘ λ°©ν₯μΌλ‘ νΈλ―ΈλΆν μ 보λ₯Ό λ΄κ³ μλ νλ ¬μ μ»μ μ μλ€.
import cv2
import numpy as np
if __name__ == "__main__":
img = cv2.imread("test.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("origin",img)
x_mask = np.array([-1,0,1])
y_mask = np.array([[-1],[0],[1]])
x_edge = cv2.filter2D(img,-1,x_mask)
cv2.imshow("x_edge",x_edge)
y_edge = cv2.filter2D(img,-1,y_mask)
cv2.imshow("y_edge",y_edge)
# edge ν©μΉκΈ°
edges = cv2.magnitude(x_edge.astype(np.float32), y_edge.astype(np.float32))
cv2.imshow("edge",edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
μμ κ²°κ³Όλ₯Ό 보면 μ΅μ’ κ²°κ³Όμ μ‘μμ΄ λ§μ΄ μμ΄ μ λλ‘ μμ§κ° κ²μΆμ΄ λμ§ μμλ€.
κ·Έλμ μ€μ μμμμλ 1x3, 3x1 λ§μ€ν¬ λμ μ‘μμ μν₯μ μ€μΌ μ μλλ‘ μ’ λ ν° ν¬κΈ°μ λ§μ€ν¬λ₯Ό μ΄μ©νλ€.
μ¬λ¬κ°μ§μ λ―ΈλΆ κ·Όμ¬ λ§μ€ν¬κ° κ°λ°λμμ§λ§ κ·Έμ€ κ°μ₯ λ리 μ¬μ©λλ κ²μ μ벨 νν°(Sobel Filter) λ§μ€ν¬ μ΄λ€.
import cv2
import numpy as np
if __name__ == "__main__":
img = cv2.imread("test.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("origin",img)
# sobel νν° μ μ©
sobel_x = cv2.Sobel(img,cv2.CV_32F,1,0,ksize=3) # μν μμ§
cv2.imshow("x_edge",sobel_x)
sobel_y = cv2.Sobel(img,cv2.CV_32F,0,1,ksize=3) # μμ§ μμ§
cv2.imshow("y_edge",sobel_y)
# edge ν©μΉκΈ°
edges = cv2.magnitude(sobel_x,sobel_y)
# μ κ·ν
edges = cv2.normalize(edges, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
# Thresholding (μμ§ κ°μ‘°)
_, edges = cv2.threshold(edges, 50, 255, cv2.THRESH_BINARY)
cv2.imshow("edge",edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
μκ³κ°μ μ‘°μ νμ¬ λΆνμν μ‘μμ μ κ±°νλ©΄ μ’λ μμ§κ° μ κ²μΆλλ€.
Sobel λ§μ€ν¬λ₯Ό μ¬μ©νλ λ°©λ²μ ꡬνμ΄ κ°λ¨νκ³ λΉ λ₯΄κ² λμνκΈ° λλ¬Έμ λ§μ΄ μ¬μ©λλ, κ·ΈλλμΈνΈ ν¬κΈ°λ§μ κΈ°μ€μΌλ‘ μμ§ ν½μ μ κ²μΆνκΈ° λλ¬Έμ μκ³κ°μ λ―Όκ°νκ³ μμ§ ν½μ μ΄ λκ»κ² ννλλ λ¬Έμ μ μ΄ μλ€.
μ΄λ° λ¨μ μ ν΄κ²°νκΈ° μν΄ λ€μμ 쑰건μ λ§μ‘±νλ Canny Edgeκ° λμλ€.
- μ νν κ²μΆ : μμ§λ₯Ό κ²μΆνμ§ λͺ»νκ±°λ λλ μμ§κ° μλλ° μμ§λ‘ κ²μΆνλ νλ₯ μ΅μν.
- μ νν μμΉ : μ€μ μμ§μ μ€μ¬μ μ°ΎμμΌν¨.
- λ¨μΌ μμ§ : νλμ μμ§λ νλμ μ μΌλ‘ νν.
Cannyλ λ€μκ³Ό κ°μ μνκ³Όμ μ ν΅ν΄ κ²°κ³Όκ° λμ¨λ€.
- κ°μ°μμ νν°λ§
- κ·ΈλλμΈνΈ κ³μ°(3x3 Sobel λ§μ€ν¬λ₯Ό μ¬μ©)
- λΉμ΅λ μ΅μ
- μ΄μ€ μκ³κ°μ μ΄μ©ν νμ€ν 리μμ€ μμ§ νΈλνΉ
μ΄λ κ² λ³΅μ‘ν κ³Όμ μ λ°λ‘ κ±°μΉμΉ μκ³ Canny ν¨μλ‘ μ½κ² μ¬μ©ν μ μλ€.
import cv2
if __name__ == "__main__":
img = cv2.imread("test.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("origin",img)
canny = cv2.Canny(img,threshold1=100,threshold2=200)
cv2.imshow("canny",canny)
cv2.waitKey(0)
cv2.destroyAllWindows()
μκ³κ°μ μ‘°μ ν΄ μ’ λ μ¬μΈνκ² κ²μΆ ν μ μλ€.
μ΄λ κ² κ²μΆν μμ§λ₯Ό κ°μ§κ³ μ§μ κ²μΆμ ν μ μλ€.
μμμμ μ§μ μ μ°Ύλ λ°©λ²μ νν λ³ν(Hough Transform) κΈ°λ²μ΄ λ리 μ¬μ©λλ€.
- 2μ°¨μ xy μ’νμμ μ§μ μ λ°©μ μμ νλΌλ―Έν° 곡κ°μΌλ‘ λ³νΈλνμ¬ μ§μ μ μ°Ύλ μκ³ λ¦¬μ¦μ΄λ€.
import cv2
import numpy as np
if __name__ == "__main__":
img = cv2.imread("test.jpg")
cv2.imshow("origin",img)
img_g = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(img_g,50,150)
lines = cv2.HoughLinesP(edges,1,np.pi / 180, threshold=100,minLineLength=50,maxLineGap=10)
if lines is not None:
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2) # μ΄λ‘μμΌλ‘ μ§μ 그리기
cv2.imshow("Canny Edges", edges)
cv2.imshow("Detected Lines", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
ννλ³ν λ°©λ²μ μ§μ λΏλ§ μλλΌ μλ κ²μΆν μ μλ€.
import cv2
import numpy as np
if __name__ == "__main__":
# μ΄λ―Έμ§ μ½κΈ°
img = cv2.imread("test3.jpg")
cv2.imshow("Original Image", img)
# κ·Έλ μ΄μ€μΌμΌ λ³ν
img_g = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Canny μ£μ§ κ²μΆ
edges = cv2.Canny(img_g, 50, 150)
# νν λ³νμ μ¬μ©νμ¬ μ κ²μΆ (μ£μ§ μ΄λ―Έμ§ μ¬μ©)
circles = cv2.HoughCircles(edges,
cv2.HOUGH_GRADIENT,
dp=1,
minDist=30, # μ κ°μ μ΅μ 거리 μ‘°μ
param1=50, # Canny μ£μ§ κ²μΆμ μνκ° μ‘°μ
param2=30, # μ κ²μΆμ μκ³κ° μ‘°μ
minRadius=10, # μ΅μ λ°μ§λ¦ μ‘°μ
maxRadius=100) # μ΅λ λ°μ§λ¦ μ‘°μ
# μ 그리기
if circles is not None:
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
# μμ μ€μ¬ 그리기
cv2.circle(img, (i[0], i[1]), 5, (0, 255, 0), -1)
# μ 그리기
cv2.circle(img, (i[0], i[1]), i[2], (255, 0, 0), 2)
# κ²°κ³Ό μ΄λ―Έμ§ νμ
cv2.imshow("Canny Edges", edges)
cv2.imshow("Detected Circles", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
'AI > Computer Vision' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Computer Vision] μμμ μ΄μ§νμ λͺ¨ν΄λ‘μ§ (0) | 2024.09.03 |
---|---|
[Computer Vision] μ»¬λ¬ μμ μ²λ¦¬ (0) | 2024.09.02 |
[Computer Vision] μμμ κΈ°ννμ λ³ν (0) | 2024.08.30 |
[Computer Vision] Filtering (0) | 2024.08.30 |
[Computer Vision] μμμ λͺ μ μ μ΄ (0) | 2024.08.28 |