흑백 사진은 종이 위 위치마다 밝기 숫자가 하나씩 적힌 지도다. 컬러 사진은 빨강·초록·파랑 세 장의 지도를 겹친 것이다. 이렇게 보면 사진은 위치를 넣으면 밝기를 돌려주는 함수가 되고, 윤곽선은 그 함수가 급하게 변하는 곳이다. 단, 세 장의 지도를 숫자로 더해 한 장으로 합치면 색이 사라지므로 세 값을 따로(벡터로) 들고 있어야 한다.
예시로 보기
가로 6칸, 세로 4칸의 흑백 이미지에서 왼쪽 세 칸은 밝기 100, 오른쪽 세 칸은 20이다.
x → 0 1 2 3 4 5
100 100 100 20 20 20 y = 0
100 100 100 20 20 20 y = 1
100 100 100 20 20 20 y = 2
100 100 100 20 20 20 y = 3
칸 하나하나가 \(i(x, y)\)의 값이다. 예를 들어 \(i(1, 2) = 100\), \(i(4, 0) = 20\)이다. 옆 칸과의 차이를 가로 방향으로 재면 \(x = 2\)와 \(3\) 사이에서만 \(20 - 100 = -80\)이고 나머지는 0이다. 세로 방향 차이는 어디서나 0이다. 윤곽선은 차이가 큰 곳, 곧 가운데의 세로 경계다.
컬러 사진은 빨강·초록·파랑 채널 사진 세 장으로 나눌 수 있다. 채널마다 그 색 빛의 밝기 분포다.
정의
- 단색 이미지: 2차원 공간에 대한 밝기 변화 함수 \(i(x, y)\). 위치 \((x, y)\)에서의 밝기를 돌려준다.
- 컬러 이미지: 빨강·초록·파랑에 대한 밝기 변화를 함께 가진 함수. 각 위치에서 세 값을 가지므로 벡터 값 함수로 쓴다.
- 윤곽선: 평면에 대한 밝기(또는 색) 변화의 정도 \(\nabla i(x, y)\). \(\nabla i = \left(\dfrac{\partial i}{\partial x}, \dfrac{\partial i}{\partial y}\right)\)이고(\(\partial i / \partial x\)는 오른쪽으로 조금 움직일 때 밝기가 얼마나 바뀌는지, \(\partial i / \partial y\)는 위아래로 조금 움직일 때의 변화), 크기 \(\lVert \nabla i \rVert\)(\(\lVert\cdot\rVert\)는 벡터의 길이)가 윤곽의 세기, 방향이 밝기가 가장 빨리 느는 방향이다.
컬러 이미지를 \(i(x,y) = i_R(x,y) + i_G(x,y) + i_B(x,y)\)로 적기도 한다. 이 덧셈은 빨간 채널 사진, 초록 채널 사진, 파란 채널 사진을 겹친다는 뜻이다. 채널 사진을 각각 \((i_R, 0, 0)\), \((0, i_G, 0)\), \((0, 0, i_B)\)라는 벡터로 보면 합이 위의 벡터와 같다.
공간 주파수. 평면 위에서 밝기가 얼마나 촘촘히 바뀌는지를 cycle/m로 잰다. 한 방향으로 사인 모양으로 바뀌는 줄무늬 \(i(x) = m + a\sin(2\pi u x)\)에서 \(u\)가 공간 주파수다. \(u = 500\) cycle/m면 1 cm 안에 밝고 어두운 줄 한 쌍이 5번 들어 있다.
디지털 이미지는 \(i(x, y)\)를 격자점에서만 재고(표본화, sampling) 값을 정수로 반올림한(양자화, quantization) 것이다1. 자세한 내용은 디지털 이미지에 있다.
위 그림은 1 cm에 5주기인 줄무늬(500 cycle/m)를 0.25 mm마다 잰 점이다. 아래 그림은 그 값을 8단계 중 가장 가까운 단계로 맞춘 결과다. 매끈한 곡선이 계단이 된다2.
활용
- 영상 처리 알고리즘은 대부분 이 함수에 대한 연산이다. 윤곽 검출은 \(\nabla i\)의 크기를 재는 일이고, 흐리게 하기는 높은 공간 주파수를 줄이는 일이다1.
- 컬러 이미지가 채널 셋인 이유는 사람 눈의 추상체가 세 종류이기 때문이다(삼색 이론). 채널 수는 물리가 아니라 사람의 눈이 정한다.
- 사람의 망막도 윤곽을 강조한다. 다만 \(\nabla i\)(1차 미분)와 달리 이웃과의 차이를 빼는 방식(2차 미분에 가까움)이다: 측면 억제
연결
자주 하는 오해
틀렸다. 식이 보통의 덧셈처럼 생겨서 그렇게 읽기 쉽다. 세 값을 숫자로 더하면 서로 다른 색이 같은 값이 된다. 확인 방법: 빨강 \((255, 0, 0)\), 초록 \((0, 255, 0)\), 파랑 \((0, 0, 255)\), 회색 \((85, 85, 85)\)는 합이 모두 255다. 숫자 하나로는 네 색을 구별할 수 없다. 이 식의 덧셈은 색 채널 사진 세 장을 겹치는 벡터의 덧셈이다.
확인 문제
C1 단색 이미지, 컬러 이미지, 윤곽선을 각각 함수(또는 식)로 쓰라.
답: 단색 이미지 \(i(x, y)\): 위치별 밝기. 컬러 이미지 \(\mathbf{i}(x, y) = (i_R, i_G, i_B)\): 위치별 세 채널 밝기. 윤곽선: 밝기 변화의 정도 \(\nabla i(x, y) = (\partial i/\partial x, \partial i/\partial y)\), 그 크기가 윤곽의 세기.
C2 컬러 이미지의 식 \(i = i_R + i_G + i_B\)를 세 값의 숫자 덧셈으로 읽으면 무엇이 문제인지 반례로 보이라.
답: 빨강 \((255,0,0)\)과 초록 \((0,255,0)\)은 합이 모두 255라 구별되지 않는다. 컬러 이미지는 세 값을 따로 가진 벡터이고, 이 식의 덧셈은 채널 사진을 겹치는 벡터 덧셈이다.
C3 위의 6×4 이미지(왼쪽 셋 100, 오른쪽 셋 20)에서 가로 방향 차분 \(i(x+1, y) - i(x, y)\)와 세로 방향 차분을 구하고, 윤곽선이 어디인지 쓰라.
답: 가로 차분은 \(x = 2\)와 \(3\) 사이에서 \(-80\), 나머지는 0. 세로 차분은 모두 0. 윤곽선은 \(x = 2\)와 \(3\) 사이의 세로선이고 세기는 80이다. 가로 성분만 있으므로 윤곽선은 세로 방향으로 놓인다.
-
12_image-function_plot.py로 그렸고, 그림에 쓴 값(한 주기 2 mm라 1 cm에 5주기, 양자화 오차가 단계 간격의 절반(16) 이하)을 같은 코드로 확인했다. ↩