Lookup table

8 respostas
L

Olá Pessoal!
Estou tentando pegar uma imagem em nível de cinza e aplicar a lookup table nela. Já fiz a parte que pega os três canais de cores (RGB). A saída eu também já fiz, só está faltando mesmo aplicar a lookuptable, sei que tem na JAI, mas não deu certo alguém sabe como fazer isso.
Obrigada.
Lhu.

8 Respostas

R

“Lhu”:
Olá Pessoal!
Estou tentando pegar uma imagem em nível de cinza e aplicar a lookup table nela. Já fiz a parte que pega os três canais de cores (RGB). A saída eu também já fiz, só está faltando mesmo aplicar a lookuptable, sei que tem na JAI, mas não deu certo alguém sabe como fazer isso.
Obrigada.
Lhu.

Você não disse o que não deu certo… mas veja www.lac.inpe.br/~rafael.santos/Java/JAI, tem alguns exemplos que podem ajudar.

Rafael

L

O que não deu certo foi na hora de aplicar a tabela de cores pois o programa está gerando a mesma imagem de entrada nem entra na função lookque está abaixo.

public static PlanarImage lookup (PlanarImage ima)
    {

       byte[] tableData = new byte[0x10000];
       for(int i=0; i<(0x10000);i++)
       {
           tableData[i]=(byte)(i >> 8);
         //  tableData[1][i]=(byte)(i >> 8);
         //  tableData[2][i]=(byte)(i >> 8);
       }

       LookupTableJAI lut = new LookupTableJAI(tableData);
       RenderedOp image2= null;
       image2 = JAI.create ("lookup",ima, lut);
        return image2;

[size=“11”]
[color=“red”]

  • Editado: Lembre-se de usar BBCode em seus códigos para mantê-los identados e mais legíveis para outros usuários - Matheus[/color][/size] :joia:
R

“Lhu”:
O que não deu certo foi na hora de aplicar a tabela de cores pois o programa está gerando a mesma imagem de entrada nem entra na função lookque está abaixo.

Ele não entra no seu método estático lookup ou ele executa o método JAI.create e dá o mesmo resultado?

<blockquote><div class="quote-author">“Lhu”:</div>

public static PlanarImage lookup (PlanarImage ima)

{
byte[] tableData = new byte[0x10000];
   for(int i=0; i&lt;(0x10000);i++)
   {
       tableData[i]=(byte)(i &gt;&gt; 8);
     //  tableData[1][i]=(byte)(i &gt;&gt; 8);
     //  tableData[2][i]=(byte)(i &gt;&gt; 8);
   }

   LookupTableJAI lut = new LookupTableJAI(tableData);
   RenderedOp image2= null;
   image2 = JAI.create ("lookup",ima, lut);
    return image2;</blockquote>

Não sei se este código deve funcionar - sua LUT tem 0x10000 entradas?? O que exatamente você está tentando fazer? Essa sua LUT não faz muito sentido, tem tantas entradas que seria mais simples usar RGB diretamente…

Rafael

L

Na verdade esse é só um exemplo que dei pois o código que uso é

public static PlanarImage lookup&#40;PlanarImage image&#41;
        &#123;
        // If the source image is colormapped, convert it to 3-band RGB.
        if&#40;image.getColorModel&#40;&#41; instanceof IndexColorModel&#41;
          &#123;
          // Retrieve the IndexColorModel
          IndexColorModel icm = &#40;IndexColorModel&#41;image.getColorModel&#40;&#41;;
          // Cache the number of elements in each band of the colormap.
          int mapSize = icm.getMapSize&#40;&#41;;
          // Allocate an array for the lookup table data.
          byte&#91;&#93;&#91;&#93; lutData = new byte&#91;3&#93;&#91;mapSize&#93;;
          // Load the lookup table data from the IndexColorModel.
          icm.getReds&#40;lutData&#91;0&#93;&#41;;
          icm.getGreens&#40;lutData&#91;1&#93;&#41;;
          icm.getBlues&#40;lutData&#91;2&#93;&#41;;
          // Create the lookup table object.
          LookupTableJAI lut = new LookupTableJAI&#40;lutData&#41;;
          // Replace the original image with the 3-band RGB image.
          image = JAI.create&#40;"lookup", image, lut&#41;;
          &#125;
        return image;
        &#125;
mas isso não faz nada na imagem pois como saída tenho a mesma imagem que passei na entrada.
Lhu.

[size=“11”]
[color=“red”]

  • Editado: Lembre-se de usar BBCode em seus códigos para mantê-los identados e mais legíveis para outros usuários - Matheus[/color][/size] :joia:
R

“Lhu”:
Na verdade esse é só um exemplo que dei pois o código que uso é

public static PlanarImage lookup&#40;PlanarImage image&#41; &#123; // If the source image is colormapped, convert it to 3-band RGB. if&#40;image.getColorModel&#40;&#41; instanceof IndexColorModel&#41; &#123;


Reconheço este código :wink:

Veja que o bloco que mapeia a LUT para a imagem só é executado se o modelo de cores for indexado. Se o modelo for outro, o método retorna a imagem original sem modificações. Você sabe qual é o modelo de cores da sua imagem?

Rafael

L

Não sei qual é o modelo de cor da minha imagem, uso vários tipos de imagens, inclusive imagens microscópicas. Estou usando o código abaixo e ele funcionou, mas queria que as cores ficassem mais nítidas para o usuário.

public static PlanarImage lookup&#40;PlanarImage image&#41; &#123;
               ColorCube colorMap = image.getSampleModel&#40;&#41;.getTransferType&#40;&#41; ==
               DataBuffer.TYPE_BYTE ?
               ColorCube.BYTE_496 &#58;
               ColorCube.createColorCube&#40;DataBuffer.TYPE_BYTE, 38, new int&#91;&#93;&#123;4,9,6&#125;&#41;;

           KernelJAI&#91;&#93; ditherMask = KernelJAI.DITHER_MASK_443;

           ParameterBlock pb = new ParameterBlock&#40;&#41;;
           pb.addSource&#40;image&#41;.add&#40;colorMap&#41;.add&#40;ditherMask&#41;;

           ColorSpace cs = ColorSpace.getInstance&#40;ColorSpace.CS_sRGB&#41;;
           int bits&#91;&#93; = new int&#91;&#93; &#123;8,8,8&#125;;

           ColorModel cm = new ComponentColorModel&#40;cs, bits, false, false,
                                                           Transparency.OPAQUE,
                                                           DataBuffer.TYPE_BYTE&#41;;

           // Create a tiled layout with the requested ColorModel.
           ImageLayout layout = new ImageLayout&#40;&#41;;
           layout.setTileWidth&#40;1&#41;.setTileHeight&#40;1&#41;;
           layout.setColorModel&#40;cm&#41;;

           // Create RenderingHints for the ImageLayout.
           RenderingHints rh = new RenderingHints JAI.KEY_IMAGE_LAYOUT,layout&#41;;

           // Create the ordered dither OpImage.
           return JAI.create&#40;"ordereddither", pb, rh&#41;;
       &#125;

[b]
[color=“red”]

  • Editado: Aumente as chances de alguém responder o seu tópico. Use BBCode em seus códigos para mantê-los identados e mais legíveis para outros usuários. - Matheus[/color][/b]
R

“Lhu”:
Não sei qual é o modelo de cor da minha imagem, uso vários tipos de imagens, inclusive imagens microscópicas. Estou usando o código abaixo e ele funcionou, mas queria que as cores ficassem mais nítidas para o usuário.

Lhu, por favor diga o que você quer fazer com as imagens. Em uma das primeiras mensagens você comenta que as suas imagens são em nívei de cinza e você quer aplicar LUTs - é para colorizar ou melhorar contraste? Se as imagens são sempre em nível de cinza você já sabe qual é o modelo de cor delas, certo? Ou você terá imagens em cores e cinza e quer melhorar contraste?

Veja que “cores mais nítidas para usuário” é bem relativo.

Diga exatamente o que você quer que eu posso sugerir um código que funcione em todas as ocasiões.

Rafael

L

Oi Rafael!
Na verdade isso vai ser aplicado em imagens em nível de cinza e coloridas. Quero deixar o usuário livre para escolher as cores que deseja utilizar na imagem. É isso que pretendo fazer.
Muito obrigada.
Lhu.

Criado 13 de julho de 2005
Ultima resposta 25 de jul. de 2005
Respostas 8
Participantes 2