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

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

Δημοσ.

>
function J=tv(I,lam)

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')

[nx, ny] = size(I);
J = zeros(nx,ny);

for i = 1:nx
 for j = 1:ny
 Vy=abs((I0-In(i+1,j))-(I0-In(i,j)))+abs((I0-In(i,j+1))-(I0-In(i,j)));
 Exy=(1/2)*((sum(I0-I).^2));
 J(i,j) = min (Exy+(lam*Vy));
 end		
end
figure(4);
imshow(uint8(J));
title('Denoised image with lambda')

 

Το πρόβλημα παραμένει-το Exy είναι διαστάσεων 1x512.Κοίταξα το μέγεθος του I0-I και είδα ότι είναι 512x512.Koιτάζοντας το help του matlab για τη sum,είδα το εξής:If A is a matrix, sum(A) treats the columns of A as vectors, returning a row vector of the sums of each column.

Δοκίμασα να το κάνω 512x512 με την εντολή reshape αλλά δεν δούλεψε γιατί δεν υπάρχουν λέει αρκετά στοιχεία για να μπορέσει να το κάνει.Εγώ λοιπόν ρωτάω:μπορώ με κάποιο τρόπο να προσθέσω μηδενικά στον πίνακα έτσι ώστε να μπορέσω να τον μετατρέψω και πάλι σε 512x512;

 

Υ.Γ.Τα μηδενικά δεν θα επηρεάσουν το αποτέλεσμα,σωστά;

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

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

Δημοσ.

Δοκιμασε με απλα ελληνικα, τι ακριβως θες να περιεχει αυτος ο 512χ512 πινακας; Οταν δινεις ενα πινακα Α στη συναρτηση sum τι θα περιμενες να βγει;

Δημοσ.

Ο πίνακας πρέπει να περιέχει σε κάθε μία απο τις 512 γραμμές του,τα αθροίσματα των στοιχείων των στηλών του(εξαιρώντας κάθε φορά το στοιχείο που έχει υπολογίσει στην προηγούμενη επανάληψη-για παράδειγμα,στην δεύτερη επανάληψη θα υπολογίσει το άθροισμα απο το Εxy(2,1)και μετά,στην τρίτη απο το Εxy(3,1)και μετά κλπ.).Αφού του λέω για i=1:nx και για j=1:ny θα έπρεπε κανονικά να υπολογίζει το sum για κάθε μία απο τις 512 γραμμές και να μου επιστρέφει έναν πίνακα διαστάσεων 512x512,σωστά;Γιατί όμως δεν το κάνει;

 

Υ.Γ.1-Ελπίζω να το διατύπωσα αρκετά κατανοητά.

Υ.Γ.2-Όλα αυτά,αν υποθέσω ότι έχω καταλάβει πλήρως τη μέθοδο.

Δημοσ.

Μετατροπη πινακα Α 1ΧΝ σε ΝΧΝ όπου η π1η γραμμη είναι ο αρχικος Α και τα υπολοιπα μηδενικά:

 

>
Α = [ Α ; zeros( N-1, N) ]

 

δηλ στη περίπτωση σου

>
E = [ E, zeros(511, 512) ]

 

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

Δημοσ.

>
function J=tv(I,lam)
  
 figure(1); imshow(uint8(I)); title('Original')

 I=double(I);

 std_n=50;	 %τυπική απόκλιση γκαουσιανού θορύβου

 In = randn(size(I))*std_n; %προστιθέμενος θόρυβος
 I0 = I + In;  %εικόνα με θόρυβο 
 numel(In)
 figure(2); imshow(uint8(I0)); title('Noisy image')

 [nx, ny] = size(I);
 J = zeros(nx,ny);
  
 for i = 1:511
 for j = 1:511
    Vy=sum(abs(I0-In(i+1,j)-I0-In(i,j))+abs((I0-In(i,j+1)-I0-In(i,j))));
    Exy=(1/2)*(sum((I0-I).^2));
    J(i,j) = min (Exy+(lam*Vy));
 end		 
 end

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

 

