Utilisation d'une image tamponnée de précision supérieure (supérieure à un entier non signé 8 bits) pour les cartes de hauteur en Java

8

Je génère une carte de hauteur pour chaque quad de mon quadtree en openCL. La façon dont je créais l'image est la suivante:

DataBufferInt dataBuffer =
            (DataBufferInt)img.getRaster().getDataBuffer();
      int data[] = dataBuffer.getData();
      //img is a bufferedimage 
        inputImageMem = CL.clCreateImage2D(
        context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR,
        new cl_image_format[]{imageFormat}, size, size,
        size * Sizeof.cl_uint, Pointer.to(data), null);

Cela fonctionne bien, mais le problème majeur est que, comme les quadriceps deviennent de plus en plus petits, le format 8 bits de l'image tamponnée commence à provoquer des problèmes de "pas à pas" intolérables comme indiqué ci-dessous:

entrez la description de l'image ici

Je me demandais s'il y avait une autre façon de procéder?

Merci pour le temps.

pl12
la source
Est-ce le "pas" dont vous parlez? i.imgur.com/Sx9egmm.png?1
MichaelHouse
Oui, c'est ça.
pl12
Pouvez-vous changer le titre en quelque chose de plus lié à votre question? J'essayais de trouver quelque chose mais je ne voulais pas mal interpréter votre question.
MichaelHouse
Oh oui définitivement
pl12
Pourquoi devez-vous utiliser une BufferedImage? Quel format sont vos images d'entrée?
msell

Réponses:

1

Utilisez-vous le filtrage de texture lors de la lecture de la carte de hauteur? Je m'attendrais à ce qu'un filtre bilinéaire lisse un peu les choses.

Si vous avez encore besoin d'une meilleure précision, changez le format d'image en quelque chose comme CL_UNORM_INT16 ou CL_FLOAT - voir http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/cl_image_format.html

Je ne sais pas trop comment vous faites cela depuis Java.

Adam
la source
Oui, c'est le problème: je ne peux pas comprendre comment utiliser autre chose qu'un entier 8 bits avec une BufferedImage.
pl12
Étant donné que Java ne prend pas en charge OpenCL natif, il peut être utile de savoir quelle bibliothèque vous utilisez. L'autre option serait d'utiliser une image double largeur, et de la décoder sur le GPU comme par exemple (pixel [x] /256.0 + pixel [x + 1]).
Adam
J'ai essayé d'utiliser l'interpolation bilinéaire sans succès ... J'utilise juste Java OpenCL (JOCL)
pl12
La version Java d'OpenCL semble également prendre en charge ces formats. cl_image_formata un image_channel_data_typemembre qui peut être utilisé pour spécifier le format de données (par exemple, CL_FLOATetc.)
bummzack
2
docs.oracle.com/javase/7/docs/api/java/awt/image/… dit que BufferedImage prend en charge TYPE_USHORT_GREY qui est de 16 bits.
Adam