added files for report, have to work some more on this project

This commit is contained in:
Phuntsok Drak-pa 2018-11-27 14:28:29 +01:00
parent 7d99a626e1
commit 1950215008
No known key found for this signature in database
GPG Key ID: 9CB34B6827C66D22
4 changed files with 87 additions and 3 deletions

9
.gitignore vendored
View File

@ -1,8 +1,11 @@
!.gitignore
*.out
*.su
*.tex
bin
build
debug
!.gitignore
*.out
_minted-rapport/
auto/
\.idea/
cmake-build-debug/
*.su

BIN
img/asterix.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

81
rapport.org Normal file
View File

@ -0,0 +1,81 @@
#+TITLE: Compression dimages par surfaces unies
#+SUBTITLE: Rapport de projet
#+AUTHOR: Lucien Cartier-Tilet
#+EMAIL: phundrak@phundrak.fr
#+CREATOR: Lucien Cartier-Tilet
#+LANGUAGE: fr
#+LATEX_CLASS: article
#+LaTeX_CLASS_OPTIONS: [a4paper,twoside]
#+LATEX_HEADER: \usepackage{xltxtra,fontspec,xunicode}\usepackage[total={6.5in,9.5in}]{geometry}\setromanfont[Numbers=Lowercase]{Charis SIL}
#+LATEX_HEADER: \usepackage{xcolor} \usepackage{hyperref}
#+LATEX_HEADER: \hypersetup{colorlinks=true,linkbordercolor=red,linkcolor=blue,pdfborderstyle={/S/U/W 1}}
#+OPTIONS: toc:nil
src_latex{\newpage}
#+TOC: headlines
src_latex{\newpage}
* Le problème
Le but de ce projet a été de créer un logiciel permettant la compression dimages via la détection de surfaces dune même couleur, ainsi que de permettre la décompression du fichier ainsi généré à la compression en une image identique à limage dorigine. Il est à noter que cet algorithme est orienté vers les images de style /comics/ ou avec peu de couleurs, doù limage test que vous trouverez en [[*Image de test][annexe]] qui fut mon image de test principale.
* Résolution initiale du problème
Afin de résoudre ce problème, je me suis basé sur un algorithme de M. Jean-Jaques Bourdin et lai adapté au problème de la manière suivante : pour chaque pixel de limage, je teste si le pixel courant a une couleur identique à la couleur dune surface, ou zone, déjà existante. Si une telle zone nexiste pas déjà, alors je la créé puis pour chaque pixel de la ligne courante je me déplace à lextrême gauche et à lextrême droite du segment de la même couleur que le pixel courant. Ainsi on obtient un segment de couleur unie, et il est donc possible de maintenant stocker uniquement les limites de ce segment et à lajouter à la collection de segments de la zone, qui elle contient les informations de la couleur de la zone. Ensuite, pour chaque pixel en dessus puis en dessous de ce segment, on répète la même procédure. Cela permet de lister toutes les zones contigües et de les ajouter ainsi à la zone courante.
* Améliorations possibles
** Algorithme
Il est possible daméliorer lalgorithme par rapport à celui utilisé initialement en ignorant létape de test des pixels supérieurs et inférieurs à un segment testé. En effet, cette étape est un résidu de lalgorithem dorigine qui a pour but de ne détecter quune zone dont tous les segments sont contigus à au moint un autre segment de la même forme, le tout ne constituant quune seule et unique forme continue. Hors ici ce dernier point ne nous intéresse pas, et deux formes de la même couleur nont pas à être considérées comme étant deux entités différentes. Ainsi, en ignorant cette étape cela permet de passer de manière itérative sur tous les pixels, simplifiant ainsi lalgorithme.
# TODO: faire cette version de lalgo
** Sortir du concept dimage avec des lignes et colonnes
Lalgorithme actuel considère le fichier dentrée comme étant une image en deux dimensions, limitant ainsi les segments au début dune ligne de pixels même si le pixel précédent dans le vecteur dans lequel ces derniers sont stockés est de la même couleur, divisant ainsi des segments en plusieurs segments inutilement. En ignorant ces fins de lignes pour ne procéder quà lanalyse des pixels comme ne faisant partie que dune ligne unique permettrait déviter ces ajouts inutiles de segments, et ainsi économiser un peu despace avec le fichier compressé. Cependant, je ne pense pas que cette solution soit aussi efficace que la possibilité suivante avec laquelle la possibilité actuelle doptimisation nest pas compatible.
** Espace de stockage
Actuellement, chaque position de pixel est stockée via deux ~uint64_t~ donnant lextrême gauche et lextrême droite dun segment, ainsi stockant le segment individuel sur seize octets. Lemplacement est considéré comme étant lemplacement sur un vecteur à dimension unique stockant successivement tous les pixels. Il est possible à la place de cette méthode de considérer la dimension duelle de limage et de ne stocker que la position verticale du segment et ses extrêmes gauche et droit sur un ~uint32_t~. Cela permet donc dindexer des segments sur des images de 2^{64} pixels (plus de quatre milliards de pixels) de haut et de large, ce qui est largement suffisant pour la majorité des cas, tout en utilisant quatre octets de moins que pour la version actuelle du programme. Il serait également possible de stocker ces valeurs sur trois ~uint16_t~, nutilisant ainsi que six octets au total et limitant la taille maximale de limage dentrée à 2^{16} pixels de haut et de large.
# TODO : bosser dessus
* Conclusion
src_latex{\newpage}
* Annexes
** Image de test
#+ATTR_LATEX: :width 4.0in
[[./img/asterix.png]]
src_latex{\newpage}
** Code source
~main.c~
#+INCLUDE: ./src/main.c src C -n
~compress.h~
#+INCLUDE: ./src/compress.h src C -n
~compress.c~
#+INCLUDE: ./src/compress.c src C -n
~uncompress.h~
#+INCLUDE: ./src/uncompress.h src C -n
~uncompress.c~
#+INCLUDE: ./src/uncompress.c src C -n
~ppm.h~
#+INCLUDE: ./src/ppm.h src C -n
~ppm.c~
#+INCLUDE: ./src/ppm.c src C -n
~utilities.h~
#+INCLUDE: ./src/utilities.h src C -n
~utilities.c~
#+INCLUDE: ./src/utilities.c src C -n
~darray.h~
#+INCLUDE: ./src/darray.h src C -n
~darray.c~
#+INCLUDE: ./src/darray.c src C -n

BIN
rapport.pdf Normal file

Binary file not shown.