Η τελευταία "έκδοση" του κώδικα μέχρι στιγμής.Διόρθωσα το πρόβλημα με τις διαστάσεις,ο κώδικας τρέχει αλλά βγάζει αποτέλεσμα μετά απο μισή με μία ώρα και το αποτέλεσμα που βγάζει ως "denoised image with lamda" είναι μία άσπρη εικόνα.Ή επεξεργάζεται υπερβολικά την αρχική εικόνα(κάτι που δεν νομίζω να ισχύει)ή δεν την επεξεργάζεται καθόλου.Αν όμως δεν την επεξεργάζεται καθόλου,τι κάνει ένα μισάωρο;

Δημοσ.

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

Δημοσ.

Capoelo

 

Χωρίς ίχνος δόσης ό,τι_θες_βάλε_που_να_σε_πειράζει...... νομίζω πως δεν πρόκειται να βρεις απάντηση σε κανένα forum εάν κάνεις τέτοιες ερωτήσεις.

 

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

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

 

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

 

Εάν κολλήσεις σε κάτι από τα δύο τελευταία, θα μπορούσες να ρωτήσεις ως εξής:

 

-Προσπαθώ να πετύχω αυτό αλλά κάνοντας αυτό και αυτό παίρνω αυτό το αποτέλεσμα ενώ θα έπρεπε να έχω αυτό. Γιατί δεν λειτουργεί αυτό το σημείο;

 

Στο λέω γιατί κανείς δεν γεννήθηκε να ξέρει. Ούτε καν ο Γκάλης. Όμως το να ξέρεις να ζητάς βοήθεια θα σε βοηθήσει να την βρίσκεις πιο γρήγορα.

 

Ελπίζω να καταλάβεις το πώς στα λέω... έστω και εάν δεν φαίνεται από τον γραπτό λόγο.

Δημοσ.

Προτεινω να αφιερωσεις λιγο χρόνο στο να μαθεις πως δουλευει το matlab, πως δουλευουν οι πινακες και πως μπορεις να δουλεψεις με μέρη αυτών

 

Όταν κανεις κατι σαν και αυτο

>
for i = 1:N
    for j = 1:M
	    ...
	    J ( i , j ) = something
    end			
 end

σημαίνει πως αλλάζεις τα στοιχεία του πινακα J ένα-ένα, και πιο συγκεκριμένα αλλάζεις πρώτα όλη την 1η στήλη, μετά τη 2η κτλ

 

Όταν από ένα πίνακα αφαιρείς ενα αριθμό, αυτος ο αριθμός αφαιρέιται απο όλα τα στοιχεία του πίνακα. Αυτό κάνεις έσύ στο

>
Vy=sum(abs(I0-In(i+1,j)-I0-In(i,j))+abs((I0-In(i,j+1)-I0-In(i,j))));

δηλ από τον Ι0 (ολοκληρος πινακας) αφαιρείς το In(i+1,j) (ενα στοιχείο, ή αν προτιμάς ενας 1χ1 πινακας). Για το matlab δεν είναι λαθος, το θέμα είναι να καταλαβεις εσυ αν αυτος ο υπολογισμος ειναι σωστός για σένα.

Εδώ κάνεις ενα συνολο υπολογισμών που θα καταλήξουν παλι σε πινακα ΝΧΜ και μετα η sum θα παράξει ενα πινακα 1ΧΜ

 

μετά έχεις το

>
Exy=(1/2)*(sum((I0-I).^2));

το οποίο είναι Ι0 - Ι = ΝΧΜ --> sum(I0-I) = 1XM --> ........Exy = 1xM

 

τελος έχεις

>
J(i,j) = min (Exy+(lam*Vy));

όπου στο min περνας ουσιαστικα ενα πίνακα 1ΧΜ.

 

Όλα αυτα για ΚΑΘΕ στοιχειο του J

 

Γιαυτο σου λεω, καλυτερα να προσδιορισεις με ακριβεια τον αλγοριθμο σου στο χαρτι πριν δοκιμαζεις στη τυχη να σου βγει κατι στο matlab, δεν ειναι παιχνιδι....

Δημοσ.

Η υλοποίηση του αλγόριθμου είναι λανθασμένη:

1. Στον υπολογισμό του vy κάνε πράξεις με το χέρι και θα καταλάβεις.

 

2. Δώσε βάση δω. Δεν έχεις κάποια συνθήκη για να ελέγχεις πότε πρέπει να σταματήσει ο αλγόριθμος.

 

Και βασικά μελέτα τον αλγόριθμο, δε φαίνεται να ξέρεις τη θεωρία.

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

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

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

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

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

Σύνδεση

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

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

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