Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Pixel detection

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    7

    Pixel detection

    Ciao a tutti!
    Vi pongo una questione interessante:
    Avendo un immagine in bianco e nero, con dei bordi bianchi, si vogliono tagliare i bordi bianchi e far sì che l'immagine rimanga senza i bordi bianchi.

    L'immagine in questione è di forma quadrata e l'angolo superiore ed inferiore sinistro dell'immagine iniziano sempre con pixels neri.

    Questo ci consentirebbe di dedurre la grandezza di un angolo per tagliare il superfluo bordo bianco, ma il problema rimane sempre l'individuazione dell'angolo in alto a sinistra e di quello in basso a sinistra:
    se riuscissi ad individuare il primo pixels in alto a sinistra e l'ultimo in basso a sinistra, otterrei la distanza tra questi (l'angolo di un quadrato) e riuscirei poi a tagliare tutti i bordi circostanti sapendo da quali coordinate di origine partire per il taglio facendo un cropping.

    Voi che ne pensate? come posso riuscire ad individuare il primo pixel nero di un immagine?
    Spero ci sia qualcuno in gamba in grado di darmi una risposta!

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Puoi caricare l'immage in una BufferedImage (per esempio tramite imageIO.read(...)) e quindi controllare con getRGB il colore dei pixel di tuo interesse... ossia (0,0), (1,1)... per l'angolo superiore sinistro e (getWidth()-1, getHeight()-1), (getWidth()-2, getHeight()-2)... per l'angolo inferiore dx... sempre che tali angoli siano "quadrati". Se non fosse così, allora potresti cominciare con l'angolo in alto a sx (0,0), verificare se è nero: se sì, ti muovi verso destra di un pixel (1,0), altrimenti verso il basso (0,1) fin tanto che trovi pixel neri. Quando non trovi più pixel neri, hai individuato la dimensione del bordo superiore e sinistro. Ripeti a partire da quello inferiore destro, andando a ritroso: verso sinistra o verso l'alto.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    7
    Ottima idea, dò un occhiata ai metodi che mi hai segnalato e poi ti faqrò sapere!

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    7
    E se l'immagine non è proprio in bianco e nero ma la volgio riportare in bianco e nero prima di scansionare i pixel?
    Come elimino la gradazione di grigio?

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ho volutamente omesso la parte dell'output a file, comunque, per tenere le cose semplici:

    codice:
    BufferedImage image = new BufferedImage(current.getWidth(), current.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
    Graphics2D g = image.createGraphics();
    g.drawRenderedImage(current, null);
    g.dispose();
    return image;
    brano di un ipotetico codice che, avendo a disposizione un BufferedImage (current) creato a partire dall'immagine originale, ritorna un BufferedImage rappresentazione di current in b&w

    In due righe, per contestualizzare un po' quel pezzo di codice:

    codice:
    import java.io.*;
    import java.awt.*;
    import java.awt.image.*;
    import javax.imageio.*;
    import javax.swing.*;
    
    /**
     *
     * @author Andrea
     */
    public class ImageFilters {
        
        private BufferedImage current;
        
        public BufferedImage toBlackAndWhite(String fileName) {
            if (current == null) {
                throw new RuntimeException("Couldn't create src BufferedImage");            
            }
            
            if (fileName == null) {
                //No output to File;           
                
                BufferedImage image = new BufferedImage(current.getWidth(), current.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
                Graphics2D g = image.createGraphics();
                g.drawRenderedImage(current, null);
                g.dispose();
                return image;
            }
            //da implementare l'eventuale output a file
            return null;
        }
        
        
        
        public ImageFilters(String fileName) {
            try {
                current = ImageIO.read(new File(fileName));
            }
            catch (Exception e) {
                e.printStackTrace();
                current = null;
            }
            
        }
        
    //main per test
        public static void main (String[] args) {
            JFrame frame = new JFrame("Test");
            ImageFilters imgF = new ImageFilters("C:/Documents and Settings/Andrea/Desktop/nemo.jpg");
            JLabel lab = new JLabel(new ImageIcon(imgF.toBlackAndWhite(null)));
            frame.getContentPane().add(lab);
            frame.setSize(lab.getIcon().getIconWidth(),lab.getIcon().getIconHeight());
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.