인공지능관련/이미지 프러세싱

윤곽선 드러내기1

학위논문통계 2016. 12. 7. 16:46

 

 

1.

 

오늘은 지난번 스무딩효과와 반대인 윤곽선 드러내가 효과를 한번 알아 보겠습니다. 스무딩 효과는 기본적으로 이미지의 잡음을 제거하기 위해 픽셀값을 평균을 하는 작업입니다. 이에 대한 역효과로 화면이 희미해지는 효과, 즉 이미지의 윤곽선이 죽는 효과가 생깁니다. 극단적인 경우가 사람의 신변을 보호하기 위해 얼굴을 모자이크 하는 경우입니다.

 

 

윤곽선 드러내기는 이미지에 있는 물체의 윤곽선을 드러내는 효과입니다. 이건 실제 응용에서 많이 사용될 수 있습니다. 예를 들어 CCTV에 찍힌 뺑소니 차의 차번호를 인식하는 경우입니다. 우리는 이미지를 좋게 만들려고 하는 것이 목적이 아니고 차번호가 뭔지를 알려고 하는 것이죠. 그래서 번호의 윤곽선만 드러내면 되는 것이죠. 또 광개토왕비와 같은 경우 한자의 윤곽선을 드러내면 더 잘 파악할 수 있을 겁니다. 또 전자회로 같은 복잡한 이미지 경우 윤곽선만 드러낼 수 있고 불량품을 검색하는데도 사용할 수 있습니다.

 

언제나 그렇지만 현실적인 문제에서는 다양하게 변형해서 사용할 수 있습니다. 여기서는 이미지 품질 개선의 목적이기 때문에 윤곽선의 아닌 부분도 중요할 수 있습니다.

 

 

다음의 세로 윤곽선을 드러내는 경우를 한번 보죠. 256 음영 이미지라고 하고 검정색은 0, 휜색은 255입니다.

 

 

0

0

0

0

0

0

0

0

255

255

255

255

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

255

255

255

255

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

255

255

255

255

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

255

255

255

255

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

255

255

255

255

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

255

255

255

255

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

255

255

255

255

0

0

0

0

0

0

0

0

 

 

그림 가운데 있는 흰색 네모 물체의 윤곽을 어떻게 파악할 수 있을가요. 먼저 픽셀값을 원쪽에서 오른쪽으로 가로로 죽 읽어 보죠. 그럼 물체 윤곽 전까지 픽셀값의 변화가 없다가 물체가 시작 부분에서 픽셀값이 확 변하고 또 변화가 없다가 물체 윤곽이 끝나는 부분에서 다시 픽셀값이 확 변하고 다시 픽셀값의 변화가 없습니다.

 

 

그럼 오른쪽의 있는 픽셀값에서 왼쪽에 있는 픽셀값을 빼면 바로 물체의 윤곽이 드러날 수 있다는 생각이 들죠. 아래 그림을 보죠. 그럼 흰색 네모 물체의 세로 윤곽선이 바로 드러나죠.

 

 

0

0

0

0

0

0

0

0

255

0

0

255

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

255

0

0

255

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

255

0

0

255

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

255

0

0

255

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

255

0

0

255

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

255

0

0

255

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

255

0

0

255

0

0

0

0

0

0

0

0

 

 

 

 

2.

 

그림 가로 윤곽선은 어떻게 드러내게 할 수 있을까요? 당연히 아래쪽 픽셀값에서 윗 픽셀값을 빼거나 위 픽셀값에서 아래쪽 픽셀값을 빼면 된다는 것이죠. 이건 계산에서 원점(0,0) 좌표를 어디로 잡는가에 따라 달라집니다.

 

 

위에서는 가로 윤곽선이나 세로 윤곽선을 찾을 때 따로 작업을 했습니다. 그럼 한 큐에 가로, 세로나 또는 특정 방향의 윤곽선을 찾는 방법이 없을까 하는 생각이 들 수 있습니다. 이 경우 수학이나 물리, 수치해석에 많이 나오는 gradient라는 벡터 값을 사용합니다. 별 어려운 개념이 아닙니다. 그냥 기울기 구하는 것입니다. 함수의 변수가 하나이면 그냥 기울기인 상수 값이 나오지만 함수의 변수가 두 개이면 2차원 기울기 벡터, 함수의 변수가 3개이면 3차원 기울기 벡터가 나옵니다.

 

예를 들어 이미지 공간을 (x, y)라고 하고, 각 이미지 픽셀의 값을 w라고 하면

 

이미지 픽셀 값은 함수처럼

w=h(x,y)

 

이렇게 표현될 수 있습니다. 이때 gradient는

G=(dw/dx, dw/dy)

