[Image Processing] Superpixels (SEEDS / SLIC)
Superpixels (SEEDS and SLIC)
논문을 읽는데 심심치 않게 등장한 Superpixels 개념 때문에 조금 더 공부해보자는 차원에서 포스팅하게 되었다. Superpixels 이라는 개념을 영상에서 픽셀을 블록화 하는 걸로만 이해하고 있었다. Superpixels의 정확한 개념을 설명하고, 이에 대한 대표적인 방법인 SEEDS 와 SLIC 알고리즘을 설명하려고 한다. 영문을 번역하며 설명하는거라 다소 매끄럽진 않겠지만 최대한 매끄럽게 써보도록 하겠다..
1. Superpixels (슈퍼픽셀)
슈퍼픽셀은 영상분할 및 Object Tracking 분야에서 자주 사용되는 방법이다. 영상분할은 입력영상으로부터 물체에 해당하는 영역을 추출하는 과정으로 영상해석을 위한 필수적인 단계라고 할 수 있다. 이러한 영상분할을 하기 위한 접근방법으로는 화소기반(pixel-based), 영역기반(Area-based), 에지기반(edge-based) 분할방법으로 크게 나눌 수 있다.
슈퍼픽셀을 이용하여 원 영상에서특성이 비슷한 화소들을 묶음으로 표현할 수 있다. 슈퍼픽셀은 원영상을 특징이 비슷한 작은 균일한 영역으로 잘게 나누고 이 작은 영역들을 기본단위로 하여 영상처리를 하는데, 여기서 작게 나누어 진 균일영역을 슈퍼픽셀이라고 한다. 슈퍼픽셀은 밀집성(Compactness), 경계일치도(Boundary precision/recall), 과소분할(under segmentation)의 최소화, 균일성(uniformity) 등의 특징이 요구된다.
주의해야할 점은 슈퍼픽셀의 경계와 원영상에 있는 경계가 일치하지 않는다면 슈퍼픽셀로부터 영상분할 후 물체를 인식할 때 정확한 경계를 검출할 수 없기 때문에 분할 후의 영상처리과정에 큰 영향을 미치게 된다.
슈퍼픽셀을 구하는 방법에 따라 그래프 기반 방법과 기울기 기반 방법이 있다. 여기서 소개하는 방법은 기울기 기반 방법이다. Mean Shift, Turbopixel, Quick Shift, SLIC(simple linear iterative clustering) 방법 등이 있다. 이는 영상의 기울기 값을 구하고 이를 기초로 하여 초기화소(Seed)를 정하고 각 화소에 대해 초기화소와의 유클리드 거리를 계산하여 성질이 비슷한 작은 영역으로 나누어 슈퍼픽셀을 구하는 방법이다. 잠깐 말하자면 SLIC 방법은 (L, a*, b*, x, y)의 5차원 특징공간에서 슈퍼픽셀을 구하는 방법으로 복잡도가 O(N)로 상대적으로 고속 알고리즘이다.
2. SEEDS Algorithm
정확히 말하자면 SuperpixelSEEDS Algorithm이다. 이미 OpenCV 3.0.0 에 포함되어있는 알고리즘이다. SEEDS의 뜻은 Superpixels Extracted via Energy-Driven Sampling 이다. 이 알고리즘은 Hill-climbing algorithm 기반으로 color histogram과 boundary term에 기반하고 있다. Energy function(에너지 함수)은 슈퍼픽셀이 동일한 색으로 이루어지며, Boundary term이 활성화되면 슈퍼픽셀은 부드러운 경계를 가지고, 서로 비슷한 모양을 갖게 된다. 실제로는 슈퍼픽셀의 규칙적인 격자(grid)에서 시작하여 경계에서 픽셀 또는 픽셀 블록(pixel blocks)을 이동하여 슈퍼픽셀이 만들어지게 된다. 이 알고리즘은 단일 CPU를 이용하여 실시간으로 실행되게 된다.
3. SLIC Algorithm
비교적 가장 최근에 나오게된 Superpixels 알고리즘이다. 코드를 찾다보니 Matlab 코드가 너무 많아서 매트랩을 배워야되는지 진지하게 고민해봤다. 사실상 매트랩코드도 OpenCV와 닮아있어서 배우는덴 별로 오래 걸리지 않을 것 같다. 하지만 그냥 opencv 코드와 비슷하니 대략적인 것만 공부해놓고 matlab 코드를 opencv 코드로 바꾸는 작업을 하면 될 것 같기도 하다.
OpenCV contrib 를 확장하여 사용해 보려 했으나 제대로 링킹이 안되서? 그냥 헤더파일과 소스를 따로 추가하여 코딩해보았다. 아직 성능 검증이 안된 알고리즘이라서 그런지 이미지 크기가 크거나 복잡한 이미지일수록 시간이 굉장히 오래 걸린다. 느리다. 실시간 환경에서 못쓸 그런 속도이다..
superpixels 값을 낮게 줄 수록 불확실하게 나눠지고 블록 크기가 커졌고, 값을 크게 줄수록 잘게 쪼개어 나누어 Segmentation 되는 결과를 확인했다.
(그림 1) superpixels 400 / weight 20
(그림 2) superpixels 400 / weight 40
(그림 3) superpixels 400 / weight 100
(그림 4) superpixels 100 / weight 400
SLIC 알고리즘의 자세한 수식 정보는 참고자료 4에서 자세히 확인 할 수 있다.
참고자료 1
: http://ocean.kisti.re.kr/downfile/volume/kmtd/MTMDCW/2012/v15n6/MTMDCW_2012_v15n6_761.pdf (멀티미디어학회 논문지)
참고자료 2 : http://www.peterkovesi.com/projects/segmentation/
참고자료 3 : https://github.com/PSMM/SLIC-Superpixels
참고자료 4 : http://danielron.com.s3-website-us-east-1.amazonaws.com/slic.html
참고자료 5 : http://ivrl.epfl.ch/research/superpixels#SLICO (소스정보)
'AI Research Topic > Image Processing' 카테고리의 다른 글
[Image Processing] OpenCV Watershed를 이용한 영상 분할 (7) | 2017.01.18 |
---|---|
[Image Processing] Fourier Transform (푸리에 변환) (2) | 2016.11.18 |
[Image Processing] 영상처리 용어 정리 (0) | 2016.11.10 |
[Image Processing] 공간 필터링 (Spatial Filtering) / 영상 회선(Convolution) / Laws Texture Energy Measures (0) | 2016.10.29 |
[Image Processing] HOG Algorithm (0) | 2016.10.28 |