Sous-échantillonnage d'une image et création d'une icone

Sous-échantillonnage d'une image et création d'une icone - C++ - Programmation

Marsh Posté le 27-02-2013 à 17:11:02    

Bonjour à tous,
 
je suis un débutant en traitement d'image. Mon problème est le suivant : je cherche à créer une icone à partir d'une image d'origine beaucoup plus imposante. Il me semble donc évident qu'il faut sous-échantillonner cette image c'est à dire prendre un pixel sur "x" de façon à dégonfler cette image.
 
L'image de départ à une taille de 2567 * 9280 (largeur * hauteur). Je cherche à obtenir une icone de cette image c'est a dire une image de :
128 * ((9280/2567)*128) (en respectant les proportions initiales)
 
L'image d'origine est un ppm codé sur 12-bits RGB.  
 
J'avais pensé à l'algo suivant mais ça ne fonctionne pas aussi bien que prévu  
 
int sampling_factor = 128;
int step = width / sampling_factor;
for (i = 0; i < buffer_size; i+= step) {
flux<< buffer[0][i] <<" "<<buffer[1][i] << " "<<buffer[2][i];
 
if ((i>0) && (i % (sampling_factor*step) == 0)){
flux << "\n";
}else{
flux<< " ";
}
}
 
 
Précision : "buffer" est un tableau bidimensionnel, pour, respectivement, les couleurs (RGB = 0,1 ou 2) et la valeur des pixels.
 
 
Quelqu'un pourrait-il m'aider à améliorer mon algo afin qu'il fonctionne convenablement ?
 
PS : désolé si l’algo n'est pas très lisible ...

Reply

Marsh Posté le 27-02-2013 à 17:11:02   

Reply

Marsh Posté le 27-02-2013 à 20:49:44    

A vu de nez ton algo ressemble à du "nearest neighbor" (plus proche voisin), l'algo le plus basique que tu puisses trouver en matière de retaillage d'image. Sa qualité n'est franchement pas terrible, surtout avec des images de la taille que tu manipules.
 
Idéalement, tu devrais utiliser une bibliothèque de traitement d'image dédiée (genre: cairo, GDI+, SDL_gfx, GD, etc...). Si tu ne veux pas importer d'artillerie lourde, j'avais écrit un article sur le retaillage d'image par méthode linéaire (incomplet, mais l'algo est inclus):
 
http://en.literateprograms.org/Ima [...] ng_%28C%29
 
Coté performance et qualité, l'algo n'est pas trop mauvais, j'utilisais ça dans un visualisateur d'image cartographique (les images pouvaient faire jusqu'à 10000px), où tu pouvais zoomer jusqu'au format vignette avec très peu de latence. J'avais aussi implémenté le retaillage exponentiel mentionné à la fin, mais le code était vraiment moche.
 
L'algo décrit fonctionne uniquement avec des images en 8bps (bit per sample). Va falloir légèrement l'adapter pour traiter du 4bps.
 

Reply

Marsh Posté le 28-02-2013 à 11:01:44    

bjjnerd a écrit :

Quelqu'un pourrait-il m'aider à améliorer mon algo afin qu'il fonctionne convenablement ?

 

si tu veux réduire une image, tu as deux solutions :

 

- faire une "décimation", i.e. tu vas enlever n pixels parmi le total => ton image sera réduite mais assez dégeue

 

- faire une interpolation, le plus simple étant l'interpolation bilinéaire, c'est à dire que tu vas pouvoir réduire ton image avec un facteur quelconque

 

http://fr.wikipedia.org/wiki/Inter [...] %C3%A9aire

 

http://en.wikipedia.org/wiki/Image [...] ng_methods


Message édité par in_your_phion le 28-02-2013 à 11:07:12
Reply

Marsh Posté le 01-03-2013 à 16:47:30    

Merci pour vos réponses, cela m'a été bien utile !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed