Προς το περιεχόμενο

Smooth image με averaging


zn2709

Προτεινόμενες αναρτήσεις

Ναι έχεις δίκιο. Πέρασα το κόμμα για τελεία. Η λύση που προτίνεις με τα μηδενικά όμως θα αλλιώσει το χρώμα. Σκέψου του ως εξής:

 

0 0 0

255 123 125

100 99 3

 

Ας πούμε ότι έχεις αυτά τα pixel όπου η δεύτερη σειρά είναι στην ουσία η πάνω άκρη της εικόνας και το κάνεις pad με μηδενικά (πρώτη σειρά). Αν πάρεις τα μηδενικά σαν κελιά και τα μετρήσεις και τα χρησιμοποιήσεις για την διαίρεση τότε θα πάρεις:

(0 + 0 + 0 + 255 + 123 + 125 + 100 + 99 + 3) / 9 = 78 (με στρογγυλοποίηση)

 

Ενώ κανονικά θα έπρέπει να βγάλεις την παρακάτω τιμή:

(255 + 123 + 125 + 100 + 99 + 3) / 6 = 118 (με στρογγυλοποίηση)

 

Όπως βλέπεις έχεις μεγάλη απόκλιση. Θα μπορούσες βέβαια να κάνεις έλεγχο για τα οριακά κελιά και να κάνεις σωστά τις διαιρέσεις κτλ. Αυτό όμως θα προσθέσει μόνο επιπλέον φόρτο στην λύση που έδωσα.

 

Τώρα το θέμα είναι γιατί του βγάζει οτι το pixel αυτό δεν ανοίκει στην εικόνα. Αν μπορούσε να μας δώσει τις διαστάσεις της εικόνας θα ήταν ακόμα καλύτερα για να ξέραμε τι ακριβώς παίζει.

 

ΥΓ: Με πρόλαβε.

 

EDIT

 

 

Μιας και δεν έχω xampp εγκατεστημένο και βαριέμαι απίστευτα να το κάνω τώρα, έχω μια υποψία για το τι παίζει. Η διαστάσεις της εικόνας είναι 162x81. Οπότε στο height η τιμή είναι 81 που σημαίνει οτι το index θα έχει τιμές [0,80]. Όταν όμως πάει να κάνει την boolean πράξη δεν γίνεται σωστά γιατί θα έπρεπε να είναι ως εξής:

 

 

>
is_right_edge = pixelx == width - 1
is_bottom_edge = pixely == height -1

 

Λογικά αν αλλάξεις αυτές τις δύο γραμμές θα είσαι οκ.

 

 

