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

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

Δημοσ.

Έχω το εξής πρόβλημα:έχω γράψει μια συνάρτηση η οποία υλοποιεί total variation denoising(τεχνική για απομάκρυνση θορύβου απο εικόνες)και της δίνω ως είσοδο μια εικόνα με χρήση της εντολης imread.Μέσα στη συνάρτηση του λέω να κάνει κάποιες πράξεις με την εικόνα.Το πρόβλημα είναι ότι δεν την αναγνωρίζει!!!!!Τι κάνω;

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

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

Δημοσ.

Ok,το έλυσα αυτό.Νέα απορία-έχω τον εξής κώδικα

>
function J=tv(I)

I=double(I);

% παράμετροι

ep_J = 0.01; % ελάχιστη μέση μεταβολή της εικόνας J
lam=0; J_old=0;
iter=10; dt=0.2; eps=1;
std_n=20;
var_n = std_n^2; % διακύμανση θορύβου

In = randn(size(I))*std_n;
I0 = I + In;

J=I0;

while (mean(mean(abs(J - J_old))) > ep_J),  % iterate until convergence
  J_old = J;
  J=tv(I);	 % scalar lam
end

figure(4); imshow(uint8(J)); title('Denoised image with lambda')

 

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

 

Υ.Γ:έχω δοκιμάσει clear all,clear workspace κλπ.

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

Κάποιος;;;Ρε παιδιά,είναι πτυχιακή.Πλιζ,βοηθήστε.

 

Κοιτάζοντας ξανά τον κώδικα,κατάλαβα ότι έλειπε ο έλεγχος για το recursion.Έτσι,ξανάγραψα το while ως εξής:

>
while (mean(mean(abs(J - J_old))) > ep_J),  % iterate until convergence
  J_old = J;
  J=tv(I);	 % scalar lam
  lam = calc_lam(J,I0,var_n,eps); % update lambda (fidelity term)
  if(mean(mean(abs(J - J_old))) < ep_J),break,end
end % for i

 

Μου βγάζει όμως σφάλμα(ξανά):??? Maximum recursion limit of 500 reached. Use

set(0,'RecursionLimit',N)

to change the limit. Be aware that exceeding your

available stack space can

crash MATLAB and/or your computer.

 

Error in ==> mean

 

Τι φταίει;;;

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

Στην ουσία αυτό που σου λέει είναι οτι κάνεις πάνω από 500 αναδρομικές κλήσεις και το matlab έχει αυτό το όριο σαν default. Αν κάνεις πάνω από 500 σε κόβει. Μπορείς όμως λέει να το αλλάξεις (το όριο) χρησιμοποώντας την set(0,'RecursionLimit',N).

 

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

Δημοσ.

Δεν εχω matlab προχείρο να τσεκάρω, αλλά, έτσι όπως είναι σεταρισμενος ο κωδικάς σου, τι πιθανότητες έχει η συνθήκη του while να είναι false?

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

 

Βασικα, όπως το βλέπω, είναι πολυ ευκολο να μη κανεις αναδρομή. Με το παρακάτω χρησιμοποιείς μόνο 2 ενδιάμεσες εικόνες αντι για 500.....

 

>
function J=tv(I)
 I=double(I);
 ep_J = 0.01;
 J_old=0;
 std_n=20;
 In = randn(size(I))*std_n;
 I0 = I + In;
 J=I0;

 while (mean(mean(abs(J - J_old))) > ep_J), 
   J_old = J;

   In = randn(size(I))*std_n;
   I0 = I + In;
   J=I0;   
 end

 figure(4); 
 imshow(uint8(J)); 
 title('Denoised image with lambda')

 

[Εδιτ]Το code formatting του insomnia ειναι για τα μπαζα[/Εδιτ]

Δημοσ.

Δεν εχω matlab προχείρο να τσεκάρω, αλλά, έτσι όπως είναι σεταρισμενος ο κωδικάς σου, τι πιθανότητες έχει η συνθήκη του while να είναι false?

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

 

Βασικα, όπως το βλέπω, είναι πολυ ευκολο να μη κανεις αναδρομή. Με το παρακάτω χρησιμοποιείς μόνο 2 ενδιάμεσες εικόνες αντι για 500.....

 

