Grauwerte aus 3-Dimensionalem Array in Bild

P4rkh4us

Mitglied
Hallo,

ich komme nicht weiter. Ich will aus Grauwerten, die ich in einem 3-Dimensionalen Array habe ein Bild in ein JFrame zeichnen lassen. Ich habe leider keine Ahnung wie ich das anstellen soll. Ich hoffe ihr habt ein paar Tipps für mich.


Danke.
 
Okay ich geb mir Mühe 🙂

Also ich habe eine bin Datei mit short Werten. Diese habe ich ausgelesen und in ein 3dimensionales Array gespeichert, also x-dimension, y-dimension und z-dimension. Diese Werte stellen die Grauwerte von mehreren Schichtbildern dar. Und jetzt würde ich gerne die Bilder berechnen bzw darstellen.
Ich weiß nicht wie ich da ansetzen soll. Ich vermute mal mit einem BufferedImage. Aber weiter weiß ich leider nicht 🙂

Ich hoffe das war verständlicher.
 
Im einfachsten Fall sowas wie
Java:
int array[][][] = new short[d][w][h];
fill(array);
for (int i=0; i<d; i++)
{
    BufferedImage image = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
    for (int x=0; x<w; x++)
    {
        for (int y=0; y<h; y++)
        {
            int v = array[i][x][y];
            int rgb = convert(v);
            image.setRGB(x,y, rgb);
        }
    }
}
Ggf. gibts noch was geschickteres, je nach Daten und so...
 
Hey, danke schonmal. Aber ich bekomm es leider immernoch nicht hin 🙂

Also was ist denn mit
[JAVA=42]fill(array);[/code]
und mit
[JAVA=42]int rgb = convert(v);[/code]
gemeint ?

Und zudem habe ich ja Grauwerte, heißt das ich muss den Typ auf TYPE_USHORT_GRAY ändern ?
 
Also bisher habe ich das hier:

[Java=42]
public void paint(Graphics g) {

ctr = conv.read("Test2");

short[][][] greyValues = ctr.getGreyValues();


for (int z = 0; z < ctr.getzDimension(); z++) {

BufferedImage image = new BufferedImage(ctr.getxDimension(), ctr.getyDimension(),
BufferedImage.TYPE_INT_ARGB);

for (int y = 0; y < ctr.getyDimension(); y++) {
for (int x = 0; x < ctr.getxDimension(); x++) {

int v = greyValues[z][x][y];
image.setRGB(x, y, v);

}
}
g.drawImage(image, ctr.getxDimension(), ctr.getyDimension(), this);
}
} [/Java]

Aber leider wird mir nur ein Graues Bild gezeichnet. Die Werte werden richtig eingelesen.

Mfg
 
Was soll denn dabei rauskommen? Ein 3D Array kannst du dir wie einen Würfel vorstellen, der aus x mal y mal z kleinen Würfeln besteht. Jeder dieser kleinen Würfel hat jetzt einen Grauwert oder wie? Wie willst du dieses gebilde jetzt in ein Bild umwandeln? Nochmal, was soll dabei rauskommen wenn du ein Array hast wie:
Java:
{
 {
  {1,2,3},{1,2,3}
 },
 {
  {4,5,6},{4,5,6}
 },
 {
  {7,8,9},{7,8,9}
 }
}
 
Es handelt sich um Schichtbilder, also genauer bilder eines computertomographen. Es sind z Bilder mit je x*y Pixeln.
Und jedes Pixel hat seinen eigenen Grauwert.

Mfg
 
EDIT > Hui, das seh' ich ja jetzt erst: Diese Umwandlung sollte NICHT bei jedem Neuzeichnen gemacht werden! Am besten einmal im Konstruktor oder mit einem dedizierten Methodenaufruf <EDIT

Das "fill" war Pseudocode - irgendwo müssen die Daten ja in den Array kommen. Wenn du ihn schon gefüllt bekommst, ist alles OK.

Für den Bildtyp könnte man tatsächlich TYPE_USHORT_GRAY verwenden, aber da müßte man AFAIK die Pixelwerte anders setzen, und anzeigen kann man 16bit-Graustufenbilder ohne spezielle Monitore ohnehin nicht.

Bei dem geposteten Code sollte schonmal kein rein Graues Bild rauskommen. Das "convert" sollte für irgendeine Methode stehen, die den short-Wert in einen RGB-Wert für den Pixel umwandelt, und könnte für einen ersten Test z.B. so aussehen:
Java:
    private static int convert(short s)
    {
        float f = (float)s/Short.MAX_VALUE;
        int b = (int)(b*255);
        return getARGB(b,b,b,b);
    }
    private static int getARGB(int a, int r, int g, int b)
    {
        return (a << 24) | (r << 16) | (g << 8)  | (b << 0);
    }


Da war kürzlich ein längerer Thread wo auch jemand 16bit-Graustufenbilder verarbeitet hat: http://www.java-forum.org/awt-swing-swt/133570-g2-drawimage-langsam-4.html#post881030 Nur zur Info, hat mit dem hier sonst eigentlich nichts zu tun.
 

Neue Themen


Zurück
Oben