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

Java Επεξεργασια εικονας


blaoulis

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

Δημοσ.

Καλησπέρα σας,

Υπάρχουν έτοιμες μεθοδοι-κλάσεις στην java για επεξεργασια εικονας???

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

Εχει ασχοληθει κανενας?? η ακομα καλύτερα υπάρχουν tutorials?? Εψαξα χωρις μεγαλη επιτυχια ..

Ευχαριστω!

Δημοσ.

Κάποιο συγκεκριμένο tutorial δεν έχω να σου προτείνω ωστόσο αν γίνεις πιο σαφής ως προς το τι χρειάζεσαι ίσως μπορώ να σε βοηθήσω.

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

Πες μου λοιπόν τι χρειάζεσαι να σου πω περισσότερα ή και να σου δώσω και δικό μου κώδικα.

Δημοσ.

Java 2D

Java 3D

Java Advanced Imaging

Java Image I/O

Java Media Framework

 

Δες τα παραπανω API. Documentation θα βρεις μπολικο στην Sun.

Δημοσ.
Κάποιο συγκεκριμένο tutorial δεν έχω να σου προτείνω ωστόσο αν γίνεις πιο σαφής ως προς το τι χρειάζεσαι ίσως μπορώ να σε βοηθήσω.

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

Πες μου λοιπόν τι χρειάζεσαι να σου πω περισσότερα ή και να σου δώσω και δικό μου κώδικα.

 

Θέλω να φορτώνω 2 εικόνες να υπολόγιζω το ιστόγραμμα τους ( με βάση τα χρώματα ) και να τα συγρκινώ ποσοστιαια. Μαρκοπροθέσμα θα ήθελα να υποβαλω τις εικονές και σε edge detector για να δω ποσο μοιαζουνε.

Δημοσ.

Για το edge detector δεν μπορώ να σε βοηθήσω ... μάλλον κάποιο φίλτρο Laplace θα χρειάζεσε

 

 

Αλλά για το ιστόγραμμα απλά γράψε αυτό:

 

>

for (i=0;i<eikona.length;i++){
  for (j=0;j<eikona[i].length;j++){
        hist(eikona[i][j])++;
}
}

Δημοσ.

Όταν λες "φορτώνω" φαντάζομαι από κάποια βάση.

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

-----------------------------------------------------------------------------------

// Create one histogram with 256 bins.

ParameterBlock p = new ParameterBlock();

p.addSource(image);

p.add(null); // The ROI

p.add(1); pb1.add(1); // Sampling

p.add(new int[]{256}); // Bins

p.add(new double[]{0}); pb1.add(new double[]{256}); // Range for inclusion

PlanarImage dummyImage = JAI.create("histogram", p)

// Gets the histogram.

javax.media.jai.Histogram histo = (javax.media.jai.Histogram)dummyImage.getProperty("histogram");

---------------------------------------------------------------------------------------------

τέλος, η σύγκριση εικόνων ως προς το χρώμα είναι ένα μεγάλο θέμα..

κάνε πρώτα τα ιστογράμμα και μετά για τη σύγκριση εδώ είμαστε..

 

@Nisok

κοιτούσα τον κώδικα σου και δεν κατάλαβα τι ακριβώς παίρνεις..

το ιστόγραμμα είναι συνιστώσα τριών παραμέτρων (R, G και Β), τα δύο που χρησιμοποιείς τι είναι;

 

στην πραγματικότητα αυτές οι τρείς συνιστώσες είναι που κάνουν το θέμα της σύγκρισης εξαιρετικά συζητήσιμο :-)

Δημοσ.

το υλοποιησα αλλα θελω καποιες διευκρινησεις.

 

>public class test
 {
 public static void main(String[] args)
   {
   PlanarImage image = JAI.create("fileload", args[0]);
   ParameterBlock pb1 = new ParameterBlock();
   pb1.addSource(image);
   pb1.add(null); // The ROI
   pb1.add(1); pb1.add(1); // Sampling
   pb1.add(new int[]{256}); // Bins
   pb1.add(new double[]{0});  pb1.add(new double[]{256}); // Range for inclusion
   PlanarImage dummyImage1 = JAI.create("histogram", pb1);
   // Gets the histogram.
   javax.media.jai.Histogram histo1 = (javax.media.jai.Histogram)dummyImage1.getProperty("histogram");
   
   // get histogram contents
int[] local_array = new int[histo1.getNumBins(0)];
for ( int i = 0; i < histo1.getNumBins(0); i++ ) {
//local_array[i] = histo1.getBinSize(0, i);
//System.out.println(":: "+i+" :: No Of Bins:- "+local_array[i]) ;
       System.out.println(histo1.getBinSize(0, i) + " " + histo1.getBinSize(1, i) + " "+histo1.getBinSize(2, i) + " " );

     }
   }
 }

 