Άλλαξα τις γραμμές που λες και τώρα παίρνω αυτό: array(162) { [0]=> array(81) { [0]=> float(8940693.75) [1]=> float(9934104.1666667) [2]=> float(9999725.1666667) [3]=> float(9945026.8333333) [4]=> float(9518490.1666667) [5]=> float(8763763.3333333) [6]=> float(8162208.8333333) [7]=> int(8249675) [8]=> int(8949661) [9]=> float(9649689.5) [10]=> float(10043458.333333) [11]=> float(10262209.166667) [12]=> float(9168454.5) [13]=> float(7341775.6666667) [14]=> float(6062080.5) [15]=> float(6258986.3333333) [16]=> float(7910647.1666667) [17]=> float(9485679.6666667) [18]=> float(9857560.3333333) [19]=> float(9780931.5) [20]=> float(8752755.1666667) [21]=> float(6433833.3333333) [22]=> int(4804060) [23]=> float(5186948.6666667) [24]=> float(7133904.5) [25]=> float(9354352.1666667) [26]=> float(10262251.833333) [27]=> float(9966914.6666667) [28]=> float(9923181.5) [29]=> float(9923181.5) [30]=> int(9934104) [31]=> int(10141804) [32]=> float(10688275.333333) [33]=> float(11803148.666667) [34]=> float(12786780.333333) [35]=> int(13519064) [36]=> float(13978069.333333) [37]=> float(13978069.333333) [38]=> float(13978026.666667) [39]=> float(13978026.666667) [40]=> float(13978026.666667) [41]=> float(13978026.666667) [42]=> float(13978026.666667) [43]=> float(13978069.333333) [44]=> float(13978069.333333) [45]=> float(13825067.5) [46]=> float(13267459.666667) [47]=> float(12173961.333333) [48]=> float(10216510.333333) [49]=> float(7416994.1666667) [50]=> float(6432807.5) [51]=> float(8269896.5) [52]

 

η στρογγυλοποίηση θα γίνει με τη round()? η ακόμα πάνε στραβά τα πράγματα?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 95
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Μια χαρά πάνε τα πράγματα. Η round μια χαρά θα κάνει την δουλειά. Τώρα όμως δεν είμαι σίγουρος αν θα έπρεπε να έχεις χωρίσει σε τρεις πίνακες R, G, B για να πάρεις τις τιμές για κάθε χρώμα ξεχωριστά (δεν ξέρω πως ακριβώς διαχειρίζεται η PHP τις εικόνες και τα χρώματα). Δοκίμασε το έτσι αρχικά και αν δεις οτι δεν σου λειτουργεί σωστά, τότε άλλαξε το έτσι ώστε να έχεις για κάθε χρώμα (εννοώ πάντα τα RGB) ξεχωριστό πίνακα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι αλλά μιλάμε για pixel που είναι στην άκρη. Αυτά πως τα διαχειρίζεσαι;

 

Παράδειγμα έχουμε την παρακάτω εικόνα με zero padding και τη μάσκα 3x3. Στο δεύτερο επίπεδο δείχνω πως θα πατήσει η μάσκα στο πρώτο pixel της εικόνας και στο 3ο στάδιο ειναι το τελικό αποτέλεσμα smoothed για το πρώτο pixel.

 

Screenshot2012-05-15at23818PM.png

 

Αυτό πιστεύω ότι δουλεύει για οποιοδήποτε μέγεθος εικόνας και για μάσκα 3x3.

 

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

Επίσης νομίζω ότι η άσκηση του παιδιού έχει να κάνει περισσότερο με web progrogramming και λιγότερο με image processing, αν και πιστεύω ο καθηγητής του τους έμπλεξε λίγο με αυτή την άσκηση...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλά ναι το τελευταίο που λες ισχύει πολύ κιόλας.

 

Πέραν αυτού πάλι δεν κατάλαβες τι εννοώ πριν. Ρίξε μια καλύτερη ματιά στις πράξεις που έκανα. Θα δεις οτι στην μια περίπτωση έκανα διαίρεση με το 9 ενώ στην άλλη με το 6.

 

Από την στιγμή που μιλάμε για χρώμα το να κάνεις pad με μηδενικά θα προσθέσει επιπλέον μαύρο χρώμα στα ακριανά pixel. Αυτό που λέω εγώ στην ουσία είναι οτι το 3x3 mask στις άκρες δεν θα είναι 3x3. Για το πρώτο pixel πχ της εικόνας (0,0) θα έχεις μόνο 4 pixel από τα οποία θα μπορείς να πάρεις τιμές. Αυτά είναι τα: (0,0), (1,0), (0,1) και (1,1). Τα υπόλοιπα pixel της γειτονιάς είναι εκτός εικόνας και άρα δεν πρέπει να ληφθούν υπ' όψην. Γιατί όπως είπα αν τα θεωρήσεις οτι έχουν μηδέν τιμή αυτό αμέσως σημαίνει οτι προσθέτεις επιπλέον μαύρο στις άκρες της εικόνας. Μην το βλέπεις σαν ένα πρόβλημα ελαχιστοποίησης απλά όπου τα μηδενικά δεν έχουν αξία. Εδώ το μηδέν έχει αξία.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μην το βλέπεις σαν ένα πρόβλημα ελαχιστοποίησης απλά όπου τα μηδενικά δεν έχουν αξία. Εδώ το μηδέν έχει αξία.

Κατάλαβα!

 

Δεν είμαι σίγουρος, αλλά πιστεύω ότι όταν έκανα image processing σε grayscale εικόνες έτσι το είχα κάνει. Έχω πουλήσει και το βιβλίο για να το επιβεβαιώσω...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

 

Δες εδώ

Slide 14-15

 

Pad the image

•Typically with either all white or all black pixels

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ωραίο link αλλά δεν μας λέει ακριβώς σε ποιες περιπτώσεις ισχύει τι. Γιατί αν προσέξεις πρώτο αναφέρει αυτό που λέω εγώ σαν τεχνική.

Εξαρτάται οπότε από την περίπτωση και τι ακριβώς θέλεις να κάνεις.

 

Omit missing pixels

  • Only works with some filters
  • Can add extra code and slow down processing

Pad the image

  • Typically with either all white or all black pixels

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ωραίο link αλλά δεν μας λέει ακριβώς σε ποιες περιπτώσεις ισχύει τι. Γιατί αν προσέξεις πρώτο αναφέρει αυτό που λέω εγώ σαν τεχνική.

Εξαρτάται οπότε από την περίπτωση και τι ακριβώς θέλεις να κάνεις.

 

Φυσικά δεν είπα ότι η τεχνική σου είναι λάθος, απλά προσπαθούσα να υπερασπιστώ τη δικιά μου. :mrgreen:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι εννοείται. Απλά πιστεύω ότι στο προκειμένο φίλτρο η τεχνική αυτή δεν αρμόζει τόσο.

 

Δεν έχω άποψη σε αυτό που λες μιας και δε γνωρίζω αρκετά.

 

Πάντως το φτάσαμε 6 σελίδες το θέμα. Το κόβω ότι ο zn2709 θα το παρατήσει το τελευταίο ερώτημα της εργασίας :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

χαχαχα θα προσπαθήσω να μην το παρατήσω! :-P το θέμα μου είναι πως θα βάλω σε πίνακες ξεχωριστά τα τρία χρώματα? μέσω της imagecolorat και σε κάθε if θα προσθέτω σιγά σιγά τα χρώματα σε πίνακες?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Από το manual της PHP:

>$rgb = imagecolorat($im, 10, 15);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;

 

Εσύ αντί για τα $r, $g και $b θα έχεις στην θέση τους από έναν πίνακα. Τα indexes θα είναι τα ίδια όπως στον προηγούμενο κώδικα. Η μόνη αλλαγή είναι οτι θα κάνεις τον έναν πίνακα τρεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Από το manual της PHP:

>$rgb = imagecolorat($im, 10, 15);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;

 

Εσύ αντί για τα $r, $g και $b θα έχεις στην θέση τους από έναν πίνακα. Τα indexes θα είναι τα ίδια όπως στον προηγούμενο κώδικα. Η μόνη αλλαγή είναι οτι θα κάνεις τον έναν πίνακα τρεις.

 

 

δν μπορώ να καταλάβω καν πως θα συντάξω τέτοιο κομμάτι :-/

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αντί για παράδειγμα να γράψεις

>result[pixelx ][pixely] = getcolor(image, pixelx, pixely);

θα γράψεις

>
rgb = imagecolorat(im, pixelx, pixely);
r[pixelx][pixely] = (rgb >> 16) & 0xFF;
g[pixelx][pixely] = (rgb >> 8) & 0xFF;
b[pixelx][pixely] = rgb & 0xFF;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...