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

Octave - szybkie klejenie obrazków cz. 2

@Jaahquubel_Octave - szybkie klejenie obrazków cz. 219.11.2011 00:31

Pierwszą część skończyłem pytaniem:

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?

A jaka jest odpowiedź? Ano taka, że da się zrobić, ale nie ma to już tak dużego sensu. Trwa to dłużej i trzeba w tym celu przyswoić nieco więcej wiedzy. Wpis niniejszy traktujcie więc jako gawędę na temat tego co jak w Octave'ie wygląda.

Przyjmijmy, że mamy dwa obrazki: a.png i b.png, pierwszy z nich ma rozmiary 640x480, a drugi 600x400 pikseli. Wczytajmy je: "a=imread('a.png'); b=imread('b.png');" i sprawdźmy ich rozmiar funkcją size:

octave-3.2.4:1> size(a)
ans =

    480   640      3

octave-3.2.4:2> size(b)
ans =

    400   600      3

Wynik może odbiegać od oczekiwań. Rozmiary macierzy zawsze podawane są w tej kolejności: najpierw liczba wierszy, potem liczba kolumn. Zawsze!(i jeszcze parę wykrzykników) W sprawach związanych z wyświetlaniem w komputerze, oś "x" jest pozioma, zorientowana w prawo, a oś "y" pionowa, zorientowana w dół. Kłócą się tu dwie konwencje, stąd ten "rozjazd". Konwencja macierzowa ma wyższy priorytet choćby z racji wieku. Dlatego "480 640", zamiast spodziewanych "640 480". A co robi tam jeszcze trójka? Wysokość, szerokość, głębokość? Trójka oznacza trzy warstwy kolorystyczne: pierwsza warstwa, to kolor czerwony, druga to zielony, trzecia - niebieski. W poprzednim odcinku napisałem, że macierze wzięte z obrazków zawierają liczby z od 0 do 255. Te liczby to oczywiście składowe RGB. Jeden piksel to wektor trzech składowych - wektor brany "wgłąb" z macierzy. No i jeszcze "ans" trzeba wyjaśnić: jest to zmienna tworzona automagicznie, jej nazwa to skrót od "answer".

Trochę teorii

Zanim pójdziemy dalej, trochę o macierzach i środowisku w ogóle. W Octave'ie wszystko (no, prawie wszystko) jest macierzą. Octave jest liberalny, jeśli chodzi o typy danych. Octave numeruje po ludzku - od 1. Dlatego możliwe jest takie coś: tworzymy zmienną całkowitoliczbową, przerabiamy ją na wektor liczb (pseudo)rzeczywistych, następnie na macierz dwuwymiarową i w końcu trójwymiarową:

octave-3.2.4:2> p=1
p =          1
octave-3.2.4:3> p(3)=1/2
p =

           1           0         0.5

octave-3.2.4:4> p(4,4)=0.5
p =

           1           0         0.5           0
           0           0           0           0
           0           0           0           0
           0           0           0         0.5

octave-3.2.4:5> p(5,5,3)=0
p =

ans(:,:,1) =

           1           0         0.5           0           0
           0           0           0           0           0
           0           0           0           0           0
           0           0           0         0.5           0
           0           0           0           0           0

ans(:,:,2) =

           0           0           0           0           0
           0           0           0           0           0
           0           0           0           0           0
           0           0           0           0           0
           0           0           0           0           0

ans(:,:,3) =

           0           0           0           0           0
           0           0           0           0           0
           0           0           0           0           0
           0           0           0           0           0
           0           0           0           0           0

Jak widać, macierz trójwymiarowa wyświetlana jest warstwami, wygodnie.

Wiedząc to wszystko, możemy przygotować klej, nożyczki i brać się za robotę.

Klejenie

W przypadku klejenia wzdłuż poziomej krawędzi, obrazek wynikowy ma mieć wysokość 880 i szerokość 640 pikseli. W przypadku klejenia wzdłuż pionowej krawędzi, obrazek wynikowy ma mieć wysokość 480 i szerokość 1240 pikseli. W obu przypadkach problemem jest drugi obrazek. Sposobów na to jest kilka. 1. Dolepienie trzeciej macierzy, która uzupełni brakujący kawałek. 2. Rozszerzenie drugiego obrazka o odpowiedni kawałek (to nie to samo, co 1.). 3. Utworzenie macierzy, która będzie pełniła funkcję "podkładu" pod klejone obrazki.

Omówię wszystkie te sposoby.

Trzecia macierz

Wywołanie dla łączenia obok siebie będzie takie:

c=[a,[b;d]]

a dla łączenia w pionie:

c=[a;b,e]

gdzie d i e to wypełniacze. Wypełniacz e, jeśli ma być czarny, będzie macierzą samych zer, o wymiarach 400 na 40 na 3, więc wpisujemy:

e=zeros(400,40,3);

jeśli biały, to potrzebujemy wszędzie 255:

e=255*ones(400,40,3);

a jeśli inny kolor (o składowych R, G i B), to trzeba kombinować z notacją dwukropkową:

e=R*ones(400,40);
e(1:400,1:40,2)=G*ones(400,40);
e(1:400,1:40,3)=B*ones(400,40);

gdzie "m:n" oznacza "od m do n co jeden".

Rozszerzenie macierzy

Tu sprawa jest prostsza, ale ma to sens tylko dla czarnego paska:

b(640,400,1)=0;
c=[a;b];

Macierz-tło Tworzymy macierz z wybranym kolorem, o rozmiarach docelowych (dla uproszczenia biorę czarny):

c=zeros(840,640,3);

i żeby nie było potem problemów, zmieniamy na siłę jej typ, z "double" na "uint8" (w razie jakichś problemów, których nie przewidziałem, to może pomóc):

c=uint8(c);

Następnie wklejamy do niej a i b:

c(1:480,1:640,:)=a;
c(481:880,1:600,:)=b;

gdzie ":" oznacza "od początku do końca" i jest równoważne "1:end".

Pozostaje zapisać.

Na koniec dwie ciekawostki: 1. są obrazki, które dają macierz o trzecim wymiarze równym 4 - kto wie czemu, ręka do góry ;) 2. pewne formaty graficzne można importować do innej postaci: macierz dwuwymiarowa z numerami kolorów + mapa z kolorami. Tematem obrazków jeszcze Was z raz pomęczę.

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.