Blog (76)
Komentarze (1.5k)
Recenzje (3)

Octave - szybkie klejenie obrazków cz. 1

@Jaahquubel_Octave - szybkie klejenie obrazków cz. 116.11.2011 17:50

Wstęp

Z racji istniejącego jeszcze na DobrychProgramach ograniczenia na liczbę obrazków w jednym wpisie na blogu, kilkukrotnie już musiałem sklejać kilka obrazków w jeden. Ostatnim razem było to aż 5 obrazków. Na szczęście nie musiałem stosować brutalnej metody, która przychodzi do głowy jako pierwsza: otworzyć w GIMP-ie pierwszy obrazek, rozciągnąć płótno, dodać drugi obrazek i tak do skutku. Szybko i sprawnie zrobiłem to w Octave'ie.

GNU Octave to jedno z moich podstawowych narzędzi pracy, obok Opery, Kile i Geany. Jest to wolny pakiet numeryczny, podobnie jak opisany przez arlida Scilab. To, co arlid dotąd napisał o obsłudze Scilaba (cz. 1 i cz. 2 ), przekłada się w całości na Octave'a.

Do dzieła

Przyjmijmy na wstępie, że mamy do sklejenia dwa obrazki o takiej samej szerokości i wysokości (np. zrzuty z okna jakiegoś kreatora). Przyjmijmy też, że pierwszy obrazek nazwaliśmy "a.png", a drugi "b.png" (nazwy im krótsze, tym wygodniej). Po uruchomieniu Octave'a, należy oczywiście przejść do katalogu, w którym znajdują się owe obrazki, u mnie jest to Pulpit, a więc:

octave-3.2.4:1> cd ~/Pulpit

Teraz wczytujemy pliki do zmiennych (znów, nazwy im krótsze, tym wygodniej):

octave-3.2.4:2> a=imread('a.png');
octave-3.2.4:3> b=imread('b.png');

Uwaga! Średniki na końcach linii są istotne - bez nich wyświetli się cała zawartość podanych zmiennych. Zmienne te są macierzami (tu: trójwymiarowymi tablicami liczb od 0 do 255) i to te macierze zostaną wypisane (nie zostaną wyświetlone obrazki). Teraz można przejść do klejenia. Utworzymy dwie nowe zmienne (c i d), w których znajdą się sklejone obrazki. Zmienna c będzie macierzą o wysokości równej sumie wysokości macierzy a i b, bo skleimy w niej a.png nad b.png. Zmienna d będzie macierzą o szerokości równej sumie szerokości macierzy a i b, bo skleimy w niej a.png na lewo od b.png.

octave-3.2.4:4> c=[a;b];
octave-3.2.4:5> d=[a b];

Tu znów musimy pamiętać o średnikach na końcach, aby uniknąć zasypania ekranu mnóstwem liczb. Bardziej istotne jest jednak to, co dzieje się między znakiem równości a średnikiem: "[" oznacza początek wprowadzania macierzy, "]" oznacza koniec wprowadzania macierzy, do macierzy c i do macierzy d wstawiamy wszystkie elementy macierzy a i b (całe obrazki), więc wystarczy podanie nazw zmiennych a i b, średnik rozdzielający a i b w pierwszym klejeniu oznacza koniec wiersza macierzy, czyli że b idzie pod a, czyli to, o co nam chodziło, spacja rozdzielająca a i b w drugim klejeniu oznacza następny element w wierszu, czyli że b jest obok a, czyli znów to, jak miało być. Zamiast spacji może być też przecinek - bez różnicy.

Efekt możemy podejrzeć:

octave-3.2.4:6> imshow(c)
octave-3.2.4:7> imshow(d)

Tutaj średnik na końcu jest nieistotny.

Jeśli mamy więcej obrazków, postępujemy podobnie:

c=[a1;a2;a3;a4];

w przypadku kolumny obrazków i

c=[a1 a2 a3 a4];

w przypadku poziomego ciągu. Można też połączyć obie sprawy: a1 i a2 obok siebie u góry, a3 i a4 pod nimi, też obok siebie:

c=[a1 a2;a3 a4];

Przyszedł czas na zapis:

octave-3.2.4:8> imwrite(c,'c.png')

Macierz c zapisujemy do pliku c.png. Octave po rozszerzeniu domyśla się jak ma tę macierz wykorzystać, więc żadne inne opcje nie są konieczne (choć istnieją).

Całą operację można jeszcze zapisać skrótowo w jednej linii:

imwrite([imread('a.png');imread('b.png')],'c.png')

oraz uprościć jeszcze bardziej, wywołując Octave'a z wiersza poleceń z podaną wyżej komendą jako parametrem:

q@q-laptop:~$ octave-3.2.4 -q --eval 'cd ~/Pulpit/; imwrite([imread("a.png");imread("b.png")],"c.png")'

