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.
Lookup table
8 Respostas
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
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:
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<(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;</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
Na verdade esse é só um exemplo que dei pois o código que uso é
public static PlanarImage lookup(PlanarImage image)
{
// If the source image is colormapped, convert it to 3-band RGB.
if(image.getColorModel() instanceof IndexColorModel)
{
// Retrieve the IndexColorModel
IndexColorModel icm = (IndexColorModel)image.getColorModel();
// Cache the number of elements in each band of the colormap.
int mapSize = icm.getMapSize();
// Allocate an array for the lookup table data.
byte[][] lutData = new byte[3][mapSize];
// Load the lookup table data from the IndexColorModel.
icm.getReds(lutData[0]);
icm.getGreens(lutData[1]);
icm.getBlues(lutData[2]);
// Create the lookup table object.
LookupTableJAI lut = new LookupTableJAI(lutData);
// Replace the original image with the 3-band RGB image.
image = JAI.create("lookup", image, lut);
}
return image;
}
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:
Na verdade esse é só um exemplo que dei pois o código que uso é
public static PlanarImage lookup(PlanarImage image) { // If the source image is colormapped, convert it to 3-band RGB. if(image.getColorModel() instanceof IndexColorModel) {
Reconheço este código
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
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(PlanarImage image) {
ColorCube colorMap = image.getSampleModel().getTransferType() ==
DataBuffer.TYPE_BYTE ?
ColorCube.BYTE_496 :
ColorCube.createColorCube(DataBuffer.TYPE_BYTE, 38, new int[]{4,9,6});
KernelJAI[] ditherMask = KernelJAI.DITHER_MASK_443;
ParameterBlock pb = new ParameterBlock();
pb.addSource(image).add(colorMap).add(ditherMask);
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
int bits[] = new int[] {8,8,8};
ColorModel cm = new ComponentColorModel(cs, bits, false, false,
Transparency.OPAQUE,
DataBuffer.TYPE_BYTE);
// Create a tiled layout with the requested ColorModel.
ImageLayout layout = new ImageLayout();
layout.setTileWidth(1).setTileHeight(1);
layout.setColorModel(cm);
// Create RenderingHints for the ImageLayout.
RenderingHints rh = new RenderingHints JAI.KEY_IMAGE_LAYOUT,layout);
// Create the ordered dither OpImage.
return JAI.create("ordereddither", pb, rh);
}
[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]
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
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.