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

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

Δημοσ. (επεξεργασμένο)

Αγαπητέ Timonkaipumpa.Καταρχήν,με κάνεις και μισώ ένα απο τα αγαπημένα μου παιδικά καρτούν.Πριν το παίξεις έξυπνος("φταίει ο κώδικας"-χαίρω πολύ,παππαφλέσσας)και αρχίσεις να σκίζεις τα πτυχία σου επειδή δεν ξέρω πως να διαβάζω εικόνες στο matlab(απορώ απο που το έβγαλες το συμπέρασμα),σου λέω το εξής:I=imread('cameraman.jpg')-σε κάλυψα;Αν είναι να πετάξεις μόνο μία πατάτα απλά και μόνο για να φανείς,μην το κάνεις.

 

Αγαπητέ capoelo

 

Πριν απαντήσεις, θα ήταν καλό να διαβάζεις τι γράφει ο άλλος. Αυτά που είναι είναι "άλλα αντ' άλλων" σε αυτά που έγραψα. Εάν σε μπέρδεψε τόσο το "g"... τότε πάσο. Σε κάθε περίπτωση.. εάν μπορείς κάνε μου μία παράθεση που να λέω ότι δεν ξέρεις να διαβάζεις εικόνες.

 

Επίσης, η ερώτηση στην οποία απάντησα ήταν:

 

 

 

Το πρόβλημα μου είναι ότι όποτε του δίνω μια εικόνα και καλώ στη συνέχεια τη συνάρτηση,μου βγάζει σφάλμα "out of memory".Φταίει ο κώδικας η κάτι άλλο;

 

Οπότε, δεν βλέπω γιατί παρεξηγήθηκες που απάντησα. Μήπως να το κοιτάξεις; [/background]

Επεξ/σία από Timonkaipumpa
  • Απαντ. 39
  • Δημ.
  • Τελ. απάντηση

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

Δημοσ.

Ρε μαν,

 

εγκατεστησα matlab για το γ@μωτο της υποθεσης, εκανα copy paste ton κωδικα που λες οτι ξανα εγραψες στο #8 (αυτον κατω-κατω), τον τρεχω και μου εμφανιζονται κανονικα 3 εικονες, η μια ειναι η original και οι αλλες 2 noisy.

Προφανως δε μπορω να ξερω αν το αποτελεσμα ειναι σωστό, δε ξερω τι περιμενεις ως αποτελεσμα, αλλα οι εικονες εμφανιζονται ΧΩΡΙΣ ΝΑ ΚΑΝΩ ΤΗ ΠΑΡΑΜΙΚΡΗ ΑΛΛΑΓΗ. Οποτε, εχεις θεμα στον τροπο που φορτωνεις την εικονα.

 

