Atualmente, estou desenvolvendo uma função para detecção de bordas em scripts DigitalMicrograph (DM). Já tenho duas implementações simples para calcular a primeira e a segunda derivadas usando variáveis intrínsecas, conforme mostrado abaixo:
Primeira derivada:
Image absolute_first_derivative(Image in)
{
Number size_x, size_y, origin, scale;
String units;
Image out;
in.ImageGetDimensionCalibration(0, origin, scale, units, 0);
in.GetSize(size_x, size_y);
if (size_y != 1) Result("Only compatible with 1D image");
out := RealImage("first_derivative", 4, size_x, size_y);
out = in[icol + 1, irow] - in[icol, irow];
out[0, 0] = 0;
out[size_x - 1, 0] = 0;
out.ImageSetDimensionCalibration(0, origin, scale, units, 0);
return out;
}
Segunda derivada:
Image second_derivative(Image in)
{
Number size_x, size_y, origin, scale;
String units;
Image out;
in.ImageGetDimensionCalibration(0, origin, scale, units, 0);
in.GetSize(size_x, size_y);
if (size_y != 1) Result("Only compatible with 1D image");
out := RealImage("second_derivative", 4, size_x, size_y);
out = in[icol + 1, irow] - 2 * in[icol, irow] + in[icol - 1, irow];
out[0, 0] = 0;
out[size_x - 1, 0] = 0;
out.ImageSetDimensionCalibration(0, origin, scale, units, 0);
return out;
}
Gostaria de implementar uma abordagem mais flexível, baseada em kernel (por exemplo, Sobel, LoG ou kernels similares) usando a Warp()
função fornecida pelo DM. No entanto, parece que ela Warp()
é explicitamente projetada para transformações de imagem 2D.
Minhas perguntas são:
- O script DigitalMicrograph pode
Warp()
ser adaptado ou usado para processamento de imagens unidimensionais? - Se
Warp()
não for adequado, existe outra função DM integrada ou método recomendado para executar convolução ou transformações baseadas em kernel especificamente em imagens 1D?
Quaisquer sugestões ou exemplos serão muito apreciados!
O principal propósito da função Warp() é fazer interpolações em uma matriz de dados ou imagem existente, então parece que seu uso é secundário ao seu objetivo principal de fazer filtragem baseada em kernel de matrizes de dados 1D. Consequentemente, esta resposta aborda sua pergunta em dois estágios.
O primeiro estágio é simplesmente executar a computação baseada em kernel. Isso é facilmente alcançado com a função DM Convolution(), conforme ilustrado no exemplo a seguir, que aplica um kernel de primeira derivada de suavização a alguns dados de destino:
Infelizmente, a documentação de ajuda do DM não aborda a função Convolution() em muitos detalhes, mas há alguns scripts de exemplo para ela e outras funções de filtragem de imagem fornecidas na seção Scripting>Scripts de exemplo>Cálculo de imagem simples>Filtragem de imagem.
Se você fizer uma busca por "[dm-script] Convolution" no StackOverflow, você encontrará algumas outras postagens que também abordam o uso desta e de funções relacionadas com scripts de DM.
Quanto ao seu desejo de usar a função Warp(), isso parece ser um problema separado, já que seu propósito é principalmente interpolar valores dentro de um array, o que pode ser feito antes ou depois de você aplicar a função Convolution. Se você ainda tiver alguma dúvida sobre Warp, por favor, faça uma postagem separada.