moved report files in dedicated folder
This commit is contained in:
parent
40279e916e
commit
62ab7d4b8c
@ -27,7 +27,7 @@ Afin de résoudre ce problème, je me suis basé sur un algorithme de M. Jean-Ja
|
|||||||
Actuellement, avec l’image de test que l’on peut trouver sur mon dépôt git (lien en annexes) d’une taille de 3582016 octets, j’obtiens un taux de compression de 67% environ avec une image compressée à 2403581 octets.
|
Actuellement, avec l’image de test que l’on peut trouver sur mon dépôt git (lien en annexes) d’une taille de 3582016 octets, j’obtiens un taux de compression de 67% environ avec une image compressée à 2403581 octets.
|
||||||
|
|
||||||
Pour ce qui est du temps d’exécution, j’exécute le script suivant avec la commande ~./run-time.sh 10~ (10 étant le nombre d’exécutions que je souhaite effectuer) afin d’obtenir le temps d’exécution à répétition du programme :
|
Pour ce qui est du temps d’exécution, j’exécute le script suivant avec la commande ~./run-time.sh 10~ (10 étant le nombre d’exécutions que je souhaite effectuer) afin d’obtenir le temps d’exécution à répétition du programme :
|
||||||
#+INCLUDE: ./run-time.sh src shell
|
#+INCLUDE: ../run-time.sh src shell
|
||||||
|
|
||||||
Ainsi, j’obtient la moyenne sur dix exécutions d’un temps d’exécution de 7.06 secondes sur un CPU Intel i7-6700HQ (3.500GHz).
|
Ainsi, j’obtient la moyenne sur dix exécutions d’un temps d’exécution de 7.06 secondes sur un CPU Intel i7-6700HQ (3.500GHz).
|
||||||
|
|
||||||
@ -273,7 +273,7 @@ La nouvelle option ~-t~ est une option très sensible qui peut profondément cha
|
|||||||
On remarque cependant qu’après environ 30% de tolérance de couleur, les temps ont tendance à remonter et les fichiers ont tendance à devenir plus lours, excepté pour la tolérance de 50%. Je suppose qu’il s’agit du fait d’un grand nombre de segments contigus de couleur différente s’alternant rapidement. En tous cas, bien qu’on aie en effet quelques améliorations concernant la taille de l’image compressée, je ne considère personellement pas cette technique comme en vallant la peine du fait d’artéfacts facilement visibles dès les premières valeurs proches de 0, comme on peut le voir sur l’image ci-dessous, compressée avec une tolérance de 5% :
|
On remarque cependant qu’après environ 30% de tolérance de couleur, les temps ont tendance à remonter et les fichiers ont tendance à devenir plus lours, excepté pour la tolérance de 50%. Je suppose qu’il s’agit du fait d’un grand nombre de segments contigus de couleur différente s’alternant rapidement. En tous cas, bien qu’on aie en effet quelques améliorations concernant la taille de l’image compressée, je ne considère personellement pas cette technique comme en vallant la peine du fait d’artéfacts facilement visibles dès les premières valeurs proches de 0, comme on peut le voir sur l’image ci-dessous, compressée avec une tolérance de 5% :
|
||||||
src_latex{\newpage}
|
src_latex{\newpage}
|
||||||
#+ATTR_LATEX: :width 4.0in
|
#+ATTR_LATEX: :width 4.0in
|
||||||
[[./img/asterix5p.png]]
|
[[../img/asterix5p.png]]
|
||||||
|
|
||||||
Dans le cas où cela ne serait pas bien visible en version papier, une version digitale de ce document est disponible en ligne, voir le lien donnée en [[*Liens][annexes]].
|
Dans le cas où cela ne serait pas bien visible en version papier, une version digitale de ce document est disponible en ligne, voir le lien donnée en [[*Liens][annexes]].
|
||||||
|
|
||||||
@ -291,40 +291,40 @@ src_latex{\newpage}
|
|||||||
** Image de test
|
** Image de test
|
||||||
|
|
||||||
#+ATTR_LATEX: :width 4.0in
|
#+ATTR_LATEX: :width 4.0in
|
||||||
[[./img/asterix.png]]
|
[[../img/asterix.png]]
|
||||||
|
|
||||||
src_latex{\newpage}
|
src_latex{\newpage}
|
||||||
** Code source
|
** Code source
|
||||||
|
|
||||||
~main.c~
|
~main.c~
|
||||||
#+INCLUDE: ./src/main.c src C -n
|
#+INCLUDE: ../src/main.c src C -n
|
||||||
|
|
||||||
~compress.h~
|
~compress.h~
|
||||||
#+INCLUDE: ./src/compress.h src C -n
|
#+INCLUDE: ../src/compress.h src C -n
|
||||||
|
|
||||||
~compress.c~
|
~compress.c~
|
||||||
#+INCLUDE: ./src/compress.c src C -n
|
#+INCLUDE: ../src/compress.c src C -n
|
||||||
|
|
||||||
~uncompress.h~
|
~uncompress.h~
|
||||||
#+INCLUDE: ./src/uncompress.h src C -n
|
#+INCLUDE: ../src/uncompress.h src C -n
|
||||||
|
|
||||||
~uncompress.c~
|
~uncompress.c~
|
||||||
#+INCLUDE: ./src/uncompress.c src C -n
|
#+INCLUDE: ../src/uncompress.c src C -n
|
||||||
|
|
||||||
~ppm.h~
|
~ppm.h~
|
||||||
#+INCLUDE: ./src/ppm.h src C -n
|
#+INCLUDE: ../src/ppm.h src C -n
|
||||||
|
|
||||||
~ppm.c~
|
~ppm.c~
|
||||||
#+INCLUDE: ./src/ppm.c src C -n
|
#+INCLUDE: ../src/ppm.c src C -n
|
||||||
|
|
||||||
~utilities.h~
|
~utilities.h~
|
||||||
#+INCLUDE: ./src/utilities.h src C -n
|
#+INCLUDE: ../src/utilities.h src C -n
|
||||||
|
|
||||||
~utilities.c~
|
~utilities.c~
|
||||||
#+INCLUDE: ./src/utilities.c src C -n
|
#+INCLUDE: ../src/utilities.c src C -n
|
||||||
|
|
||||||
~darray.h~
|
~darray.h~
|
||||||
#+INCLUDE: ./src/darray.h src C -n
|
#+INCLUDE: ../src/darray.h src C -n
|
||||||
|
|
||||||
~darray.c~
|
~darray.c~
|
||||||
#+INCLUDE: ./src/darray.c src C -n
|
#+INCLUDE: ../src/darray.c src C -n
|
Binary file not shown.
112
src/compress.c
112
src/compress.c
@ -1,57 +1,57 @@
|
|||||||
/**
|
/**
|
||||||
* \file compress.c
|
* \file compress.c
|
||||||
* \brief Implémentation de la (dé)compression d’images
|
* \brief Implémentation de la (dé)compression d’images
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "compress.h"
|
#include "compress.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \var uint32_t tolerance
|
* \var uint32_t tolerance
|
||||||
* \brief Color tolerance
|
* \brief Color tolerance
|
||||||
*
|
*
|
||||||
* Cette variable est la valeur du pourcentage de tolérance couleur lors de la
|
* Cette variable est la valeur du pourcentage de tolérance couleur lors de la
|
||||||
* création de nouvelles zones. Cette variable contient une valeur située entre
|
* création de nouvelles zones. Cette variable contient une valeur située entre
|
||||||
* 0 et 100 inclus.
|
* 0 et 100 inclus.
|
||||||
*/
|
*/
|
||||||
int32_t tolerance;
|
int32_t tolerance;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cette fonction permet d’évaluer si le pixel passé en argument est éligible à
|
* Cette fonction permet d’évaluer si le pixel passé en argument est éligible à
|
||||||
* la zone passée également en argument. Si la \ref tolerance a pour valeur 0,
|
* la zone passée également en argument. Si la \ref tolerance a pour valeur 0,
|
||||||
* alors les couleurs doivent être strictements identiques. Sinon, leur
|
* alors les couleurs doivent être strictements identiques. Sinon, leur
|
||||||
* différence doit être inférieure à la tolérance de couleur.
|
* différence doit être inférieure à la tolérance de couleur.
|
||||||
*
|
*
|
||||||
* \param[in] t_pixel Pointeur vers le pixel dont l’éligibilité est testée
|
* \param[in] t_pixel Pointeur vers le pixel dont l’éligibilité est testée
|
||||||
* \param[in] t_zone Zone à laquelle le pixel est éligible ou non
|
* \param[in] t_zone Zone à laquelle le pixel est éligible ou non
|
||||||
* \return Valeur booléenne, `1` si le pixel est éligible, `0` sinon
|
* \return Valeur booléenne, `1` si le pixel est éligible, `0` sinon
|
||||||
*/
|
*/
|
||||||
int32_t sameColor(Pixel *t_pixel, Zone *t_zone) {
|
int32_t sameColor(Pixel *t_pixel, Zone *t_zone) {
|
||||||
int diff_red, diff_green, diff_blue;
|
int diff_red, diff_green, diff_blue;
|
||||||
if (tolerance == 0) {
|
if (tolerance == 0) {
|
||||||
return (t_pixel->red == t_zone->red && t_pixel->green == t_zone->green &&
|
return (t_pixel->red == t_zone->red && t_pixel->green == t_zone->green &&
|
||||||
t_pixel->blue == t_zone->blue)
|
t_pixel->blue == t_zone->blue)
|
||||||
? 1
|
? 1
|
||||||
: 0;
|
: 0;
|
||||||
}
|
}
|
||||||
diff_red = (abs((int32_t)t_zone->red - (int32_t)t_pixel->red) * 100) / 255;
|
diff_red = (abs((int32_t)t_zone->red - (int32_t)t_pixel->red) * 100) / 255;
|
||||||
diff_green =
|
diff_green =
|
||||||
(abs((int32_t)t_zone->green - (int32_t)t_pixel->green) * 100) / 255;
|
(abs((int32_t)t_zone->green - (int32_t)t_pixel->green) * 100) / 255;
|
||||||
diff_blue = (abs((int32_t)t_zone->blue - (int32_t)t_pixel->blue) * 100) / 255;
|
diff_blue = (abs((int32_t)t_zone->blue - (int32_t)t_pixel->blue) * 100) / 255;
|
||||||
return ((diff_red + diff_green + diff_blue) / 3) <= tolerance;
|
return ((diff_red + diff_green + diff_blue) / 3) <= tolerance;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ajoute un pixel à la zone passé en argument si le pixel à l’index passé en
|
* Ajoute un pixel à la zone passé en argument si le pixel à l’index passé en
|
||||||
* argument est éligible à la zone. Si un pixel n’a pas encore été visité, cela
|
* argument est éligible à la zone. Si un pixel n’a pas encore été visité, cela
|
||||||
* veut dire également qu’il ne fait partie d’aucun segment, il sera donc
|
* veut dire également qu’il ne fait partie d’aucun segment, il sera donc
|
||||||
* ajouté à un nouveau segment auquel seront rajoutés tous les pixels connexes
|
* ajouté à un nouveau segment auquel seront rajoutés tous les pixels connexes
|
||||||
* éligibles à la zone. Ensuite, le segment est ajouté à la zone, et la
|
* éligibles à la zone. Ensuite, le segment est ajouté à la zone, et la
|
||||||
* fonction actuelle est appelée sur tous les pixels supérieurs et inférieurs
|
* fonction actuelle est appelée sur tous les pixels supérieurs et inférieurs
|
||||||
* aux pixels du segment.
|
* aux pixels du segment.
|
||||||
*
|
*
|
||||||
* \param[in] t_img Image contenant les pixels explorés
|
* \param[in] t_img Image contenant les pixels explorés
|
||||||
* \param[in] t_idx Index du pixel actuel dans l’image `t_img`
|
* \param[in] t_idx Index du pixel actuel dans l’image `t_img`
|
||||||
* \param[out] t_zone Zone à laquelle sera potentiellement ajouté le pixel
|
* \param[out] t_zone Zone à laquelle sera potentiellement ajouté le pixel
|
||||||
*/
|
*/
|
||||||
void addPixelToSelectedZone(Image *t_img, int64_t t_idx, Zone *t_zone) {
|
void addPixelToSelectedZone(Image *t_img, int64_t t_idx, Zone *t_zone) {
|
||||||
const size_t img_size = darraySize(t_img->pixels);
|
const size_t img_size = darraySize(t_img->pixels);
|
||||||
@ -95,13 +95,13 @@ void addPixelToSelectedZone(Image *t_img, int64_t t_idx, Zone *t_zone) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sélectionne la zone correspondant à la couleur du pixel. Si aucune zone
|
* Sélectionne la zone correspondant à la couleur du pixel. Si aucune zone
|
||||||
* existante ne correspond, une nouvelle est créée et est ajoutée à l'image.
|
* existante ne correspond, une nouvelle est créée et est ajoutée à l'image.
|
||||||
* Chaque pixel est itéré, et ignoré si le pixel a déjà été visité auparavant.
|
* Chaque pixel est itéré, et ignoré si le pixel a déjà été visité auparavant.
|
||||||
*
|
*
|
||||||
* \param[out] t_img L’image contenant les pixels à tester
|
* \param[out] t_img L’image contenant les pixels à tester
|
||||||
* \param[in] t_idx Index du pixel à tester
|
* \param[in] t_idx Index du pixel à tester
|
||||||
* \param[out] t_zones Liste des zones de l’image
|
* \param[out] t_zones Liste des zones de l’image
|
||||||
*/
|
*/
|
||||||
void chooseZoneForPixel(Image *t_img, int64_t t_idx, darray *t_zones) {
|
void chooseZoneForPixel(Image *t_img, int64_t t_idx, darray *t_zones) {
|
||||||
Zone *current_zone;
|
Zone *current_zone;
|
||||||
@ -124,10 +124,10 @@ void chooseZoneForPixel(Image *t_img, int64_t t_idx, darray *t_zones) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Génère les zones de l’image en titérant chaque pixel de l’image.
|
* Génère les zones de l’image en titérant chaque pixel de l’image.
|
||||||
*
|
*
|
||||||
* \param t_img Image à convertir en zones
|
* \param t_img Image à convertir en zones
|
||||||
* \return Pointeur vers un \ref darray de structures \ref Zone
|
* \return Pointeur vers un \ref darray de structures \ref Zone
|
||||||
*/
|
*/
|
||||||
darray *imgToZones(Image *t_img) {
|
darray *imgToZones(Image *t_img) {
|
||||||
darray *zones;
|
darray *zones;
|
||||||
@ -141,12 +141,12 @@ darray *imgToZones(Image *t_img) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cette fonction écrit dans \p t_output la taille en `uint64_t` de la zone,
|
* Cette fonction écrit dans \p t_output la taille en `uint64_t` de la zone,
|
||||||
* c’est à dire le nombre de segment qu’elle contient, puis écrit
|
* c’est à dire le nombre de segment qu’elle contient, puis écrit
|
||||||
* individuellement chaque segment dans \p t_output.
|
* individuellement chaque segment dans \p t_output.
|
||||||
*
|
*
|
||||||
* \param[out] t_output Fichier de sortie
|
* \param[out] t_output Fichier de sortie
|
||||||
* \param[in] t_segments Segments à écrire dans \p t_output
|
* \param[in] t_segments Segments à écrire dans \p t_output
|
||||||
*/
|
*/
|
||||||
void write_segments(FILE *t_output, darray *t_segments) {
|
void write_segments(FILE *t_output, darray *t_segments) {
|
||||||
uint64_t nb_segments, j;
|
uint64_t nb_segments, j;
|
||||||
@ -160,17 +160,17 @@ void write_segments(FILE *t_output, darray *t_segments) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Écrit la taille de l’image en abscisse et ordonnées, les deux sous forme de
|
* Écrit la taille de l’image en abscisse et ordonnées, les deux sous forme de
|
||||||
* `uint64_t` puis le nombre de zones sous forme de `uint64_t`. Puis, pour
|
* `uint64_t` puis le nombre de zones sous forme de `uint64_t`. Puis, pour
|
||||||
* chaque zone son code couleur composé de trois `uint8_t` successifs
|
* chaque zone son code couleur composé de trois `uint8_t` successifs
|
||||||
* représentant ses couleurs rouge, vert et bleu sont écrit dans le fichier de
|
* représentant ses couleurs rouge, vert et bleu sont écrit dans le fichier de
|
||||||
* sortie \p t_output. Après chaque écriture de zone, l’ensemble des segments
|
* sortie \p t_output. Après chaque écriture de zone, l’ensemble des segments
|
||||||
* de la zone est libéré de la mémoire. Une fois toutes les zones écrites dans
|
* de la zone est libéré de la mémoire. Une fois toutes les zones écrites dans
|
||||||
* le fichier de sortie, \p t_zones et libéré de la mémoire.
|
* le fichier de sortie, \p t_zones et libéré de la mémoire.
|
||||||
*
|
*
|
||||||
* \param[in] t_img \ref Image contenant les dimensions du fichier d’origine
|
* \param[in] t_img \ref Image contenant les dimensions du fichier d’origine
|
||||||
* \param[out] t_output Fichier où sont écrites les données compressées
|
* \param[out] t_output Fichier où sont écrites les données compressées
|
||||||
* \param[in] t_zones Tableau des \ref Zone à écrire puis libérer
|
* \param[in] t_zones Tableau des \ref Zone à écrire puis libérer
|
||||||
*/
|
*/
|
||||||
void write_compressed_file(Image *t_img, FILE *t_output, darray *t_zones) {
|
void write_compressed_file(Image *t_img, FILE *t_output, darray *t_zones) {
|
||||||
uint64_t i, nb_zones = darraySize(t_zones);
|
uint64_t i, nb_zones = darraySize(t_zones);
|
||||||
@ -187,12 +187,12 @@ void write_compressed_file(Image *t_img, FILE *t_output, darray *t_zones) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convertit une image en zones puis écrit ces zones dans un fichier,
|
* Convertit une image en zones puis écrit ces zones dans un fichier,
|
||||||
* compressant ainsi l'image passée en argument.
|
* compressant ainsi l'image passée en argument.
|
||||||
*
|
*
|
||||||
* \param[in] t_input_file Nom/chemin du fichier `.ppm` d'entrée
|
* \param[in] t_input_file Nom/chemin du fichier `.ppm` d'entrée
|
||||||
* \param[in] t_output_file Nom/chemin du fichier `.su` de sortie
|
* \param[in] t_output_file Nom/chemin du fichier `.su` de sortie
|
||||||
* \param[in] t_tolerance Pourcentage de tolérance de couleur
|
* \param[in] t_tolerance Pourcentage de tolérance de couleur
|
||||||
*/
|
*/
|
||||||
void compress(const char *t_input_file, const char *t_output_file,
|
void compress(const char *t_input_file, const char *t_output_file,
|
||||||
int32_t t_tolerance) {
|
int32_t t_tolerance) {
|
||||||
|
Loading…
Reference in New Issue
Block a user