>
function J=tv(I)
I=double(I);
ep_J = 0.01;
J_old=0;
std_n=20;
In = randn(size(I))*std_n;
I0 = I + In;
J=I0;

while (mean(mean(abs(J - J_old))) > ep_J),
J_old = J;

In = randn(size(I))*std_n;
I0 = I + In;
J=I0;
end

figure(4);
imshow(uint8(J));
title('Denoised image with lambda')

 

 

Το δοκίμασα έτσι όπως αναφέρεις αλλά το μόνο που μου έβγαλε ήταν ένα δείγμα θα μπορούσα να πω της αρχικής εικόνας(έχω προσθέσει κ δύο ακόμα εντολές ώστε να εμφανίζει την εικόνα εισόδου και την εικόνα με θόρυβο)-τίποτα άλλο.Σίγουρα δουλεύει;

 

Στην ουσία αυτό που σου λέει είναι οτι κάνεις πάνω από 500 αναδρομικές κλήσεις και το matlab έχει αυτό το όριο σαν default. Αν κάνεις πάνω από 500 σε κόβει. Μπορείς όμως λέει να το αλλάξεις (το όριο) χρησιμοποώντας την set(0,'RecursionLimit',N).

 

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

 

Δοκίμασα με την εντολή if('RecursionLimit'<300)...αλλά τίποτα.

 

Και στις δύο περιπτώσεις πάντως,κολλάει το matlab και αναγκάζομαι να το κλείνω.

 

Ξανάγραψα τον κώδικα έτσι:

 

>
function J=tv(I)

I=double(I);
ep_J = 0.01;
J_old=0;
std_n=20;

In = randn(size(I))*std_n;
I0 = I + In;
J=I0;

figure(1); imshow(uint8(I)); title('Original')

figure(2); imshow(uint8(I0)); title('Noisy image')

for iter=0:500
 if (mean(mean(abs(J - J_old))) > ep_J),
	 J_old = J;
	 In = randn(size(I))*std_n;
	 I0 = I + In;
	 J=I0;
 end	
end

figure(4);
imshow(uint8(J));
title('Denoised image with lambda')

 

αλλά τα αποτελέσματα που μου βγάζει(με είσοδο την εικόνα του φωτογράφου)είναι οι άλλες τρεις εικόνες που έχω επισυνάψει.Τι μπορεί να φταίει;

post-232710-0-41890900-1346333251_thumb.jpg

post-232710-0-32938600-1346333268_thumb.jpg

post-232710-0-44037700-1346333271_thumb.jpg

post-232710-0-96982100-1346333274_thumb.jpg

Δημοσ.

Σίγουρα δουλεύει;

Οχι, δεν εχω matlab να δοκιμασω.... Ο κωδικας ειναι ενδεικτικος

 

Τι μπορεί να φταίει;

Θα ηθελες να μας περιγραψεις λιγο τον αλγοριθμο που θες να υλοποιησεις;

 

Βασικα, τωρα προσεχω πως η εικονα που θα επρεπε λογινα να σου δειχνει την original version ειναι λαθος χωρις να της εχεις κανει "σχεδον" τιποτα..... βλεπω μονο το I=double(I) και μετα το imshow(uint8(I))

Προσπαθησε αρχικα να εμφανισεις την αρχικη απειραχτη πριν προσπαθησεις να εφαρμοσεις αλγοριθμους πανω της

Δημοσ.

 

Θα ηθελες να μας περιγραψεις λιγο τον αλγοριθμο που θες να υλοποιησεις;

 

 

Βασικά,αυτός ο κώδικας εφαρμόζει την μέθοδο της συνολικής διακύμανσης σε εικόνες με σκοπό την αφαίρεση θορύβου(total variation denoising).

 

 

Βασικα, τωρα προσεχω πως η εικονα που θα επρεπε λογινα να σου δειχνει την original version ειναι λαθος χωρις να της εχεις κανει "σχεδον" τιποτα..... βλεπω μονο το I=double(I) και μετα το imshow(uint8(I))

Προσπαθησε αρχικα να εμφανισεις την αρχικη απειραχτη πριν προσπαθησεις να εφαρμοσεις αλγοριθμους πανω της

 

 