Μου τυπώνει 3 στήλες απο το 0 εως το 255. Αντιλαμβανομαι οτι ο Ιστογραμμα ειναι ενα στατιστικό μεσο που δείχνει τον καταμερισμό των τιμών , αλλά τώρα ετσι όπως τα τυπώνει την έχασα λίγο την μπάλα.

0 : x y z

....

....

255: x y z

 

Μας δείχνει πόσες φόρες το χ ήταν 0 , πόσες το y και πόσες το z??

Τέλος έχει νόημα να συγκρίνεις 2 εικόνες με βάση το ιστόγραμμα??

 

Ευχαριστώ.

Δημοσ.

Είναι κώδικας που βρίσκεται κάτω απο τις εντολές που χρησιμοποιείς. Σκανάρω την εικόνα. Και την τιμή του pixel (εγώ συνήθως δουλεύω σε 8bit ) την κάνω index ενώς πίνακα hist.

Δημοσ.

Λοιπόν, σου βγάζει για κάθε Pixel τι τιμές έχει το R, το G και το Β.

Γι'αυτό σου φαίνονται τόσα πολλά (μπορείς πάντα να μειώσεις τον αριθμό των bin).

 

Φυσικά έχει νόημα να συγκρίνεις εικόνες με βάση το ιστόγραμμα γιατί έτσι θα βρείς πχ κατά πόσο κοντά είναι χρωματικά 2 εικόνες (αυτό φυσικά γενικεύεται και σε περισσότερες..)

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

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

 

Τώρα για την σύγκριση με τα ιστογράμματα, εξαρτάται από τη μέθοδο που θες να χρησιμοποιήσεις..

Υπάρχουν μέθοδοι που χρειάζονται και τις τρεις τιμές (R.G.B) και αλλές που χειρίζονται μόνο μια ενιαία. Στην δεύτερη περίπτωση πρέπει να βρεις μια αντιπροσωπευτική τιμή για κάθε pixel (απέφευγε το μέσο όρο). Φυσικά το να αποθηκεύεις τις τιμές των ιστογραμμάτων σε πίνακες είναι βολικό, έτσι θα κάνεις εύκολα και τις συγκρίσεις.

Δημοσ.

Αναφορικά με τις συγκρισεις και τα σχετικά μια χαρα..

αλλα δεν ειμαι απολυτα σιγουρος για το πρωτο σκελος.

Εννοω οτι τα pixel της εικόνας δεν ειναι 256 μονό συνεπώς δεν νομιζώ να μου έχει τις τιμες του RGB και δευτερον ποιες ειναι τα όρια τιμών για RGB ??

Γιατί αυτα που μου βγάζει δεν μου φαίνονται πολυ λογικά , παραθέτω ενα δειγμα

 

0 0 126

0 0 60

1 0 83

4 3 117

3 10 142

6 11 178

21 23 249

22 37 305

31 81 404

49 143 577

84 228 806

120 400 974

192 691 1236

203 947 1507

244 1372 1917

309 2045 2535

361 2766 2809

395 3588 3221

392 4448 3726

468 5236 4156

516 5612 4460

499 5792 4672

539 5970 5239

....

....

 

Βασικά εχω μπερδευτεί και στον κωδικα που παραθετω. Για την ακριβεια με το τι τα bins αντιπροσωπευουν

 

> 
   pb1.addSource(image); // Edw fortwnei tin eikona , wraia.
   pb1.add(null); // The ROI // Edw pera leei oti tha xrisimopoihsei oli tin eikona
   pb1.add(1); pb1.add(1); // Sampling // auto simvolizun kai ayta, oti dld tha                                         
                                                           // xrisimopoieithei oli h eikona

// Twra edw ti ginete?
// giati me ta bins exw xasei tin bala.

   pb1.add(new int[]{256}); // Bins
   pb1.add(new double[]{0});  pb1.add(new double[]{256}); // Range for inclusion

 

 

 

 

Τέλος για την getBinSize(χ, i) ,

i --> είναι το bin που με ενδοιαφερεί.

το χ τωρα

ειναι 0 -> κοκκινο

1 -> πρασινο

2 -> μπλε

3 -> ολα

k -> γκρι ???

 

 

Συγνώμη για το μακρυσκελες μήνυμα αλλά πιστεύω πως μια απαντηση θα ξεκαθαρίσει παρα πολλά πραγματα :-)

Δημοσ.

πχ. για 16 bin -> τα χρώματα που έχεις είναι 16x16x16=4096, ανάλογα παεί για 256.

τα Bin δεν είναι pixel.

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

 

καλή δουλειά!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

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