Sous-échantillonnage d'une image et création d'une icone - C++ - Programmation
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.
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
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 ...