Προσπάθησα αλλά μου τη βγάζει απο την αρχή λάθος,χωρίς να έχω εφαρμόσει ακόμα απολύτως τίποτα!!!

Δημοσ.

capoelo, για να στην βγάζει "από την αρχή λάθος", προφανέστατα δεν χρησιμοποιείς σωστά το διάβασμα εικόνας του MATLAB. Δώσε help imgread και ΔΙΑΒΑΣΕ τι κάνει. Δες τα παραδείγματα στο help του MATLAB.

 

Δεν μπορώ να πιστέψω ότι δεν μπορείς να σκεφτείς μόνος σου αυτά που σου έγραψα.

Δημοσ.

Οκ, οποτε περιορισαμε το αρχικο προβλημα στο "πως μπορω να δώσω μια εικόνα σε μια συνάρτηση στο matlab και αυτο να μου την εμφανίσει"

Αυτό γίνεται με τον παρακάτω κώδικα. Βεβαίωσου πως σου δουλευει πριν προχωρήσουμε.

>
function J = tv(I)
figure(1); imshow(I); title('Unmodified input image')

 

Για να δώσεις ώς όρισμα την είκόνα, μπορεις να το κάνεις απο το περιβάλλον του matlab, μενου, file > import data και διαλεγεις την εικονα απο τον σκληρό σου.

Δώσε και ενα όνομα στη μεταβλητή που θα κρατά την εικόνα, πχ inputPic

Μετά καλεσε τη μέθοδο γραφοντας tv(inputPic)

Δημοσ.

capoelo, για να στην βγάζει "από την αρχή λάθος", προφανέστατα δεν χρησιμοποιείς σωστά το διάβασμα εικόνας του MATLAB. Δώσε help imgread και ΔΙΑΒΑΣΕ τι κάνει. Δες τα παραδείγματα στο help του MATLAB.

 

Δεν μπορώ να πιστέψω ότι δεν μπορείς να σκεφτείς μόνος σου αυτά που σου έγραψα.

 

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

 

Οκ, οποτε περιορισαμε το αρχικο προβλημα στο "πως μπορω να δώσω μια εικόνα σε μια συνάρτηση στο matlab και αυτο να μου την εμφανίσει"

Αυτό γίνεται με τον παρακάτω κώδικα. Βεβαίωσου πως σου δουλευει πριν προχωρήσουμε.

>
function J = tv(I)
figure(1); imshow(I); title('Unmodified input image')

 

Για να δώσεις ώς όρισμα την είκόνα, μπορεις να το κάνεις απο το περιβάλλον του matlab, μενου, file > import data και διαλεγεις την εικονα απο τον σκληρό σου.

Δώσε και ενα όνομα στη μεταβλητή που θα κρατά την εικόνα, πχ inputPic

Μετά καλεσε τη μέθοδο γραφοντας tv(inputPic)

 

Οπότε,δεν βρίσκεται εκεί το πρόβλημα.Έβαλα και την εντολή που διαβάζει την εικόνα μέσα στον κώδικα και μου εμφάνιζε κανονικά και αυτή αλλά και την εικόνα με θόρυβο.Βέβαια αυτό δεν συμφέρει στη περίπτωση που θα θέλω να διαβάσω μια άλλη εικόνα.Οπότε,έβγαλα αυτές τις εντολές έξω απο τη συνάρτηση και άφησα μόνο την εντολή που εμφανίζει την πειραγμένη εικόνα.Το αποτέλεσμα ήταν ότι έβγαζε και πάλι ακριβώς τις ίδιες εικόνες,εκτός απο την τελευταία(μετά την εφαρμογή του αλγορίθμου)η οποία και λάμπει διά της απουσίας της.

Δημοσ.

Ρε μαν,

 

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

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

Δημοσ.

Παιζει το MATLAB χωρις κωδικο ? :-S

θυμαμαι ηταν εμπορικο προγραμμα. Ηθελε κωδικο

Εγω αντι της MATLAB ειχα παιξει με octave στο λινουξακι παντως .

 

Υπάρχει μεγαλη συμβατοτητα αναμεσα στις 2 γλώσσες παντως

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

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

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

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

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

Σύνδεση

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

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