
넓은 그림을 좁은 액자에 맞추는 심 카빙
한 줄 요약: 심 카빙(seam carving)은 그림에서 중요도가 낮은 픽셀 경로, 즉 이음선(seam)을 하나씩 찾아 빼내는 리사이즈 알고리즘으로, 일반 축소가 모든 픽셀을 눌러 담는 것과 달리 구조물 크기는 그대로 두고 너비만 줄여요.
최근 SNS에서는 프로그램이 그린 산수화가 좁은 액자에 맞춰 스윽 줄어드는 영상이 화제였어요. 그림 속 건물과 나무는 원래 모습 그대로인데 가로만 스윽 좁아져요. 여기에 쓰인 알고리즘이 심 카빙(seam carving, 내용 인식 리사이즈)이고, 그 원리를 caire라는 오픈소스 도구로 서버에서 직접 돌려 확인해 봤어요. 아래에서는 원리와 내 실행 결과를 차례로 풀어요.
그림을 좁게 만드는 세 가지 방법
가로가 1,600픽셀짜리 그림을 1,000픽셀짜리 자리에 넣어야 한다면 보통 두 가지 방법이 있어요. 첫째는 리사이즈(축소)예요. 모든 픽셀 색을 다시 계산해 그림 전체를 줄이는데, 가로를 줄이면 세로도 함께 줄어드는 게 흔한 함정이에요. 비율을 유지한 축소에서는 세로 구조물의 디테일까지 얇아져요.
둘째는 자르기(크롭)예요. 세로는 그대로지만 가로의 양쪽 끝을 통째로 버려요. 그림의 주요 대상이 끝에 걸쳐 있다면 사라져요. 두 방법 모두 ’어디를 어떻게 줄일지’에 대해 그림 내용을 고려하지 않아요.
심 카빙은 이 둘 사이의 세 번째 길이에요. Avidan과 Shamir가 2007년 발표한 논문의 원 이름은 ’Seam Carving for Content-Aware Image Resizing’입니다. 한 문장 표현으로 바꿔 요약하면 ‘그림에서 지워도 괜찮은 픽셀 연결 경로 하나를 골라 그 경로를 빼내는’ 연산이에요. 이 연산을 여러 번 반복해 전체 너비를 줄여요. 중요한 대상 픽셀은 그대로 남아 있으니 구조물은 변형되지 않고, 세로 길이도 유지돼요.
무엇이 지워져도 되는가: 에너지 지도
심 카빙의 첫 단계는 각 픽셀의 ’에너지’를 재는 것이에요. 에너지는 이웃 픽셀과의 색 변화량, 즉 그레이디언트(가장자리 검출)로 계산해요. 경계가 선명한 곳은 에너지가 높고, 평평한 하늘·바탕 같은 곳은 에너지가 낮아요. 중요한 내용이 놓인 곳을 먼저 지우면 구조가 망가진다는 판단을 수치로 바꾸는 절차예요.
아래 에너지 지도는 내가 만든 입력 그림에서 계산한 것이에요. 밝은 산 능선과 나무는 에너지가 높은, 지우면 안 되는 곳이고 어두운 종이 여백이 제거 후보예요. 붉은 경로는 곧 소개할 이음선의 실제 통과 위치예요. 이음선들이 모두 어두운 골을 따라 흐르는 게 보이죠.

이음선은 어떻게 골라내나: 세 이웃의 누적합
이음선의 정의를 정확히 잡아 볼게요. 세로 이음선은 ‘각 행에서 픽셀 하나씩, 행끼리는 바로 아래나 대각으로만 닿는’ 연결 경로예요. 원 논문 표현으로는 위에서 아래로 잇는 8-연결(8-connected) 경로예요. 이 경로에 속한 픽셀을 지우면 그림의 너비가 정확히 1픽셀 줄어요.
경로 후보는 행이 이어질 때마다 조합 수가 급격히 커져요. 여기서 심 카빙은 동적 계획법(작은 문제의 답을 표에 적어가며 큰 문제를 푸는 방식)으로 최적 경로를 찾아요. 위쪽 행의 세 이웃(왼쪽 위·바로 위·오른쪽 위)만 살피면 되므로 계산량이 이미지 크기에 선형으로 비례해요.
이음선을 하나 지우면 이론상 그 주변의 에너지만 다시 재면 되지만, caire 구현은 반복할 때마다 에너지 지도를 전체로 다시 계산해요. 그래서 내 실행처럼 큰 그림·많은 이음선에는 시간이 걸려요.
직접 돌려 보기: caire로 이음선 460개 지우기

