티스토리 뷰
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는 보존하면서 노이즈만 줄이는 것이다.
'나의 공부방' 카테고리의 다른 글
| [Product] 개발자를 위한 제품 그로스 및 프로덕트 데이터 관련 지식 총정리 (2) | 2025.09.16 |
|---|---|
| [Slack] 슬랙봇 DM 및 채널 메시지 연동하여 운영 자동화하기 (0) | 2025.02.11 |
| [개발서적] 구글 엔지니어는 이렇게 일한다 핵심 내용 정리 및 요약 (8) | 2024.12.10 |
| [Tool] 유용한 MacOS 앱 및 크롬 익스텐션(Chrome Extensions) 정리 (7) | 2024.10.29 |
| [개발서적] 단위 테스트(Unit Testing) 핵심 내용 정리 및 요약 (16) | 2024.10.15 |