Πώς μπορώ να κάνω υψηλής ποιότητας κλιμάκωση της εικόνας;

ψήφοι
18

Γράφω λίγο κώδικα σε κλίμακα 32 bit RGBA εικόνα σε C / C ++. Έχω γράψει μερικές προσπάθειες που έχουν κάπως επιτυχείς, αλλά είναι αργή και το πιο σημαντικό είναι η ποιότητα του μεγέθους της εικόνας δεν είναι αποδεκτή.

Έχω σχέση με την ίδια εικόνα σε κλίμακα από το OpenGL (π.χ. κάρτα γραφικών μου) και τη ρουτίνα μου και είναι μίλια χώρια στην ποιότητα. Έχω Κώδικα Google αναζητήσεις, πλυμένα δέντρα πηγή οτιδήποτε νόμιζα ότι θα ρίξει φως (SDL, Allegro, wxWidgets, CxImage, GD, ImageMagick, κ.λπ.), αλλά συνήθως κωδικό τους είτε είναι περίπλοκη και διάσπαρτα σε όλη τη χώρα και γεμάτη συναρμολόγησης και λίγο ή κανένα σχόλιο. Επίσης έχω διαβάσει πολλά άρθρα σχετικά με Wikipedia και αλλού, και είμαι απλά δεν βρουν μια σαφή εξήγηση για το τι χρειάζομαι. Καταλαβαίνω τις βασικές έννοιες της παρεμβολής και της δειγματοληψίας, αλλά είμαι αγωνίζεται για να πάρει το σωστό αλγόριθμο. Δεν θέλω να βασίζονται σε μια εξωτερική βιβλιοθήκη για μια ρουτίνα και να μετατρέψετε σε μορφή εικόνας τους και την πλάτη. Εκτός αυτού, θα ήθελα να ξέρω πώς να το κάνω μόνος μου έτσι κι αλλιώς. :)

Έχω δει μια παρόμοια ερώτηση σε στοίβα υπερχείλιση πριν, αλλά δεν απαντήθηκε πραγματικά με αυτόν τον τρόπο, αλλά ελπίζω ότι υπάρχει κάποιος εκεί έξω που μπορεί να βοηθήσει να ωθήσει μου προς τη σωστή κατεύθυνση. Ίσως σημείο μου σε ορισμένα άρθρα ή τον κωδικό ψευδο ... τα πάντα για να με βοηθήσει να μάθουν και να κάνουν.

Εδώ είναι αυτό που ψάχνω για:

  1. Δεν συναρμολόγησης (Γράφω πολύ φορητό κώδικας για πολλούς τύπους επεξεργαστών).
  2. Δεν υπάρχουν εξαρτήσεις από εξωτερικές βιβλιοθήκες.
  3. Ανησυχώ κυρίως με την κλιμάκωση DOWN, αλλά θα πρέπει επίσης να γράψετε μια κλίμακα μέχρι ρουτίνα αργότερα.
  4. Η ποιότητα του αποτελέσματος και τη σαφήνεια του αλγορίθμου είναι το πιο σημαντικό (μπορώ να το βελτιστοποιήσετε αργότερα).

ρουτίνα μου παίρνει ουσιαστικά την παρακάτω φόρμα:

DrawScaled(uint32 *src, uint32 *dst, 
      src_x, src_y, src_w, src_h, 
      dst_x, dst_y, dst_w, dst_h );

Ευχαριστώ!