caire는 위 논문을 Go 언어로 구현한 오픈소스 프로젝트예요. GitHub 스타 약 10,500개, MIT 라이선스고, 명령줄 도구로 돌아요. 에너지 계산에 소벨(Sobel) 엣지 검출을, 경로 탐색에 동적 계획법을 쓰는 기본 사이클 외에 얼굴 검출(Pigo 라이브러리)로 얼굴 픽셀을 지우지 않게 막아 주는 모드, 지킬 영역과 지울 영역을 직접 지정하는 마스크 지원, 퍼센트 입력·정사각형 만들기 같은 편의 기능까지 갖추고 있어요.
실행 환경은 리눅스 서버에 내려받은 릴리스 바이너리 v1.5.0이고, 입력 그림은 아래 절차 생성 사이트에서 직접 만든 산수화(시드 20261013, 원본 3,000×800에서 잘라 낸 1,661×760)예요. caire -in input.png -out carved.png -width 1201 -preview=false로 너비 460픽셀을 지우도록 명령하니, 이음선 460개가 순서대로 제거되어 1201×760 결과가 나왔어요. 소요 시간은 6분 54초(서버 단일 스레드 기준)였고, 이음선 한 개당 약 0.9초가 걸린 셈이에요.
검증은 이음선을 한 개씩 빼는 단계 실행으로도 확인했어요. 이음선 하나짜리 축소를 30번 반복하고, 각 단계에서 이전 그림과 새 그림을 비교해 지운 픽셀의 실제 좌표를 복원했어요. 그 결과 각 단계에서 이음선 위의 픽셀을 빼고 남은 픽셀은 원본과 값 하나 차이 없이 동일했어요(픽셀을 새로 계산하지 않고 왼쪽으로 당겨 접는 방식).
복원한 좌표를 그림으로 재구성해 보면, 처음 30개 이음선의 원본 좌표가 전부 x 899..1,615, 즉 그림 오른쪽의 종이 여백·안개 지대에 몰려 있었어요. 왼쪽 산맥, 작은 탑, 배 뱃사람, 좌하단 나무 군락 상자는 픽셀 하나도 통과하지 않았어요. 이음선 픽셀의 평균 에너지는 6.63으로 그림 전체 평균(11.57)의 57% 수준이었어요.


Photoshop·GIMP가 이 원리를 쓰는 방법
심 카빙은 발표 직후 제품에 탑재됐어요. Adobe가 알고리즘 사용권을 받아 2008년 출시된 Photoshop CS4에 ’콘텐츠 인식 축소·확대(Content-Aware Scale)’로 담았고, 출시 보도는 이를 CS4의 대표 신 기능으로 소개했어요. GIMP 쪽에서도 LiquidRescale 플러그인(liblqr 라이브러리)이 같은 원리를 무료로 구현해요. 위키백과는 이 알고리즘을 ’심 카빙(또는 liquid rescaling)’이라고도 부른다고 정리해요.
다만 원 논문의 방식은 물체의 ’의미’를 알지 못해요. 에너지가 낮은 곳이면 구조물이라도 지워질 수 있고, 나선 계단·울타리 같은 반복 패턴은 이음선이 선을 가로질러 찢어 놓는 결과가 생겨요. 그래서 실용 도구는 이를 보완하는 장치를 함께 넣어요. 얼굴 검출과 보호 마스크가 대표적이에요. 내 실행에서도 나뭇가지 일부 위로는 이음선이 지나갔어요. 중앙 소나무 군락 상자를 통과한 이음선 픽셀이 1,082개였지만 정작 나뭇가지 위를 지난 건 107개에 그쳤어요. 작은 정자 상자는 530픽셀이 통과했지만 정자를 그린 먹 위는 한 점도 없었어요. 물체를 인식하는 게 아니라 에너지를 계산할 뿐이라는 한계의 직접 예예요.
입력 그림 이야기: 절차 생성 산수화

영상의 입력 그림은 사람이 그린 게 아니라 코드가 그린 것이에요. Shan Shui Infinite는 소음(noise)과 수학 함수로 산·나무·건물·인물을 그려내는 절차 생성(procedural generation) 시스템이고, 웹사이트에서 스크롤을 내리면 계속 이어 그려지는 산수화를 만들어 볼 수 있어요(MIT 라이선스). 위 그림은 내가 시드를 고정해 직접 생성한 화면이고, 시드를 넣으면 같은 그림을 다시 만들 수 있고 화면을 벗어나면 자동으로 이어 그리는 것이 특징이에요.
어떻게 활용할까
심 카빙은 ‘비율은 맞추고 내용은 살리는’ 리사이즈가 필요한 자리의 도구예요. 사진을 SNS 양식의 비율로 맞추고 싶은데 잘리면 곤란한 인물·건물이 있을 때, 배너 파생본을 만들 때, 레이아웃 너비가 다른 화면에 같은 그림을 넣을 때가 대표적이에요.
명령줄 사용법도 간단해요. 축소할 퍼센트를 넣는 예제와 얼굴을 지키는 예제는 아래와 같아요.
caire -in in.jpg -out out.jpg -perc=1 -width=20
caire -in in.jpg -out out.jpg -face=1 -perc=1 -width=20
정자·건물처럼 지켜야 할 것이 정해졌다면 마스크로 보호 영역을 밝게 칠해서 넘겨 주는 게 가장 확실해요. 그리고 잊지 말 것은 알고리즘의 한계예요. 알고리즘은 의미를 모르므로, 지우면 곤란한 대상은 사용자가 먼저 마스크로 표시해 두어야 해요. 에너지 지도를 열어 어디가 후보인지 눈으로 확인한 뒤 실행하는 습관이 좋은 결과를 남겨요.
출처
- Seam Carving for Content-Aware Image Resizing — Avidan·Shamir, ACM TOG 26(3), 2007 (원 논문)
- MERL 기술보고서 TR2007-087 — 원 논문 PDF
- Seam carving — 위키백과(영문) (심 카빙 = liquid rescaling 정의와 전후 맥락)
- esimov/caire — GitHub 리포와 README (기능·명령·얼굴 검출·마스크)
- caire 릴리스 v1.5.0 (직접 내려받아 실행한 바이너리)
- LingDong-/shan-shui-inf — GitHub 리포 (입력 그림의 절차 생성 시스템)
- Shan Shui Infinite 웹사이트 (시드 지정·자동 스크롤 직접 접속 확인)
- Adobe demos Photoshop CS4’s content-aware scaling — Engadget, 2008
- Content-aware scaling highlights Photoshop CS4 — Macworld, 2008
- carlobaldassi/gimp-lqr-plugin — LiquidRescale GIMP 플러그인
- 원문 릴스 — Instagram(계기 자료)