Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Octave - szybkie klejenie obrazków cz. 1

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 ~/PulpitTeraz 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 ic=[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. 

oprogramowanie porady programowanie

Komentarze

0 nowych
Cebula REDAKCJA  18 #1 16.11.2011 17:38

Robi wrażenie, kupa roboty, aż żal, że na długo się nie przyda ;)

Ale tak poważniej, zdajemy sobie sprawę, że z tymi grafikami to dramat prawdziwy, ale nie chcieliśmy robić łataniny. W przyszłym tygodniu blog zyska nową twarz, mam nadzieję, że ludzką ;)

Nie będę zdradzał szczegółów, ale limit grafik zniknie, będzie wygodniej i naszym zdaniem zdecydowanie ładniej. Chcemy aby blog się rozwijał jak najlepiej, chcemy też żebyście mogli dotrzeć do jak najszerszego grona czytelników. Mamy nadzieję, że "nowy" blog to zapewni, poza tym to tylko pewien krok - na wdrożenie czeka również krok kolejny, który zasięg Waszych wpisów dodatkowo znacząco zwiększy.

  #2 16.11.2011 18:16

@Jaahquubel_ "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."

Za to metoda którą zaprezentowałeś jest pełna gracji i operacja zamyka się w kilu sekundach roboty, jak mniemam - he he. Mi to raczej wygląda na metodę "jak by tu sobie zracjonalizować, że pisanie komend jest dobre na wszystko". To stwierdzenie, że "szybko i sprawnie" to tak chyba mocno na wyrost, i dorabianie ideologii do rzeczywistości, bo jeśli tak rozumować to Gimp lub PS powinny się składać z czarnego okna na wpisywanie komend.
Po co sikać pod wiatr???

Jaahquubel_   13 #3 16.11.2011 18:28

Ło matko! Się porobiło. :)
Sprawa limitu to tylko motywacja dla mnie do napisania wreszcie czegoś o Octave'ie.
Że zmiany na blogu będą, i to już w przyszłym tygodniu, to świetnie!
Łączenie obrazków może się jednak przydać i później. ;)

"na wdrożenie czeka również krok kolejny, który zasięg Waszych wpisów dodatkowo znacząco zwiększy"
No, teraz to dopiero ciekawość będzie nas zżerać. ;)

  #4 16.11.2011 20:02

Bardzo interesujące, dzięki za dobry wpis.

skrzypek   13 #5 16.11.2011 20:16

Chyba bym wolał sklejać obrazki w gimpie :P

adao1003   4 #6 17.11.2011 10:44

co jest najlepsz z darmowych programów podobnych do matlaba (freemat, octave czy scrilab)??

Druedain   14 #7 17.11.2011 11:10

@Niezalogowany Prawdopodobnie dorobienie do tego GUI byłyby niezbyt wymagające, ale nie o to tu chodzi. Ja jako osoba, której zdarza się raz za czas sklejać coś w… GIMPie :P z pewnością ten wpis sobie wrzucę do zakładek, choć z drugiej strony wolałbym coś chudszego tylko pod takie proste operacje, bo ściągać cały kompilator do samego klejenia zdjęć…

Jaahquubel_   13 #8 17.11.2011 21:18

@Niezalogowany
Wpisanie "imwrite([imread('a.png');imread('b.png')],'c.png')" w uruchomionym Octave'ie lub "octave-3.2.4 -q --eval 'cd ~/Pulpit/; imwrite([imread("a.png");imread("b.png")],"c.png")'" w terminalu trwa porównywalnie długo z samym uruchomieniem GIMP-a. A dodaj jeszcze zmianę rozmiaru, dodawanie i przesuwanie warstwy i zapis. Może Ty masz tak obcykanego GIMP-a, że robisz to migiem. Ja nie, za to mam obcykanego Octave'a i takie klejenie jest szybsze, zwłaszcza przy pięciu zrzutach.

@adao1003
Nie znam pozostałych programów, ale z tego, co jedna pani mówiła drugiej pani, Freemat ma najmniej funkcji, a Scilab najwięcej, ale za to gdzieś gubi zgodność z Matlabem. Octave to środek, może złoty, może nie.

@Druedain
Tego typu środowisko ma różnorodne możliwości. Jak byś wiedział jak oraz chciał, pewnie wykorzystałbyś Octave'a jeszcze na kilka praktycznych sposobów.

Dodałem info o inspiracji.

  #9 17.11.2011 22:12

Pragnę zauważyć dla tych co nie widzą zastosowania. Moi drodzy skoro wczytujecie obrazek i jest on reprezentowany jako macierze to jak myślicie co można z tym zrobić mała podpowiedź jak działają filtry w photoshop czy gimp?