이렇게 됩니다. 즉 2차원의 기울기 벡터가 됩니다. 우리가 다루는 이미지는 디지털 이미지이기 때문에 dy나 dy는 사실 1입니다. 즉 이미지 위치가 한 단계 변한다는 의미입니다. 즉 dx=x(i+1)-x(i)=1, dy=y(j+1)-y(j)=1이 됩니다. 그레서 이 gradient 벡터를 구해 절대값을 취하거나 아니면 벡터의 거리를 구하면 됩니다.

 

 

 

3. 예

 

  

 

 

 

위 그림은 콘택트 렌즈의 예입니다. 왼쪽이 원래 이미지인데 4-5시 방향의 원을 보면 약간 검은색으로 찌그러진 부분이 있을 겁니다. 오른쪽에 윤곽선 드러내기 작업을 한 것이고요. 오른쪽이 찌그러진 부분이 더 선명하게 인식이 되죠.

 

 

그래서 이게 문제입니다. 렌즈와 같이 대량생산 되는 경우 불량품을 눈으로 일일이 골라내기가 힘듭니다. 그림 이럴 경우 자동화 장치를 설치해서 렌즈 이미지를 왼쪽과 같이 찍고 이런 윤곽선 드러내기 작업을 자동으로 합니다. 이렇게 윤곽선 이미지가 1000*1000=1000000 크기라고 하면 각 픽셀의 값을 독립변수로 설정하고, 그럼 백만개의 독립변수가 되죠. 그런 다음 로지스틱 회귀분석을 하거나 뉴런넷을 써서 작동으로 불량품을 걸려 낼 수 있습니다.

 

학습과정도 그리 힘들지 않을거라 봅니다. 정상적인 렌즈의 원의 이미지를 만든 다음 원 근처에 적당한 잡음을 주면 수만, 수억개의 데이터 셑을 만들어 낼 수 있습니다.

 

이런 식으로 사람 손을 하나도 걸치지 않고 불량품을 제거할 수 있습니다.

 

이렇게 되면 수 작업으로 불량품 제거하는 수 많은 사람들이 해고되겠지요. 지금 우리가 걱정하는 것이 부분이죠. 인공지능이 아니라도 계속 이런 식으로 산업화가 진행되어 오고 있습니다.

 

 

 

4.

 

이 gradient을 이용하는 방법이 함수의 최소나 최대를 찾는 알고리즘 중 가장 기본이 되는 알고리즘입니다. w=h(x,y)의 모양을 우리가 아는 산이라 생각하면 특정 지점에서 gradient 방향이 산이 가장 급격하게 진행하는 방향이 됩니다. 그래서 이 급격하게 변하는 방향으로 찾아가면 산 정상이나 골의 밑바닥을 찾을 수 있다는 생각입니다. 이런 방법을 steepest search 또는 gradient search입니다. 여기에 수 많은 변형 방법이 있습니다.

 

지난번 EM에서 MLE를 수치해석을 사용하여 찾을 때 방정식의 근을 수치해석으로 찾는 Newton-Raphson 방식을 설명하였는데 최종 모양을 보면 gradient 방식과 기본적으로 비슷한 모양을 합니다.

 

즉 다음 찾는 점을 x(n+1)이라 하고 이전에 찾은 점을 x(n)이라 하면

 

x(n+1)=x(n)+a*gradient

 

이런 형식이 되고 각 방법론에서 a의 모양만 달라집니다. 그리고 뉴런넷에서 학습할 때도 기본적으로 이런 모양을 갖고 있습니다.

 

gradient 방법은 2ed에서 자세히 설명이 되어 있는 반면 최근의 3ed에서는 2차 미분인 Laplacian operator를 자세히 설명하고 있네요. 다음에 더 이야기 해보죠.

 

 

 

5.

 

이 작업을 할 때 컴퓨터 프로세스가 하나 밖에 없으면 100*100=10000 크기의 이미지라면 10000번의 계산을 해야 합니다. 그러나 10000개의 프로세스가 있다면 각 프로세스가 각각 한 번의 계산으로 끝납니다. 앞의 스무딩 작업도 마찬가지고 마스크를 씌우는 것은 각 픽셀마다 독립적으로 작동하는 것이기 때문에 픽셀 수만큼의 프로세스가 있으면 작업 수가 바로 끝납니다. 구글이 수 많은 cpu나 gpu를 쓰는 이유입니다.

'인공지능관련 > 이미지 프러세싱' 카테고리의 다른 글

윤곽선 드러내기.  (0) 2016.12.14
스무딩2  (0) 2016.12.01
이미지 스무딩1  (0) 2016.11.30
화질 개선1  (0) 2016.11.29
이미지프로세싱1  (0) 2016.11.21