Seam carving w PHP - inteligentne skalowanie

luty 17, 2008 – 8:58 po południu

Seam Carving banner

Seam carving (”wycinanie szwów”) jest to algorytm służący do zmiany rozmiaru obrazu. W przeciwieństwie do standardowych algorytmów zmiany rozdzielczości, zmiana rozmiaru nie odbywa się poprzez skalowanie czy kadrowanie ale poprzez wycinanie lub dodawanie pikseli w obrębie szwów zorganizowanych w kolumny oraz rzędy. Szwy są to obszary w których piksele mają niższy kontrast od innych w pewnym zakresie(obszarze) obrazka. Krótko mówiąc dzieje się to w następujący sposób:

  1. Tworzona jest macierz pikseli które są zaanalizowane pod względem kontrastu, Stworzenie obszarów najmniej i najbardziej znaczacych
  2. Szukanie szwów czyli linii (w poziomie lub pionie) łączących pikseli o najmniejszym kontraście(najmniej znaczących) ze wszystkich możliwych w danym obszarze.
  3. Usunięcie pikseli szwu/dodanie pikseli do szwu.
  4. Powtórzenie algorytmu z kolejnej strony obrazka aż do uzyskania odpowiedniego rozmiaru.

Jak widać sposób myślenia twórców Shai Avidan’a i Ariel Shamir’a jest dość nowatorski, a zarazem bardzo obiecujący gdyż do tej pory ciężko było zwiększyć obrazek o więcej niż 100% lub zmniejszyć o mniej niż 50% aby jakość pozostała na wysokim poziomie. Seam Carving na to pozwala, choć jego wadą jest to, że nie zachowuje autentyczności obiektów znajdujących się na obrazie.

Przykład Seam Carving na zdjęciu

Poniższe etapy zmniejszania zdjecia zostały wykonane za pomocą Rsizr.

Wchodzimy na stronę rsizr.com. Wczytujemy zdjęcie do programu. Za zadanie mamy usunąć postać kobietyzachowując przy tym oryginalny kadr.

Seam Carving 1

Za pomocą pędzla remove zaznaczamy obszar kobiety.

Seam Carving 2

Następnie za pomocą poziomego scrolla ustalamy o ile pikseli ma zostać zmniejszone w szerokości zdjęcie. Proces zmniejszania nastąpi samoczynnie. Po jego wykonaniu za pomocą ramki zmniejszania, ustalamy końcową szerokość pliku. Jak widać na poniższym zdjęciu kobieta została wymazana, pozostała sama plaża jaką chcieliśmy uzyskać.

Seam Carving 3

Wyróżniony zieloną ramką obszar pozostawia pewien niesmak gdyż można zauważyć nienaturalną pionową linie.

Seam Carving 4

Wystarczy bardzo szybka obróbka za pomocą narzędzia Scratch Remover Tool z programu Paint Shop Pro X2 i mamy to o co nam chodziło. Według mnie nie do zauważenia jest to, że na pierwotnym zdjęciu znajdowała się kobieta.

Seam Carving 5

Seam Carving i PHP

Twórcy PHP dostrzegli potencjał tego algorytmu i w innowacyjnym rozszerzeniu jakim jest Imagick zamierzają wprowadzić możliwość użycia algorytmu Seam Carving.


/* Tworzymy obiekt*/
$im = new Imagick( 'test.jpg' );
/* Skalujemy */
$im->liquidRescaleImage( 400, 200, 4, 30 );

1 i 2 parametr to rozmiar w pikselach obrazka

Parametr 3 to maksymalna szerokość (krok) szwu

ostatni parametr to współczynnik odpowiadający jak bardzo ugięty (skośny) może być szew

Więcej informacji o implementacji w PHP można znaleźć w tym poście.

Prezentacja algorytmu na targach Siggraph 2007

 

Seam Carving w internecie

Ciekawym projektem jest rsizr (za pomocą którego powstał załączony w tym poście przykład zastosowania algorytmu) flashowy programik który implementuje algorytm. Pozwala oprócz podstawowego zmniejszania rozmiaru obrazu zaznaczać obszary które są ważne (pędzel preserve) lub które są mniej znaczące (pędzel remove).

Jeżeli chodzi o implementacje algorytmu lub oprogramowanie to istnieje darmowa biblioteka Liquid Rescale Library, plugin seam carving dla GIMPa lub Resizor czyli osobny program przeznaczony do zmiany wielkości obrazków.

Jak widać możliwości zastosowania tego algorytmu są zdumiewające, nam pozostaje tylko czekać kiedy powstaną narzędzia dla takich programów jak Photoshop czy PaintShopPro.