Menggunakan Presisi Tinggi (dari integer 8-bit tanpa tanda tangan) Gambar Buffer untuk Ketinggian di Jawa

8

Saya membuat peta ketinggian untuk setiap quad di quadtree saya di openCL. Cara saya membuat gambar adalah sebagai berikut:

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);

Ini berfungsi dengan baik tetapi masalah utamanya adalah ketika paha depan semakin kecil dan lebih kecil, format 8-bit dari gambar buffered mulai menyebabkan masalah "melangkah" yang tak tertahankan seperti yang terlihat di bawah ini:

masukkan deskripsi gambar di sini

Saya bertanya-tanya apakah ada cara alternatif saya bisa melakukan ini?

Terima kasih untuk waktunya.

pl12
sumber
Apakah ini "loncatan" yang sedang Anda bicarakan? i.imgur.com/Sx9egmm.png?1
MichaelHouse
Ya, benar.
pl12
Bisakah Anda mengubah judul menjadi sesuatu yang lebih terkait dengan pertanyaan Anda? Saya mencoba untuk membuat sesuatu tetapi tidak ingin salah menafsirkan pertanyaan Anda.
MichaelHouse
Oh ya pasti
pl12
Mengapa Anda harus menggunakan BufferedImage? Apa format gambar input Anda?
msell

Jawaban:

1

Apakah Anda menggunakan pemfilteran tekstur saat membaca peta ketinggian? Saya berharap bahwa filter bilinear akan memuluskan sedikit.

Jika Anda masih membutuhkan ketelitian yang lebih baik maka ubah format gambar menjadi sesuatu seperti CL_UNORM_INT16 atau CL_FLOAT - lihat http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/cl_image_format.html

Saya tidak begitu yakin bagaimana Anda melakukannya dari Jawa.

Adam
sumber
Ya itu masalahnya: Saya tidak tahu bagaimana cara menggunakan selain integer 8-bit dengan BufferedImage.
pl12
Karena Java tidak memiliki dukungan OpenCL asli, mungkin membantu untuk mengetahui perpustakaan mana yang Anda gunakan. Pilihan lain adalah menggunakan gambar lebar ganda, dan mendekode di GPU seperti katakanlah (pixel [x] /256.0 + pixel [x + 1]).
Adam
Saya mencoba menggunakan interpolasi bilinear tanpa hasil ... Saya hanya menggunakan Java OpenCL (JOCL)
pl12
OpenCL versi Java juga mendukung format ini. cl_image_formatmemiliki image_channel_data_typeanggota yang dapat digunakan untuk menentukan format data (mis. CL_FLOATdll . )
bummzack
2
docs.oracle.com/javase/7/docs/api/java/awt/image/… mengatakan BufferedImage mendukung TYPE_USHORT_GREY yang 16-bit.
Adam