Segmentation

hunnypooh·2022년 10월 21일
0

Laplacian

  • 두번 미분한거

Gradient

  • 한번 미분한 거

  • x, y로 미분한 값은 마스크를 씌워서 얻어짐
    • x미분에서는 x방향이라서 세로 edge가, y 미분은 y 방향이라서 가로 edge가 잘 보임
    • 미분에서 배경이 회색인 이유는, 음수값을 만들지 않기 위해서 α\alpha 값이 더해졌기 때문
    • Gradient는 음수값이 없어서 검은색 바탕.


(<-결과. 같은 edge는 같은 색!)

Canny Edge

  • edge 찾는 알고리즘 중 가장 성능이 좋음
  • Thin edges by keep
    • not always at the location of an edge
    • there are many thick edges

(빨간색 원이 다 edge.)

  • Gradient Orientation
    • Reduce angle of Gradient 𝛼(𝑥, 𝑦) to one of the 4 sectors
      • 방향에 상관없이 기울기만 받아서 4영역. 반대는 똑같으니까 총 8개 영역ㅇㅇ
    • Check the 3x3 region of each 𝑓(𝑥, 𝑦)
    • If the value at the center is not greater than the 2 values along the gradient, then 𝑓(𝑥, 𝑦) is set to 0

  • 다 같은 방향이고 edge임 → 대푯값만 선택
    • 대폿값을 기준으로 증가했다가 감소면 남김
    • 0 1 2로 증가하면 지움
    • 0 1 1 처럼 애매하면 남김

Hough Transform

a-b 평면

  • 여러 점을 지나는 직선을 찾음
  • a-b 평면에서 P1을 지나는 모든 직선은 하나의 직선으로 표현이 됨.
    • b=ax1+y1b = -ax_1 + y_1
    • 기울기 : x1-x_1
  • P2도 그렸을 때 a-b 평면에서 P1과의 교점에서 P1, P2를 지나는 직선을 추출할 수 있음.
  • 문제점 : 기울기가 무한대에 가까워서 교점도 무한대에 가깝다면 속도가 느려짐. 비효율적! ⇒ 직선의 표현을 삼각함수로 바꾸자!

삼각함수

  • a1, a2, a3가 한 직선에 있는지 알아내기 위해서 삼각함수로 변환 후, 만나는 점이 2개 이상인거 찾음.

  • 허프 누적 행렬의 숫자를 다 업데이트한 후, 배열을 읽어서 최댓값을 알아내면 됨.
    • 이걸로 θ,ρ\theta, \rho 값을 알 수 있음
    • 그러면 직선을 알 수 있음!

Hough Transform 구현

import cv2 as cv
import numpy as np

img = cv.imread("edge.png", cv.IMREAD_GRAYSCALE)
H, W = img.shape[:]
output = np.zeros((H, W), img.dtype)
sum_max = 0
theta_at_max = 0
rho_at_max = 0

# 1. 행렬 생성
cm = np.zeros((100,H+W+1), img.dtype)

# 2. 누적 행렬 구성
for y in range(H):
    for x in range(W):
        if img[y, x] == 255:
            for t in range(100):
                theta = np.pi / 100 * t
                # the normal represtentaion of a line
                rho = x * np.cos(theta) + y * np.sin(theta)
                r = int(rho + (H+W+1)/2) # x좌표 값은 음수가 아닌 정수가 들어가야 하므로 중간 값을 더해줌.
                cm[t, r] = cm[t, r] +1
                if(sum_max < cm[t, r]) :
                    sum_max = cm[t, r]
                    theta_at_max = theta
                    rho_at_max = rho


# 3. 허프 누적 행렬의 최댓값 선정 알고리즘 작성
# theta, rho 값 획득

theta = theta_at_max
rho = rho_at_max

# 4. 획득한 라인 그리기

for j in range(W):
    y = (rho - j * np.cos(theta))/np.sin(theta)
    output[int(y + 0.5), j] = 255 #반올림

cv.imshow("input", img)
cv.imshow("output", output)
cv.waitKey(0)

응용) 한 지점에서 여러 직선 검출됨

응용) 회전하기

  • 저 케이블은 케이블보다 큰 구조적요소 이용해서 침식 연산으로 케이블 제거.
profile
간단한것들 정리

0개의 댓글