티스토리 뷰

나의 공부방

[Image] 소벨 필터(Sobel Filter)란?

망나니개발자 2026. 3. 17. 10:00
반응형

 

 

1. 소벨 필터(Sobel Filter)란?


[ 소벨 필터란? ]

소벨 필터란 이미지에서 경계(edge)를 검출하기 위한 필터이다. 여기서 경계(edge)란 이미지에서 픽셀 값이 급격하게 변하는 구간을 말한다. 예를 들어 왼쪽은 어둡고 오른쪽은 밝은 이미지가 있다고 하자. 그러면 급변하는 그 지점을 우리는 edge라고 한다.

 10  10  10 | 200  200
 10  10  10 | 200  200
 10  10  10 | 200  200
            ↑
    여기서 값이 10→200으로 급변 = edge!

 

 

원본의 이미지에서 edge를 추출한 예시 그림을 보면 다음과 같다.

 

 

 

[ 소벨 필터의 동작 방식 ]

미분(변화량 측정하기)

소벨 필터는 두 가지 연산을 한 번에 하는 커널인데, 첫 번째는 미분이다. 미분은 특별한 개념이 아니라, 그저 "얼마나 변했는가"를 표현하는 수단이다. 예를 들어 이미지의 가로로 보았을 때, [50, 50, 200] 픽셀이 존재한다고 하자. 중간을 기준으로 왼쪽과 오른쪽은 150 픽셀 정도의 차이를 보인다.

픽셀 값:  50  50  200

변화량 = 오른쪽 - 왼쪽 = 200 - 50 = 150

 

 

이것이 바로 미분(변화량)이며, 이것을 가운데 픽셀 기준으로 수식으로 쓰면 다음과 같다. 즉, [-1, 0, 1]과 같이 계산이 되도록 배열을 만드는 것이다.

(-1 × 왼쪽) + (0 × 가운데) + (1 × 오른쪽)
= (-1 × 50) + (0 × 50) + (1 × 200) = 150

 

 

이미지 안에 그림은 연속성이 있으니, 이제 3x3으로 만들어서 확장할 필요가 있다. 그러면 이제 왼쪽과 오른쪽의 차이를 비교할 수 있게 된다.

  • 왼쪽 열 (-1, -1, -1): 왼쪽 픽셀들을 빼고
  • 가운데 열 (0, 0, 0): 가운데는 무시하고
  • 오른쪽 열 (1, 1, 1): 오른쪽 픽셀들을 더한다

 

그리고 가로 방향으로의 픽셀 변화량과 세로 방향으로의 픽셀 변화량을 감지하기 위해 2가지 필터를 만들 수 있다.

 

 

 

 

가로 방향의 필터를 활용하면 다음과 같이 변화의 차이를 알 수 있게 된다.

몇 가지 경우:
50  50  50   →  (-1×50) + (0×50) + (1×50)  =  0     변화 없음
50  50  200  →  (-1×50) + (0×50) + (1×200) =  150   오른쪽이 밝아짐
200 50  50   →  (-1×200)+ (0×50) + (1×50)  = -150   왼쪽이 밝았음

 

 


스무딩(부드럽게 평균내기)

노이즈(noise)란 카메라로 사진을 찍을 때 원래 없어야 하는 엉뚱한 값이 생기는 현상이다. 어두운 곳에서 핸드폰으로 사진 찍으면 거칠거칠한 점들이 보이는데, 그게 노이즈다.

깨끗한 이미지:       노이즈가 낀 이미지:
50  50  50          50   50   50
50  50  50          50  250   50    ← 250은 노이즈!
50  50  50          50   50   50

 

 

문제는 소벨 필터가 "값이 급변하는 곳 = edge"로 판단하기 때문에, 노이즈도 edge로 오인할 수 있다는 것이다. 따라서 스무딩 기법을 적용하여 주변 값들을 평균내서 이런 튀는 값을 깎아낸다.

노이즈 값 250 주변의 평균:
(50 + 250 + 50) / 3 = 116  ← 부드러워짐

 

 

소벨은 단순 평균 [1 1 1] 대신 [1 2 1]을 사용한다. 가운데에 가중치 2를 줘서 가까운 값을 더 신뢰하는 것이다.

비유: 내 바로 옆자리 친구가 "저기 edge 있어"라고 하는 것과, 멀리 있는 사람이 "저기 edge 있어"라고 하는 것 중 옆자리 친구 말을 더 믿는 것이다.

 

 

만약 가중치 유무에 따라 노이즈의 영향도를 비교해보면 그 차이를 알 수 있다.

값: 250  50  50
        ↑ 가운데(정상)

단순 평균 [1 1 1]:  (250 + 50 + 50) / 3 = 116  ← 노이즈에 많이 끌려감
가우시안  [1 2 1]:  (250 + 100 + 50) / 4 = 100  ← 가운데를 더 믿어서 덜 끌려감

 

 

 

소벨 커널(미분과 스무딩)

이제 이 둘을 합하면 소벨 커널이 나오게 된다. 

 

 

이 커널을 이미지 위에서 한 칸씩 이동시키며 계산한다. 각 위치에서 커널과 픽셀 값을 곱해서 합산(컨볼루션)하고, 그 결과값이 크면 edge, 작으면 edge가 아니라고 판단한다.

1단계: 왼쪽 위부터 시작       2단계: 한 칸 오른쪽으로 이동
[■ ■ ■] . . .               . [■ ■ ■] . .
[■ ■ ■] . . .               . [■ ■ ■] . .
[■ ■ ■] . . .               . [■ ■ ■] . .
 .  .  .  . . .               .  .  .  . .

... 한 줄이 끝나면 아래로 이동하여 반복

 

 

예를 들어 이번에 필터를 적용하는 3x3 영역이 다음과 같이 존재한다고 할 때, 필터를 적용해서 합계를 구하면 특정한 값이 나온다. 그러면 중간의 값이 왼쪽과 오른쪽 좌표의 값과 비교했을 때의 변화량이 나오게 된 것인데, 이때 그 값이 크면 edge라고 볼 수 있다.

이미지에서 3x3 영역을 꺼냄:
 50   50  200
 50   50  200
 50   50  200

커널과 곱해서 합산:
(-1×50) + (0×50) + (1×200)  = 150
(-2×50) + (0×50) + (2×200)  = 300
(-1×50) + (0×50) + (1×200)  = 150

합계: 150 + 300 + 150 = 600  ← 값이 크다 = edge!

 

 

만약 변화가 없는 영역이라면, 0이 나오면서 edge가 아님을 알 수 있다.

 50   50   50

(-1×50) + (0×50) + (1×50) = 0  ← edge 아님

 

 

 

[ 노이즈와 Edge의 구분 ]

핵심은 3개 픽셀을 연속으로 보기 때문이다. 1개 픽셀만 보면 그게 edge인지 노이즈인지 알 수 없지만, 3개를 연속으로 보면 패턴이 보인다. 

  • edge: 여러 줄이 같은 패턴으로 이어진다
 50 | 200
 50 | 200     ← 세로로 값이 전부 같음
 50 | 200

세로로 평균내도: (200 + 200 + 200) / 3 = 200  → 안 변함!

 

 

  • 노이즈: 한 점만 혼자 튀어있다
  50
 250    ← 혼자만 튀어있음
  50

세로로 평균내면: (50 + 250 + 50) / 3 = 116  → 깎여나감!

 

 

소벨의 [1 2 1] 스무딩은 이 원리를 이용해 edge는 보존하면서 노이즈만 줄이는 것이다.

 

 

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함