Κοίτα,αποκλείεται να σου βγάζει κανονικά τις εικόνες(εμένα μου βγάζει τα αλμπουρνέζικα που έχω παραθέσει στο #8),εκτός αν παίζει καμιά μακακία με το matlab σε μένα.Δεν υπάρχει ΚΑΝΕΝΑ πρόβλημα στον τρόπο που φορτώνω την εικόνα(έτσι πιστεύω).Το γράφω και στο #13 αν διαβάσεις-το πρόβλημα είναι μόνο ότι αν δώσω την εικόνα απ'έξω απ'τη συνάρτηση,βγάζει πατάτες.

Δημοσ.

Κοίτα,αποκλείεται να σου βγάζει κανονικά τις εικόνες(εμένα μου βγάζει τα αλμπουρνέζικα που έχω παραθέσει στο #8),εκτός αν παίζει καμιά μακακία με το matlab σε μένα.Δεν υπάρχει ΚΑΝΕΝΑ πρόβλημα στον τρόπο που φορτώνω την εικόνα(έτσι πιστεύω).Το γράφω και στο #13 αν διαβάσεις-το πρόβλημα είναι μόνο ότι αν δώσω την εικόνα απ'έξω απ'τη συνάρτηση,βγάζει πατάτες.

 

Κοιτα, ψευτης δεν είμαι, δες και την εικόνα παρακάτω.

Για να το τρέξω, έγραψα

>
leo = imread('leonidas.jpg');
tv(leo);

 

H εκτελεση κρατησε μερικα δευτερολεπτα (5-10) αλλα αυτο εχει να κανει με την αποτελεσματικοτητα του αλγοριθμου, πιστευω πως γινεται γρηγοροτερα. Τσεκαρε παντως τον κωδικα, ειναι ο δικος σου.

 

matlab.png

Δημοσ.

Κοιτα, ψευτης δεν είμαι, δες και την εικόνα παρακάτω.

 

Δεν είπα κάτι τέτοιο.Τέσπα,καμιά ιδέα για το τι μπορεί να φταίει και να μην δέχεται την εικόνα απ'έξω;

Δημοσ. (επεξεργασμένο)

Capoelo,

 

Βάλε ένα breakpoint ακριβώς πριν από το double, στην δεύτερη γραμμή, και όταν το χτυπήσει δώσε imshow(Ι).

 

Εάν έχεις πρόβλημα εκεί, τότε κάνε imread και imshow χωρίς να καλέσεις την function που έφτιαξες.

 

Εάν δεν έχεις πρόβλημα εκεί, βάλε breakpoint μετά το double και ξανακάνε imshow(I).

 

edit: Τώρα είδα ότι δεν υπάρχει κάτι πριν από το double. Βάλε το BP στο double.... ούτως ή άλλως πριν την εκτελέσει θα σταματήσει οπότε θα μπορέσεις να δεις.

 

Πάντως, αρχίζω να πιστεύω ότι είτε η εικόνα που φορτώνεις είναι αρκετά μεγάλη με αποτέλεσμα το java heap space του MATLAB που έχεις ορίσει να είναι μικρό είτε έχει υποστεί κάποια τροποποίηση η imgread (ίσως μέσα στο path να είναι κάποια άλλη με ίδιο όνομα). Για αυτό, δοκίμασε μία με αυτά που σου είπα παραπάνω.

Επεξ/σία από Timonkaipumpa
Δημοσ.

@georgemarios γενικα έχουν θεματακι τα προγραμματα σε Octave/Matlab με την ταχυτητα.

Απλα στο συγκεκριμενο το επιβαρυνει και με το loop που κανει .

 

Για παραδειγμα ένας κώδικας της μορφής

 

>

for i = 1:length(phi),
sinphi(i) = sin(phi(i));
end;

 

ειναι σημαντικά αργοτερος απο

 

>
sinphi = sin(phi);

Δημοσ.

Το γνωρίζω. Ομως, έστω και έτσι, εγω αναφερόμουν στο στήσιμο του ίδιου του αλγορίθμου. Θελω να πω, κανει 500 iterations που είμαι σιγουρος πως ειναι αχρηστα. Και πιο πριν έκανε αναδρομή (100 φορες χειρότερα). Σιγουρα υπαρχει μια συνθήκη όπου τα αποτελεσματα ειναι ικανοποιητικα πολυ πιο πριν. Απλα αγνοω την φύση της μεθοδου και δεν ειμαι σε θεση να προτεινω μια αποτελεσματικη λύση.

Προς το παρόν, εστιάζουμε στο να κάνει τα στοιχειώδη και βλέπουμε.

  • Like 1
Δημοσ. (επεξεργασμένο)

Απλα αγνοω την φύση της μεθοδου και δεν ειμαι σε θεση να προτεινω μια αποτελεσματικη λύση.

 

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.Τι μπορώ να κάνω γι'αυτό;

Επεξ/σία από capoelo
Δημοσ. (επεξεργασμένο)

Λογικά, δεν μπορεί να κάνει την πράξη:

 

>
(1/2*(sum((I0-I)^2)))

 

Χωρίς να έχω τρέξει τον κώδικά σου, και ούτε να δω το link που παραθέτεις, εικάζω πως εάν τροποποιήσεις την γραμμή ως εξής:

 

>
J = min(( (1/2).* (sum((I0-I).^2)))+lam*sum2);

 

θα τρέξει.

 

Δεν ξέρω όμως εάν αυτό είναι αυτό που θες να κάνεις.

 

Επίσης, δεν είναι ανάγκη να βάζεις size και να ελέγχεις το μέγεθος. Σε debug mode, εάν κάνεις hover το mouse πάνω από οποιαδήποτε μεταβλητή τότε θα σου δείξει το μέγεθος.

Επεξ/σία από Timonkaipumpa
Δημοσ.

1. Η πράξη Α^2 είναι διαφορετική από την πράξη Α.^2, τι ακριβώς προσπαθείς να κάνεις;

2. Πως δημιουργησες την lam και σε ποια διάσταση πρέπει να την εφαρμόσεις;

3. Το J δε φαίνεται να είναι array.

Δημοσ.

Το πρόβλημα με την είσοδο το έλυσα(το matlab τρώει φλασιές)-το ζήτημα τώρρα είναι ότι μέσα στο for δεν μπορεί να κάνει την πράξη για το J γιατί λέει οι πίνακες δεν έχουν το ίδιο μέγεθος.Το έψαξα με size και παρατήρησα ότι το lam*sum2 είναι 512x512 ενώ το 1/2..... είναι 1x512.Τι μπορώ να κάνω γι'αυτό;

 

Αν ψάξεις το documentation της μεθοδου sum() θα δεις πως όταν της δινεις δι-διαστατους πινακες σαν όρισμα, το αποτελεσμα είναι ένας μονο-διαστατος, καθε στοιχειο του οποιου ειναι το αθροισμα των αντιστοιχων στηλων του πινακα-όρισμα.

 

Τωρα, ο κωδικας που γραφεις, σε σύγκριση με το wiki του αλγοριθμου που λες πως ακολουθεις, ενω ψιλοθυμίζει είναι σίγουρα διαφορετικος, ίσως ακολουθείς υποδείξεις του καθηγητή σου. Επειδη δε μπορω καθολου να μυρισω τα νυχια μου για το τι θελεις να πετυχεις, θελεις μηπως να μας γραψεις ακριβως τον μαθηματικο τυπο που χρειαζεσαι ώστε να τον μετατρεψουμε σε κώδικα σιγα-σιγα;

Δημοσ.

ΟΚ.

 

Μπορείς να παραθέσεις τις διαστάσεις των μεταβλητών σε αυτή την γραμμή κώδικα;

 

Το 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- ea86f95f3bfa4ed413c4c688bce7f6a7.png

Δημοσ.

οκ, ποιος ειναι ο τύπος του Ε και ποιος του 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

 

Όλα αυτά ΑΝ καταλαβα καλα το πρόβλημα.

 

Καλη συνέχεια

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...