User Tools

Site Tools


dydaktyka:cprog:2015:photoshop

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
dydaktyka:cprog:2015:photoshop [2015/11/24 17:01]
pkleczek [Rozmycie obrazu]
— (current)
Line 1: Line 1:
-====== Projekt - Fotoszop ====== 
  
-[size=10]Nazwałem ten projekt "​Fotoszop"​ oczywiście ze względu na prawną ochronę nazwy handlowej programu Photoshop firmy Adobe...[/​size] 
- 
-===== Tytułem wstępu... ===== 
- 
-Pierwsze komputery powstały nie jako teoretyczne zabawki, tylko jako odpowiedź na bardzo konkretne problemy: 
-  * Jak sprawnie wykonywać rachunki? 
-  * Pod jakim kątem wystrzelić torpedę, aby trafić poruszający się okręt? 
-  * Jak złamać szyfr wroga? 
- 
-Wychodząc z podobnego założenia chciałbym, umożliwić Ci w ramach przedmiotu "​Programowanie komputerów"​ poćwiczyć pisanie programów służących czemuś bardziej praktycznemu niż wypisywanie ''"​Hello world!"''​ na ekran. 
- 
-===== Idea projektu ===== 
- 
-Program powstały w ramach projektu //​Fotoszop//,​ jak nazwa sugeruje, będzie służył do pracy z obrazami. W ramach kolejnych ćwiczeń laboratoryjnych zaimplementujesz((zobacz znaczenie w [[http://​sjp.pwn.pl/​poradnia/​haslo/​implementowac;​9044.html|SJP PWN]])) fragmenty kodu służące do wczytywania/​zapisu danych obrazu oraz do operowania na pikselach. Umożliwi Ci to wykonywanie takch operacji jak: rozmycie (zmniejszenie ostrości) obrazu, znajdowanie krawędzi na obrazie, tworzenie fraktali -- i co Ci jeszcze przyjdzie do głowy :-) 
- 
-Podczas realizacji projektu zapoznasz się z różnymi problemami, które występują podczas pisania programu z prawdziwego zdarzenia. \\ 
-Będziesz pracować z rodzajem "​dokumentacji",​ zawierającej wskazówki i wytyczne odnośnie wymaganej funkcjonalności. 
- 
-Projekt będzie tworzony zgodnie z regułą [[https://​pl.wikipedia.org/​wiki/​KISS_%28regu%C5%82a%29|KISS]],​ stąd: 
-  * program będzie obsługiwał tylko obrazy w odcieniach szarości w 8-bitowej [[https://​pl.wikipedia.org/​wiki/​G%C5%82%C4%99bia_koloru|głębi koloru]], zapisane w formacie [[https://​pl.wikipedia.org/​wiki/​Windows_Bitmap|BMP]] 
-  * pewna część funkcjonalności programu -- wymagająca wiedzy wykraczającej poza ramy przedmiotu -- zostanie dostarczona (przez prowadzącego) 
- 
-Ograniczenie "​obrazy w odcieniach szarości w 8-bitowej głębi koloru"​ pozwala na znaczne uproszczenie zadań -- dzięki temu obraz może być reprezentowany jako dwuwymiarowa tablica wartości z zakresu $[0,255]$. Wartości przykładowych kolorów ze skali szarości: \\ 
-{{:​dydaktyka:​cprog:​2015:​grayscale.png?​nolink|}} 
-===== Architektura programu ===== 
- 
-Program korzysta z osobnej biblioteki służącej do odczytu i zapisu danych z pliku bitmapy((Autorem oryginalnego kodu biblioteki jest Michael Sweet. Kod ten można znaleźć na stronie [[http://​paulbourke.net/​dataformats/​bmp/​]])). W zależności od laboratorium biblioteka ta zawiera również pewne dodatkowe funkcje (np. służące do tworzenia nowego obrazu wewnątrz programu). 
- 
-Aby móc używać tejże biblioteki, na początku kodu programu znajduje się linia: 
-<code c> 
-#include "​bitmap.h"​ 
-</​code>​ 
- 
-Pliki bitmap, na których operuje program, powinny znajdować się w katalogu ''​imgs''​. \\ 
-Aby załadować inny obraz niż domyślny (''​lena.bmp''​) zmień odpowiednio pierwszy argument funkcji ''​load_bitmap()''​. \\ 
-Podobnie aby zapisać przetworzony obraz do innego pliku niż domyślny (''​lena-out.bmp''​) zmień odpowiednio pierwszy argument funkcji ''​save_bitmap()''​. 
- 
-==== Typ "​byte"​ ==== 
- 
-Ponieważ zgodnie z ograniczeniami wartość piksela zawiera się w przedziale $[0,255]$, do jego reprezentacji wystarczy jeden bajt -- można użyć więc typu ''​unsigned char''​. 
- 
-Aby jednak intencja programisty była jasna -- że chodzi o piksel -- został zdefiniowany typ ''​byte''​ jako alias dla ''​unsigned char''​. Oznacza to, że zamiast pisać w każdym miejscu ''​unsigned char'',​ można po prostu napisać ''​byte'',​ natomiast dla kompilatora oznacza to dokładnie to samo (1-bajtowa liczba całkowita bez znaku). 
- 
-Alias utworzono z użyciem instrukcji 
-<code c> 
-typedef unsigned char byte; 
-</​code>​ 
- 
-===== Ćwiczenia ===== 
- 
-  - [[dydaktyka:​cprog:​2015:​photoshop:​exercises:​filtering|Filtracja -- Rozmycie obrazu]] 
- 
-==== Umieszczanie bajtów obrazu w tablicy ==== 
- 
-=== Teoria === 
- 
-Format graficzny BMP stosuje upakowanie pikseli obrazu wierszami, w "​paczkach"​ o rozmiarze będącym wielokrotnością 4 bajtów. Stąd w naszym przypadku, jeśli szerokość obrazu nie jest wielokrotnością 4, dodana zostanie odpowiednia ilość bajtów wyrównania. Paczki te występują jedna po drugiej, w ciągu. 
- 
-Rozmiar pojedynczej paczki wynosi 
-$$\mbox{RowSize} = \left\lfloor\frac { \mbox{BitsPerPixel} \cdot \mbox{ImageWidth} + 31 }{32} \right\rfloor \cdot 4$$ 
-przy czym w naszym przypadku $\mbox{BitsPerPixel} = 8$ (takie jest jedno z założeń projektowych). \\ 
-Zapis $\left\lfloor x \right\rfloor$ oznacza //​podłogę//​ liczby $x$, czyli największą liczbę całkowitą nie większa od $x$. 
- 
-Jak wspomniano przy okazji [[dydaktyka:​cprog:​2015:​arrays#​deklarowanie1|deklarowania tablic wielowymiarowych]],​ komputer przechowuje w pamięci tablicę dwuwymiarową (perspektywa tablicowa) w sposób liniowy -- jako kilka następujących po sobie tablic jednowymiarowych (perspektywa wskaźnikowa). 
- 
-Oto przykład takiego wyrównania dla obrazu o wymiarach $h \times w = 3 \times 2$: \\ 
-{{:​dydaktyka:​cprog:​2015:​byte_packing.png?​nolink|}} \\ 
-przy czym 
-$$\mbox{RowSize} = \left\lfloor\frac { \mbox{BitsPerPixel} \cdot \mbox{ImageWidth} + 31 }{32} \right\rfloor \cdot 4 = \left\lfloor\frac { 8 \cdot 2 + 31 }{32} \right\rfloor \cdot 4 = \left\lfloor 1,46875 \right\rfloor \cdot 4 = 1 \cdot 4 = 4$$ 
- 
-=== Zadanie PTR2MAT === 
- 
-  * Uzupełnij kod funkcji ''​load_bitmap()''​ tak, aby poprawnie przepisał wartości pikseli przechowywanych w miejscu wskazywanym przez ''​bitmapBytes''​ (zawierającej wyrównane dane) do tablicy ''​image''​. 
- 
-  * Uzupełnij kod funkcji ''​save_bitmap()''​ dokonując operacji odwrotnej -- przepisz wartości pikseli przechowywanych w tablicy ''​image''​ do miejsca wskazywanego przez ''​bitmapBytes''​. \\ Pamiętaj o nadaniu bajtom wyrównania wartości ''​0''​! 
- 
-==== Dynamiczna alokacja tablicy-obrazu ==== 
- 
-W chwili pisania programu nie możemy przewidzieć,​ jakie rozmiary będzie miał wczytywany obraz. Oznacza to, że musimy skorzystać z [[dydaktyka:​cprog:​2015:​dynamic_memory_allocation#​alokacja_pamieci_dla_tablicy_dwuwymiarowej|dynamicznej alokacji pamięci]] w celu utworzenia tablicy o odpowiednim rozmiarze, w której następnie będziemy trzymać wartości pikseli wczytanego obrazu. 
- 
-=== Zadanie IMALLOC === 
- 
-  * Uzupełnij funkcję ''​create_matrix()''​ zgodnie z jej opisem w kodzie programu. 
-  * Uzupełnij funkcję ''​destroy_matrix()''​ zgodnie z jej opisem w kodzie programu. 
dydaktyka/cprog/2015/photoshop.1448380889.txt.gz · Last modified: 2020/03/25 11:46 (external edit)