Domanda

Ho un BufferedImage di tipo TYPE_INT_BGR. Ho bisogno di fare un confronto pixel per pixel ad un altro BufferedImage per calcolare la "distanza" tra le due immagini. Ho qualcosa che funziona, ma è lento. Ottengo un pixel dall'immagine "di riferimento", suddividerlo in RGB byte con:

    int pixel = referenceImage.getRGB(col, row);
    int red   = (pixel >> 16) & 0xff;
    int green = (pixel >> 8) & 0xff;
    int blue  = (pixel) & 0xff;

ho confrontare i valori r / g / b per pixel corrispondente dell'immagine candidato, e riassumere i quadrati delle differenze.

C'è un modo più veloce per fare questo tipo di confronto? Sbirciare nella fonte JRE, vedo che BufferedImage.getRGB () è in realtà Oring i valori RGB costituenti dal raster insieme, che è uno spreco per i miei scopi, dal momento che sto solo scomponendola in byte di nuovo.

ho intenzione di provare a fare che direttamente, ma mi chiedo se non ci sia un modo migliore di fare questo, sia tramite un Java o 3 ° API partito che avrei potuto perdere.

È stato utile?

Soluzione

lettura dei dati da un VolatileImage non sarà più veloce. Ciò che rende VolatileImages "più veloce" è che usano accelerato memoria (VRAM), invece di memoria di sistema (RAM) per disegnare le immagini. Tuttavia, quando si fa una lettura, si può avere bisogno di accedere alla memoria su un altro autobus ed è più lento di memoria di sistema per tali operazioni.

Il modo più veloce per confrontare BufferedImages sarebbe quella di utilizzare i confronti interi il modo in cui si discute nel tuo post, ma come si parla non è possibile utilizzare getRGB per motivi di prestazioni. È possibile ottenere una serie di pixel in una matrice, ma nel complesso si dovrebbe probabilmente solo sbirciare nella Raster e DataBuffer per le prestazioni.

Altri suggerimenti

Se entrambe le immagini utilizzano lo stesso modello di colore e di campionamento, è possibile eseguire il vostro confronto sul DataBuffer della trama, che sarà un po 'più veloce.

Hai pensato di usare Java2D per creare una nuova immagine è il differenza tra le due immagini che hai, e quindi analizzare l'immagine differenza, invece?

Il mio approccio iniziale sarebbe prendere il negativo dell'immagine A e aggiungere un'immagine B.

Se la rottura verso il basso per byte + loading lezioni extra è il problema, provate questo:

Come il valore BufferedImage formare un valore RGB di pixel

img = 65536*R + 256*G + B - 16777216;  

Come un valore RGB da un valore di IMG BufferedImage

R=  Math.round((((371*img)+24576000000) / 96000000)
G=  Math.round((65536 + 0.003906*img - 256*R));
B=  Math.round((65536*R + 256*G -img - 16777216));

Non sono sicuro se questo è un / modo migliore più veloce per farlo, ma è un altro metodo alternativo che non utilizza tutte le classi in più, ed è un processo rettilineo matematica (o un hack) ... Questo può diventare utile in alcune occasioni (si prega di doppio controllo dal momento che è il mio metodo che non ho avuto abbastanza tempo per giocare con).

Non so circa il tipo di confronto avevi bisogno tra i valori dei pixel, quindi questo è quanto lontano questo post va ... Spero che qualcuno in realtà trova questo utile!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top