슈퍼픽셀(superpixel)과 SLIC 알고리즘 활용

픽셀(pixel)은 디지털 이미지를 구성하는 하나하나의 점들을 의미한다. 600 x 800 크기의 이미지라면 총 600 x 800 = 480,000개의 픽셀로 구성된 이미지인 것이다. 우리는 보통 픽셀 단위로 디지털 이미지를 처리한다.  

 

그렇다면 슈퍼픽셀(superpixel)은 무엇을 의미하는가? 슈퍼픽셀이란 지각적으로(perceptually) 의미있는 픽셀들을 모아서 그룹화해준 것이다. 무슨 말인가 하면, 인접해 있는 픽셀들 중에 비슷한 특성(색상 또는 밝기 등)을 갖고 있는 것끼리 묶어서 커다란 픽셀, 즉 슈퍼픽셀을 만들어준다는 것이다. 픽셀 단위가 아닌 슈퍼 픽셀 단위로 영상을 처리하겠다는 것이다. 우리는 어떤 이미지를 볼 때 모든 픽셀을 하나하나 살펴보기보다는 비슷한 부분은 한번에 모아서 보기 때문에, 슈퍼픽셀 단위로 이미지를 처리하는 것이 좀 더 자연스러운(좀 더 사람다운) 방식이라고 볼 수 있다. 

 

아래 그림을 보면 슈퍼픽셀이 무엇인지 단번에 이해될 것이다. 

 

출처: SLIC 오리지널 논문 [3]

SLIC이란 이름을 가진 슈퍼픽셀 알고리즘[3]으로 슈퍼픽셀 분할을 실현한 결과다. 결과적으로 이미지를 훨씬 더 적은 갯수의 단위, 슈퍼픽셀들로 표현할 수 있게 되었다.  

 

슈퍼픽셀은 이미지 분할(image segmentation), 의미적 라벨링(semantic labeling), 물체 검출(object detection), 추적(tracking) 등 많은 컴퓨터비전 분야에서 유용하게 사용되고 있다. 

 

SLIC 알고리즘을 제안한 논문[3]에 의하면 좋은 슈퍼픽셀 알고리즘의 조건은 다음과 같다.  

1) 슈퍼픽셀은 이미지 경계에 잘 부착되어야 한다. 

2) 어떤 이미지 처리 과정의 전처리 과정으로 사용되려면, 연산 복잡도가 낮아야 하고 사용하기 쉬워야한다.

3) 분할 목적으로 사용되려면, 슈퍼픽셀 알고리즘은 분할 시간을 단축시키면서도 결과의 질을 향상시켜야한다. 

 

SLIC 알고리즘으로 슈퍼픽셀 분할을 실행해봤다. 매트랩용 SLIC는 이 링크에서 다운로드 받을 수 있다.

https://ivrl.epfl.ch/research-2/research-current/research-superpixels/ 

 

나는 위 이미지와 비슷한 결과를 산출하기 위해서 다음과 같이 코드를 작성했다. 

 

clc, clear, close all

img = imread('test_img.jpg');

% superpixel segmentation
Nc =  800; % 이미지내 슈퍼 픽셀 갯수 설정
[labels, numlabels] = slicomex(img, Nc);

R = img(:, :, 1);
G = img(:, :, 2);
B = img(:, :, 3);

R_seg = zeros(size(R));
G_seg = zeros(size(G));
B_seg = zeros(size(B));


for k = 1:numlabels   
    rt = find(labels==k-1);
    
    R_seg_temp = R(rt);
    G_seg_temp = G(rt);
    B_seg_temp = B(rt);
    
    R_seg_mean = mean(R_seg_temp);
    G_seg_mean = mean(G_seg_temp);
    B_seg_mean = mean(B_seg_temp);
    
    R_seg(rt) = R_seg_mean;
    G_seg(rt) = G_seg_mean;
    B_seg(rt) = B_seg_mean;
    
end

R_seg = uint8(R_seg);
G_seg = uint8(G_seg);
B_seg = uint8(B_seg);

seg(:, :, 1) = R_seg;
seg(:, :, 2) = G_seg;
seg(:, :, 3) = B_seg;

imshow(seg)

 

슈퍼픽셀 분할 결과를 살펴보자. 슈퍼픽셀을 각각 200, 400, 800, 1600, 3200, 6400개씩 갖도록 설정해주었다. 어떤 변화가 있는지 잘 살펴보자.

 

 

슈퍼픽셀의 갯수를 많이 갖게 설정할수록 슈퍼픽셀의 크기가 작음을 확인할 수 있을 것이다. 그런데, 결과물이 생각보다 예쁘지 않은가? 분할의 용도긴 하지만 예술적인 용도로 사용해도 좋을 것 같다. 

 


도움이 되셨다면 댓글 또는 공감 부탁드립니다.^^ 

 

 

<참고자료>

[1] https://extremenormal.tistory.com/entry/Superpixel%EC%9D%B4%EB%9E%80, Arsmo, "Superpixel이란?"

[2] https://medium.com/@darshita1405/superpixels-and-slic-6b2d8a6e4f08, Darshita Jain, "Superpixels and SLIC"

[3] Achanta, Radhakrishna, et al. "SLIC superpixels compared to state-of-the-art superpixel methods." IEEE transactions on pattern analysis and machine intelligence 34.11 (2012): 2274-2282.

댓글()