2010-06-22 9 views
0

J'écris un programme qui va faire du traitement d'image sur une image tiff 16 bits (5 bits rouge, 6 bits vert, 5 bits bleus) mais malheureusement le code que j'ai écrit pour traiter traite les données image comme 8 bits .Comment récupérer des données de pixels 16 bits à partir d'un tiff en Java?

Pour élaborer avec le code, je lis l'image en mémoire avec classe utilitaire ImageIO comme ceci:

BufferedImage image = ImageIO.read(imageFile);

et plus tard sur l'utilisation de cette boucle pour récupérer des informations de pixels:

Matrix imageMatrix = new Matrix(image.getHeight(), image.getWidth()); 
Raster raster = image.getData(); 
double[] pixelColor = new double[4]; 
for (int x = 0; x < image.getWidth(); x = x + 1) { 
    for (int y = 0; y < image.getHeight(); y = y + 1) { 
     raster.getPixel(x, y, pixelColor); 
     double pixelColorAverage = (pixelColor[0] + pixelColor[1] + pixelColor[2])/3.0; 
     imageMatrix.set(y, x, pixelColorAverage); 
    } 
} 
return imageMatrix; 

Le le problème est que raster.getPixel(x, y, pixelColor); renvoie chaque valeur RVB en 8 bits (dans mon image de test, la valeur de 0,0 pixel est renvoyée comme 24,24,24 [valeurs de 8 bits] quand il devrait être 6168,6168,6168 [16 bits]).

J'ai essayé de changer le ImageIO.read(imageFile) simpliste aux lignes suivantes de code basé sur un autre stack overflow tiff question:

BufferedImage image = ImageIO.read(file); 
BufferedImage convertedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_USHORT_565_RGB); 
convertedImage.createGraphics().drawRenderedImage(image, null); 

Mais cette fois, les rendements raster.getPixel(x, y, pixelColor); 3,6,3 qui n'est pas correct non plus. Basé sur le fait qu'ImageIO prend en charge les images tiff et que l'image tamponnée a un format d'image 16 bits de style 5-6-5, je ne peux que supposer que c'est possible, mais je suis perplexe quant à ce que je suis. disparu.

+0

comment avez-vous un 'BufferedImage' d'un TIFF un ??? – Gevorg

Répondre

2

Le problème est que raster.getPixel (x, y, pixelColor); renvoie chaque valeur RVB en 8 bits (dans mon image test, la valeur 0,0 pixel est renvoyée en 24,24,24 [valeurs 8 bits] alors qu'elle devrait être 6168,6168,6168 [valeurs 16 bits]).

Cette déclaration est incorrecte.

16 bits par pixel ne pas signifie 16 bits par valeur rouge ou vert ou bleu. Cela signifie que 16 bits représentent les valeurs R et G et B combinées.

Ainsi, une valeur courte de 16 bits peut être décomposée pour représenter un pixel.

5 bits représentent la valeur rouge. 6 bits représentent la valeur verte. 5 bits représentent la valeur bleue.

Red Green Blue 
----- ------ ----- 
10111 101010 11100 

Combiné vous 1011110101011100 binaire ou 48476 décimal. N'ayant jamais codé en Java, je suppose que vous auriez besoin d'utiliser un appel de fonction différent pour obtenir la valeur que vous recherchez. Essayez peut-être [getDataElements] [1] pour obtenir la valeur de 16 bits pour le pixel en question.

Rappelons que chaque pixel est de 16 bits. Vous confondez que, avec 24 bits (chaque pixel est de 8 bits) ou 32 bits (chaque pixel est de 8 bits plus une valeur alpha 8 bits.)

This article from MSDN should help you retreive the RGB values from the 16 bit value.

(Vous devrez également corriger votre code de calcul de la moyenne .)

[1]: http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/Raster.html#getDataElements(int, int, java.lang.Object)

+0

Vous avez raison. Je confondais définitivement les 5-6-5 bits par canal comme 16 bits par canal au lieu de seulement 16 bits au total, et donc la valeur 3,6,3 RVB est correcte pour ce modèle de couleur. Merci d'avoir souligné la faille dans mes conclusions et de m'aider à corriger mon code. – Peter