"octave-3.2.4" - tym poleceniem odpalam u siebie Octave'a, polecenie to zależy od systemu operacyjnego, "-q" jest tu po to, żeby Octave nie zanudzał nas informacjami powitalnymi, "--eval" mówi, że jest kod do wykonania (więcej parametrów nie ma, więc po wykonaniu kodu, Octave się zamknie), średnik w kodzie separuj poszczególne polecenia (tu mógłby też być przecinek). W samym kodzie zmieniłem cudzysłowy pojedyncze na podwójne - Octave'owi nie robi różnicy który cudzysłów dostanie, ale że całe polecenie ubrane jest w cudzysłów, bez tej zmiany by się pogryzło.

Komplikator

A co będzie, jak obrazki sklejane obok siebie będą różnej wysokości, albo sklejane jeden pod drugim będą różnej szerokości? O tym w części drugiej.

PS. Inspiracją do takiego wykorzystania Octave'a był wpis Saskatchewana na jego blogu w My Opera.

Szanowna Użytkowniczko! Szanowny Użytkowniku!
×
Aby dalej móc dostarczać coraz lepsze materiały redakcyjne i udostępniać coraz lepsze usługi, potrzebujemy zgody na dopasowanie treści marketingowych do Twojego zachowania. Twoje dane są u nas bezpieczne, a zgodę możesz wycofać w każdej chwili na podstronie polityka prywatności.

Kliknij "PRZECHODZĘ DO SERWISU" lub na symbol "X" w górnym rogu tej planszy, jeżeli zgadzasz się na przetwarzanie przez Wirtualną Polskę i naszych Zaufanych Partnerów Twoich danych osobowych, zbieranych w ramach korzystania przez Ciebie z usług, portali i serwisów internetowych Wirtualnej Polski (w tym danych zapisywanych w plikach cookies) w celach marketingowych realizowanych na zlecenie naszych Zaufanych Partnerów. Jeśli nie zgadzasz się na przetwarzanie Twoich danych osobowych skorzystaj z ustawień w polityce prywatności. Zgoda jest dobrowolna i możesz ją w dowolnym momencie wycofać zmieniając ustawienia w polityce prywatności (w której znajdziesz odpowiedzi na wszystkie pytania związane z przetwarzaniem Twoich danych osobowych).

Od 25 maja 2018 roku obowiązuje Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 (określane jako "RODO"). W związku z tym chcielibyśmy poinformować o przetwarzaniu Twoich danych oraz zasadach, na jakich odbywa się to po dniu 25 maja 2018 roku.

Kto będzie administratorem Twoich danych?

Administratorami Twoich danych będzie Wirtualna Polska Media Spółka Akcyjna z siedzibą w Warszawie, oraz pozostałe spółki z grupy Wirtualna Polska, jak również nasi Zaufani Partnerzy, z którymi stale współpracujemy. Szczegółowe informacje dotyczące administratorów znajdują się w polityce prywatności.

O jakich danych mówimy?

Chodzi o dane osobowe, które są zbierane w ramach korzystania przez Ciebie z naszych usług, portali i serwisów internetowych udostępnianych przez Wirtualną Polskę, w tym zapisywanych w plikach cookies, które są instalowane na naszych stronach przez Wirtualną Polskę oraz naszych Zaufanych Partnerów.

Dlaczego chcemy przetwarzać Twoje dane?

Przetwarzamy je dostarczać coraz lepsze materiały redakcyjne, dopasować ich tematykę do Twoich zainteresowań, tworzyć portale i serwisy internetowe, z których będziesz korzystać z przyjemnością, zapewniać większe bezpieczeństwo usług, udoskonalać nasze usługi i maksymalnie dopasować je do Twoich zainteresowań, pokazywać reklamy dopasowane do Twoich potrzeb. Szczegółowe informacje dotyczące celów przetwarzania Twoich danych znajdują się w polityce prywatności.

Komu możemy przekazać dane?

Twoje dane możemy przekazywać podmiotom przetwarzającym je na nasze zlecenie oraz podmiotom uprawnionym do uzyskania danych na podstawie obowiązującego prawa – oczywiście tylko, gdy wystąpią z żądaniem w oparciu o stosowną podstawę prawną.

Jakie masz prawa w stosunku do Twoich danych?

Masz prawo żądania dostępu, sprostowania, usunięcia lub ograniczenia przetwarzania danych. Możesz wycofać zgodę na przetwarzanie, zgłosić sprzeciw oraz skorzystać z innych praw wymienionych szczegółowo w polityce prywatności.

Jakie są podstawy prawne przetwarzania Twoich danych?

Podstawą prawną przetwarzania Twoich danych w celu świadczenia usług jest niezbędność do wykonania umów o ich świadczenie (tymi umowami są zazwyczaj regulaminy). Podstawą prawną przetwarzania danych w celu pomiarów statystycznych i marketingu własnego administratorów jest tzw. uzasadniony interes administratora. Przetwarzanie Twoich danych w celach marketingowych realizowanych przez Wirtualną Polskę na zlecenie Zaufanych Partnerów i bezpośrednio przez Zaufanych Partnerów będzie odbywać się na podstawie Twojej dobrowolnej zgody.