UPDATE: Για να διευκρινιστεί, χρειάζομαι κάτι πιο προχωρημένο από ένα αναδειγματοληψία κουτί για συρρίκνωση που θολώνει την εικόνα πάρα πολύ. Υποψιάζομαι ότι αυτό που θέλω είναι ένα είδος δικυβικής (ή άλλες) φίλτρο το οποίο είναι κάπως το αντίθετο σε έναν αλγόριθμο δικυβικής upscaling (δηλαδή κάθε pixel προορισμό υπολογίζεται από όλες τις συμβάλλουν pixels πηγή σε συνδυασμό με έναν αλγόριθμο στάθμιση που κρατά τα πράγματα απότομη.

Παράδειγμα

Εδώ είναι ένα παράδειγμα του τι παίρνω από τον αλγόριθμο wxWidgets BoxResample εναντίον αυτό που θέλω σε 256x256 bitmap κλιμακωθεί σε 55x55.

  • www.free_image_hosting.net/uploads/1a25434e0b.png

Και τελικά:

  • www.free_image_hosting.net/uploads/eec3065e2f.png

η αρχική 256x256 εικόνα

Δημοσιεύθηκε 09/12/2008 στις 16:05
πηγή χρήστη
Σε άλλες γλώσσες...                            


11 απαντήσεις

ψήφοι
2

Τώρα που βλέπω την αρχική σας εικόνα, πιστεύω ότι OpenGL χρησιμοποιεί έναν αλγόριθμο πλησιέστερο γείτονα. Δεν είναι μόνο το απλούστερο δυνατό τρόπο για να αλλάξετε το μέγεθος, αλλά είναι επίσης ο πιο γρήγορος. Το μόνο μειονέκτημα είναι ότι φαίνεται πολύ πρόχειρη εάν υπάρχει οποιαδήποτε λεπτομέρεια στην αρχική σας εικόνα.

Η ιδέα είναι να πάρετε ομοιόμορφα κατανεμημένες δείγματα από την αρχική εικόνα σας? στην περίπτωσή σας, 55 από 256, ή ένα από κάθε 4,6545. Ακριβώς στη σειρά για να πάρει το pixel για να διαλέξετε.

Απαντήθηκε 10/12/2008 στις 04:20
πηγή χρήστη

ψήφοι
2

Είναι πιθανό ότι το OpenGL κάνει την κλιμάκωση στην περιοχή φορέα; Αν ναι, δεν υπάρχει κανένας τρόπος ώστε κάθε pixel με βάση το κλιμάκωση θα είναι κοντά του σε ποιότητα. Αυτό είναι το μεγάλο πλεονέκτημα των εικόνων με βάση φορέα.

Ο αλγόριθμος δικυβικής μπορεί να ρυθμιστεί για την οξύτητα εναντίον αντικείμενα - Είμαι προσπαθεί να βρει μια σύνδεση, θα το επεξεργαστείτε όταν το κάνω.

Επεξεργασία: Ήταν η εργασία Mitchell-Netravali που σκεφτόμουν, η οποία αναφέρεται στο κάτω μέρος αυτής της σχέσης:

http://www.cg.tuwien.ac.at/~theussl/DA/node11.html

Μπορεί επίσης να εξετάσει Lanczos αναδειγματοληψία ως εναλλακτική λύση για δικυβική.

Απαντήθηκε 09/12/2008 στις 19:00
πηγή χρήστη

ψήφοι
2

Μια αρκετά απλή και αξιοπρεπή αλγόριθμο για αναδειγματοληψία εικόνες είναι δικυβική παρεμβολή , wikipedia και μόνο έχει όλες τις πληροφορίες που χρειάζεστε για να πάρει αυτό υλοποιηθεί.

Απαντήθηκε 09/12/2008 στις 16:21
πηγή χρήστη

ψήφοι
2

Έχω διαπιστώσει την εφαρμογή wxWidgets αρκετά απλό να τροποποιήσει, όπως απαιτείται. Είναι όλα C ++ οπότε κανένα πρόβλημα με τη φορητότητα εκεί. Η μόνη διαφορά είναι ότι η εφαρμογή τους λειτουργεί με το ανυπόγραφο συστοιχίες char (το οποίο θεωρώ ότι είναι ο ευκολότερος τρόπος για να ασχοληθεί με τις εικόνες ούτως ή άλλως) με μια σειρά byte του RGB και το στοιχείο α σε ξεχωριστό πίνακα.

Αν ανατρέξτε στο «/ κοινό / image.cpp src» το αρχείο στο δέντρο πηγή wxWidgets υπάρχει μια λειτουργία κάτω-sampler που χρησιμοποιεί μια μέθοδο δειγματοληψίας κουτί «wxImage :: ResampleBox» και μια λειτουργία up-scaler που ονομάζεται «wxImage :: ResampleBicubic».

Απαντήθηκε 09/12/2008 στις 16:18
πηγή χρήστη

ψήφοι
1

Ακούγεται σαν αυτό που πραγματικά έχει δυσκολία κατανόησης είναι η διακριτή -> συνεχής -> διακριτή ροή που εμπλέκονται στην σωστή αναδειγματοληψία μιας εικόνας. Μια καλή τεχνική έκθεση που θα μπορούσε να βοηθήσει να σας δώσει την εικόνα για αυτό που χρειάζεστε είναι Alvy Ray Smith είναι ένα εικονοστοιχείο Δεν Μια Μικρή Πλατεία .

Απαντήθηκε 09/12/2008 στις 20:41
πηγή χρήστη

ψήφοι
1

Η Intel έχει IPP βιβλιοθήκες που παρέχουν αλγορίθμους παρεμβολής υψηλής ταχύτητας βελτιστοποιημένες για την οικογένεια επεξεργαστών της Intel. Είναι πολύ καλό, αλλά δεν είναι δωρεάν, όμως. Ρίξτε μια ματιά στο παρακάτω link:

Intel IPP

Απαντήθηκε 09/12/2008 στις 17:33
πηγή χρήστη

ψήφοι
1

Ένα γενικό άρθρο από την αγαπημένη μας υποδοχής: Καλύτερη αλλαγή μεγέθους εικόνας , συζητώντας τις σχετικές ιδιότητες των διαφόρων αλγορίθμων (και συνδέει με ένα άλλο άρθρο CodeProject).

Απαντήθηκε 09/12/2008 στις 17:12
πηγή χρήστη

ψήφοι
1

Δοκιμάστε να χρησιμοποιήσετε το Adobe Βιβλιοθήκη Generic εικόνας ( http://opensource.adobe.com/wiki/display/gil/Downloads ), αν θέλετε κάτι έτοιμο και όχι μόνο ένας αλγόριθμος.


Απόσπασμα από: http://www.catenary.com/howto/enlarge.html#c

Μεγέθυνση ή Σμίκρυνση - η C πηγαίου κώδικα Απαιτεί Victor Επεξεργασία Εικόνας Βιβλιοθήκη για 32-bit των Windows v 5.3 ή νεότερη έκδοση.


int enlarge_or_reduce(imgdes *image1)
{
   imgdes timage;
   int dx, dy, rcode, pct = 83; // 83% percent of original size

   // Allocate space for the new image
   dx = (int)(((long)(image1->endx - image1->stx + 1)) * pct / 100);
   dy = (int)(((long)(image1->endy - image1->sty + 1)) * pct / 100);
   if((rcode = allocimage(&timage, dx, dy,
      image1->bmh->biBitCount)) == NO_ERROR) {
      // Resize Image into timage
      if((rcode = resizeex(image1, &timage, 1)) == NO_ERROR) {
         // Success, free source image
         freeimage(image1);
         // Assign timage to image1
         copyimgdes(&timage, image1);
         }
      else // Error in resizing image, release timage memory
         freeimage(&timage);
      }
   return(rcode);
}

Αυτό το παράδειγμα αλλάζει το μέγεθος μια περιοχή της εικόνας και αντικαθιστά την αρχική εικόνα με την νέα εικόνα.

Απαντήθηκε 09/12/2008 στις 16:44
πηγή χρήστη


ψήφοι
0

Ως συνέχεια, ο Jeremy Ραντ δημοσιεύτηκε αυτό το άρθρο πιο πάνω. Εφαρμόζει διηθήθηκαν δύο πέρασμα αλλαγή μεγέθους. Οι πηγές είναι C #, αλλά φαίνεται αρκετά σαφές ότι μπορώ λιμάνι να δώσει μια δοκιμή. Βρήκα πολύ παρόμοιο κώδικα C χθες που ήταν πολύ πιο δύσκολο να καταλάβουμε (πολύ κακή ονόματα των μεταβλητών). Το πήρα για να ταξινομήσετε-of-εργασία, αλλά ήταν πολύ αργή και δεν παράγουν καλά αποτελέσματα που με οδήγησε να πιστεύω υπήρξε σφάλμα στην προσαρμογή μου. Μπορεί να έχω καλύτερη τύχη γράφει ότι από την αρχή με αυτό ως σημείο αναφοράς, η οποία θα προσπαθήσω.

Όμως, λαμβάνοντας υπόψη πως τα δύο έργα αλγόριθμο μπάλα αναρωτιέμαι αν δεν υπάρχει ένας γρηγορότερος τρόπος για να γίνει αυτό, ίσως ακόμη και σε ένα πέρασμα;

Απαντήθηκε 09/12/2008 στις 21:07
πηγή χρήστη

ψήφοι
0

Ρίξτε μια ματιά στο ImageMagick , που κάνει όλα τα είδη των φίλτρων αναβάθμισης.

Απαντήθηκε 09/12/2008 στις 18:57
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more