Timonkaipumpa Δημοσ. 1 Σεπτεμβρίου 2012 Δημοσ. 1 Σεπτεμβρίου 2012 (επεξεργασμένο) Αγαπητέ Timonkaipumpa.Καταρχήν,με κάνεις και μισώ ένα απο τα αγαπημένα μου παιδικά καρτούν.Πριν το παίξεις έξυπνος("φταίει ο κώδικας"-χαίρω πολύ,παππαφλέσσας)και αρχίσεις να σκίζεις τα πτυχία σου επειδή δεν ξέρω πως να διαβάζω εικόνες στο matlab(απορώ απο που το έβγαλες το συμπέρασμα),σου λέω το εξής:I=imread('cameraman.jpg')-σε κάλυψα;Αν είναι να πετάξεις μόνο μία πατάτα απλά και μόνο για να φανείς,μην το κάνεις. Αγαπητέ capoelo Πριν απαντήσεις, θα ήταν καλό να διαβάζεις τι γράφει ο άλλος. Αυτά που είναι είναι "άλλα αντ' άλλων" σε αυτά που έγραψα. Εάν σε μπέρδεψε τόσο το "g"... τότε πάσο. Σε κάθε περίπτωση.. εάν μπορείς κάνε μου μία παράθεση που να λέω ότι δεν ξέρεις να διαβάζεις εικόνες. Επίσης, η ερώτηση στην οποία απάντησα ήταν: Το πρόβλημα μου είναι ότι όποτε του δίνω μια εικόνα και καλώ στη συνέχεια τη συνάρτηση,μου βγάζει σφάλμα "out of memory".Φταίει ο κώδικας η κάτι άλλο; Οπότε, δεν βλέπω γιατί παρεξηγήθηκες που απάντησα. Μήπως να το κοιτάξεις; [/background] Επεξ/σία 2 Σεπτεμβρίου 2012 από Timonkaipumpa
capoelo Δημοσ. 2 Σεπτεμβρίου 2012 Μέλος Δημοσ. 2 Σεπτεμβρίου 2012 Ρε μαν, εγκατεστησα matlab για το γ@μωτο της υποθεσης, εκανα copy paste ton κωδικα που λες οτι ξανα εγραψες στο #8 (αυτον κατω-κατω), τον τρεχω και μου εμφανιζονται κανονικα 3 εικονες, η μια ειναι η original και οι αλλες 2 noisy. Προφανως δε μπορω να ξερω αν το αποτελεσμα ειναι σωστό, δε ξερω τι περιμενεις ως αποτελεσμα, αλλα οι εικονες εμφανιζονται ΧΩΡΙΣ ΝΑ ΚΑΝΩ ΤΗ ΠΑΡΑΜΙΚΡΗ ΑΛΛΑΓΗ. Οποτε, εχεις θεμα στον τροπο που φορτωνεις την εικονα. Κοίτα,αποκλείεται να σου βγάζει κανονικά τις εικόνες(εμένα μου βγάζει τα αλμπουρνέζικα που έχω παραθέσει στο #8),εκτός αν παίζει καμιά μακακία με το matlab σε μένα.Δεν υπάρχει ΚΑΝΕΝΑ πρόβλημα στον τρόπο που φορτώνω την εικόνα(έτσι πιστεύω).Το γράφω και στο #13 αν διαβάσεις-το πρόβλημα είναι μόνο ότι αν δώσω την εικόνα απ'έξω απ'τη συνάρτηση,βγάζει πατάτες.
georgemarios Δημοσ. 2 Σεπτεμβρίου 2012 Δημοσ. 2 Σεπτεμβρίου 2012 Κοίτα,αποκλείεται να σου βγάζει κανονικά τις εικόνες(εμένα μου βγάζει τα αλμπουρνέζικα που έχω παραθέσει στο #8),εκτός αν παίζει καμιά μακακία με το matlab σε μένα.Δεν υπάρχει ΚΑΝΕΝΑ πρόβλημα στον τρόπο που φορτώνω την εικόνα(έτσι πιστεύω).Το γράφω και στο #13 αν διαβάσεις-το πρόβλημα είναι μόνο ότι αν δώσω την εικόνα απ'έξω απ'τη συνάρτηση,βγάζει πατάτες. Κοιτα, ψευτης δεν είμαι, δες και την εικόνα παρακάτω. Για να το τρέξω, έγραψα > leo = imread('leonidas.jpg'); tv(leo); H εκτελεση κρατησε μερικα δευτερολεπτα (5-10) αλλα αυτο εχει να κανει με την αποτελεσματικοτητα του αλγοριθμου, πιστευω πως γινεται γρηγοροτερα. Τσεκαρε παντως τον κωδικα, ειναι ο δικος σου.
capoelo Δημοσ. 2 Σεπτεμβρίου 2012 Μέλος Δημοσ. 2 Σεπτεμβρίου 2012 Κοιτα, ψευτης δεν είμαι, δες και την εικόνα παρακάτω. Δεν είπα κάτι τέτοιο.Τέσπα,καμιά ιδέα για το τι μπορεί να φταίει και να μην δέχεται την εικόνα απ'έξω;
Timonkaipumpa Δημοσ. 2 Σεπτεμβρίου 2012 Δημοσ. 2 Σεπτεμβρίου 2012 (επεξεργασμένο) Capoelo, Βάλε ένα breakpoint ακριβώς πριν από το double, στην δεύτερη γραμμή, και όταν το χτυπήσει δώσε imshow(Ι). Εάν έχεις πρόβλημα εκεί, τότε κάνε imread και imshow χωρίς να καλέσεις την function που έφτιαξες. Εάν δεν έχεις πρόβλημα εκεί, βάλε breakpoint μετά το double και ξανακάνε imshow(I). edit: Τώρα είδα ότι δεν υπάρχει κάτι πριν από το double. Βάλε το BP στο double.... ούτως ή άλλως πριν την εκτελέσει θα σταματήσει οπότε θα μπορέσεις να δεις. Πάντως, αρχίζω να πιστεύω ότι είτε η εικόνα που φορτώνεις είναι αρκετά μεγάλη με αποτέλεσμα το java heap space του MATLAB που έχεις ορίσει να είναι μικρό είτε έχει υποστεί κάποια τροποποίηση η imgread (ίσως μέσα στο path να είναι κάποια άλλη με ίδιο όνομα). Για αυτό, δοκίμασε μία με αυτά που σου είπα παραπάνω. Επεξ/σία 2 Σεπτεμβρίου 2012 από Timonkaipumpa
Star_Light Δημοσ. 2 Σεπτεμβρίου 2012 Δημοσ. 2 Σεπτεμβρίου 2012 @georgemarios γενικα έχουν θεματακι τα προγραμματα σε Octave/Matlab με την ταχυτητα. Απλα στο συγκεκριμενο το επιβαρυνει και με το loop που κανει . Για παραδειγμα ένας κώδικας της μορφής > for i = 1:length(phi), sinphi(i) = sin(phi(i)); end; ειναι σημαντικά αργοτερος απο > sinphi = sin(phi);
georgemarios Δημοσ. 2 Σεπτεμβρίου 2012 Δημοσ. 2 Σεπτεμβρίου 2012 Το γνωρίζω. Ομως, έστω και έτσι, εγω αναφερόμουν στο στήσιμο του ίδιου του αλγορίθμου. Θελω να πω, κανει 500 iterations που είμαι σιγουρος πως ειναι αχρηστα. Και πιο πριν έκανε αναδρομή (100 φορες χειρότερα). Σιγουρα υπαρχει μια συνθήκη όπου τα αποτελεσματα ειναι ικανοποιητικα πολυ πιο πριν. Απλα αγνοω την φύση της μεθοδου και δεν ειμαι σε θεση να προτεινω μια αποτελεσματικη λύση. Προς το παρόν, εστιάζουμε στο να κάνει τα στοιχειώδη και βλέπουμε. 1
capoelo Δημοσ. 3 Σεπτεμβρίου 2012 Μέλος Δημοσ. 3 Σεπτεμβρίου 2012 (επεξεργασμένο) Απλα αγνοω την φύση της μεθοδου και δεν ειμαι σε θεση να προτεινω μια αποτελεσματικη λύση. google.com-total variation denoising wikipedia-Αυτή είναι η μέθοδος. Βελτιωμένος κώδικας: > function J=tv(lam) I=imread('cameraman.jpg'); figure(1); imshow(uint8(I)); title('Original') I=double(I); std_n=50; %τυπική απόκλιση γκαουσιανού θορύβου In = randn(size(I))*std_n; %προστιθέμενος θόρυβος I0 = I + In; %εικόνα με θόρυβο figure(2); imshow(uint8(I0)); title('Noisy image') J=0; i=0; j=0; n=numel(I0); for i=1:n for j=1:n sum2=abs((I0-In(i+1,j))-(I0-In(i,j)))+abs((I0-In(i,j+1))-(I0-In(i,j))); J=min((1/2*(sum((I0-I)^2)))+lam*sum2); end end figure(4); imshow(uint8(J)); title('Denoised image with lambda') Το πρόβλημα με την είσοδο το έλυσα(το matlab τρώει φλασιές)-το ζήτημα τώρρα είναι ότι μέσα στο for δεν μπορεί να κάνει την πράξη για το J γιατί λέει οι πίνακες δεν έχουν το ίδιο μέγεθος.Το έψαξα με size και παρατήρησα ότι το lam*sum2 είναι 512x512 ενώ το 1/2..... είναι 1x512.Τι μπορώ να κάνω γι'αυτό; Επεξ/σία 3 Σεπτεμβρίου 2012 από capoelo
Timonkaipumpa Δημοσ. 3 Σεπτεμβρίου 2012 Δημοσ. 3 Σεπτεμβρίου 2012 (επεξεργασμένο) Λογικά, δεν μπορεί να κάνει την πράξη: > (1/2*(sum((I0-I)^2))) Χωρίς να έχω τρέξει τον κώδικά σου, και ούτε να δω το link που παραθέτεις, εικάζω πως εάν τροποποιήσεις την γραμμή ως εξής: > J = min(( (1/2).* (sum((I0-I).^2)))+lam*sum2); θα τρέξει. Δεν ξέρω όμως εάν αυτό είναι αυτό που θες να κάνεις. Επίσης, δεν είναι ανάγκη να βάζεις size και να ελέγχεις το μέγεθος. Σε debug mode, εάν κάνεις hover το mouse πάνω από οποιαδήποτε μεταβλητή τότε θα σου δείξει το μέγεθος. Επεξ/σία 3 Σεπτεμβρίου 2012 από Timonkaipumpa
Timonkaipumpa Δημοσ. 3 Σεπτεμβρίου 2012 Δημοσ. 3 Σεπτεμβρίου 2012 ΟΚ. Μπορείς να παραθέσεις τις διαστάσεις των μεταβλητών σε αυτή την γραμμή κώδικα;
insomniaK Δημοσ. 4 Σεπτεμβρίου 2012 Δημοσ. 4 Σεπτεμβρίου 2012 1. Η πράξη Α^2 είναι διαφορετική από την πράξη Α.^2, τι ακριβώς προσπαθείς να κάνεις; 2. Πως δημιουργησες την lam και σε ποια διάσταση πρέπει να την εφαρμόσεις; 3. Το J δε φαίνεται να είναι array.
georgemarios Δημοσ. 4 Σεπτεμβρίου 2012 Δημοσ. 4 Σεπτεμβρίου 2012 Το πρόβλημα με την είσοδο το έλυσα(το matlab τρώει φλασιές)-το ζήτημα τώρρα είναι ότι μέσα στο for δεν μπορεί να κάνει την πράξη για το J γιατί λέει οι πίνακες δεν έχουν το ίδιο μέγεθος.Το έψαξα με size και παρατήρησα ότι το lam*sum2 είναι 512x512 ενώ το 1/2..... είναι 1x512.Τι μπορώ να κάνω γι'αυτό; Αν ψάξεις το documentation της μεθοδου sum() θα δεις πως όταν της δινεις δι-διαστατους πινακες σαν όρισμα, το αποτελεσμα είναι ένας μονο-διαστατος, καθε στοιχειο του οποιου ειναι το αθροισμα των αντιστοιχων στηλων του πινακα-όρισμα. Τωρα, ο κωδικας που γραφεις, σε σύγκριση με το wiki του αλγοριθμου που λες πως ακολουθεις, ενω ψιλοθυμίζει είναι σίγουρα διαφορετικος, ίσως ακολουθείς υποδείξεις του καθηγητή σου. Επειδη δε μπορω καθολου να μυρισω τα νυχια μου για το τι θελεις να πετυχεις, θελεις μηπως να μας γραψεις ακριβως τον μαθηματικο τυπο που χρειαζεσαι ώστε να τον μετατρεψουμε σε κώδικα σιγα-σιγα;
capoelo Δημοσ. 5 Σεπτεμβρίου 2012 Μέλος Δημοσ. 5 Σεπτεμβρίου 2012 ΟΚ. Μπορείς να παραθέσεις τις διαστάσεις των μεταβλητών σε αυτή την γραμμή κώδικα; Το 1/2..... είναι 1x512,το (lam*sum2)είναι 512x512,Ι0 I και sum2-512x512. 1. Η πράξη Α^2 είναι διαφορετική από την πράξη Α.^2, τι ακριβώς προσπαθείς να κάνεις; 2. Πως δημιουργησες την lam και σε ποια διάσταση πρέπει να την εφαρμόσεις; 3. Το J δε φαίνεται να είναι array. 1.http://en.wikipedia.org/wiki/Total_variation_denoising -2D digital signals 2.H lam είναι τιμή που δίνεται απο τον χρήστη(η παράμετρος λ που φαίνεται στην πράξη). Αν ψάξεις το documentation της μεθοδου sum() θα δεις πως όταν της δινεις δι-διαστατους πινακες σαν όρισμα, το αποτελεσμα είναι ένας μονο-διαστατος, καθε στοιχειο του οποιου ειναι το αθροισμα των αντιστοιχων στηλων του πινακα-όρισμα. Τωρα, ο κωδικας που γραφεις, σε σύγκριση με το wiki του αλγοριθμου που λες πως ακολουθεις, ενω ψιλοθυμίζει είναι σίγουρα διαφορετικος, ίσως ακολουθείς υποδείξεις του καθηγητή σου. Επειδη δε μπορω καθολου να μυρισω τα νυχια μου για το τι θελεις να πετυχεις, θελεις μηπως να μας γραψεις ακριβως τον μαθηματικο τυπο που χρειαζεσαι ώστε να τον μετατρεψουμε σε κώδικα σιγα-σιγα; http://en.wikipedia.org/wiki/Total_variation_denoising 2D digital signals-
georgemarios Δημοσ. 5 Σεπτεμβρίου 2012 Δημοσ. 5 Σεπτεμβρίου 2012 οκ, ποιος ειναι ο τύπος του Ε και ποιος του V στον κωδικα; Ξανα, αν κοιταξεις το documentation, η μεθοδος numel επιστρεφει τον αριθμο στοιχειων ενος πίνακα. Άρα, το n=numel(I0); θα επιστρέψει 512χ512 = 262144 κάνεις λοιπον > for 262144 for 262144 sum2 = 512x512 matrix // υποθετω προορίζεται για V(y) J = min ( 1x512 matrix, 512x512 matrix) // διαφορετικες διαστάσεις υποθέτω πως θέλουμε να καταλήξουμε με ένα J που θα είναι ίδιες διαστάσεις με την αρχική εικόνα; Τότε τις διαστάσεις πάρε τις με τον παρακάτω τρόπο > [nx, ny] = size(I); // after this, nx = 512, ny = 512 και αρχικοποιησε την J έτσι > J = zeros(nx,ny); // a nxXny matrix full of zeroes Όπως καταλαβαίνω, θα θέσεις στον αλγοριθμό σου τα στοιχεια της εικόνας 1-1 Οπότε > for i = 1:nx for j = 1:ny Vy = .... // must be a 1x1 matrix Exy = .....// must be a 1x1 matrix J(i,j) = min (Exy, Vy) end end Όλα αυτά ΑΝ καταλαβα καλα το πρόβλημα. Καλη συνέχεια
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα