|
Funcionalidades
Plug-insAlgoritmos para processamento de imagens são implementados externamente como plug-ins e o framework disponibiliza uma interface para manipula-los. No código a seguir, o plug-in "GrayScale" é carregado e aplicado na imagem test.jpg:MarvinImage image = MarvinImageIO.loadImage(“test.jpg”); MarvinPluginImage plugin = MarvinPluginLoader.loadPluginImage("net.sourceforge.marvinproject.color.grayScale.jar"); plugin.process(a_image, a_image, a_null, MarvinImageMask.NULL_MASK, false); Plug-ins são carregados em tempo de execução através da reflexão de classes. Isto facilita a extensibilidade e permite uma integração mais fácil entre plug-ins. Um plug-in para exibir um histograma da distribuição de cores em escala de cinza, por exemplo, utiliza o plug-in "GrayScale" para converter uma imagem para escala de cinza antes de gerar o histograma. Captura de VídeoCaptura de vídeo é oferecida através do Jave Media Framework e permite desenvolvedores trabalharem com processamento de vídeo em tempo-real. Para os plug-ins, a interface para trabalhar com vídeos e imagens é a mesma. No caso dos vídeos, plug-ins podem armazenar frames anteriores para trabalhar com múltiplos frames.Abaixo, um exemplo de aplicação de filtro em tempo-real. ![]() Multi-threadingMarvin permite o processamento de múltiplas imagens ao mesmo tempo ou a mesma imagem ser processada por múltiplas threads. Plug-ins de processamento de imagem recebem uma imagem para ser processada e uma máscara contendo quais pixels devem ser considerados. Assim, diferentes threads podem trabalhar na mesma imagem em diferentes regiões, como mostrado adiante:Imagem de entrada: ![]() Imagem de saída: ![]() No exemplo apresentado acima, o plug-in estatístico "Maximum" gastou 632 e 389 milissegundos, respectivamente utilizando uma e duas threads. A resolução da imagem é 873z601 e a máquina utilizada no teste foi um AMD Turion 64x2. Medidor de PerformanceMuitos algoritmos de processamento de imagens podem ser divididos em etapas. Um algoritmo, por exemplo, pode ser dividido em cinco etapas para destacar pontos de interesse numa imagem: representação da imagem em escala de cinza, detecção de borda, binarização, aplicação Harris/Plassey e renderização dos pontos de interesse em vermelho. Cada etapa tem um custo computacional diferente e o medidor de performance permite aos desenvolvedores analisar a performance de um algoritmo inteiro e de seus etapas individualmente, considerando o numero de passos executados e o tempo de execução. Assim é possível analisar a performance como um todo e fica mais fácil de realizar otimizações, já que possível visualizar qual etapa do algoritmo é mais cara e consequentemente é mais interessante de ser otimizada. Outra aplicação do medidor de performance é a determinação da ordem de um algoritmo, notação Grande-O, considerando o número de passos executados para diferentes resoluções de imagens. A imagem abaixo apresenta informações providas pelo medidor de performance para o plug-in "InterestPoints".![]() GUI APIPlug-ins podem ter atributos especificados pelos usuários que determinam o seu funcionamento. O framework Marvin prove funcionalidades para integrar componentes de interface com atributos de plug-ins. O desenvolvedor do plug-in especifica a relação entre atributos do plug-in e componentes de interface, adicionados a janela do plug-in. Quando o valor do componente é alterado, o valor do atributo associado ao mesmo é alterado automaticamente. O desenvolvedor não precisa se preocuparem tratar eventos de interface e atualizar atributos. Abaixo um código exemplo de como criar uma janela utilizando estes recursos:public void show(){ MarvinFilterWindow l_filterWindow = new MarvinFilterWindow("Brightness and Contrast", 400,350, getImagePanel(), this); l_filterWindow.addLabel("lblBrightness", "Brightness"); l_filterWindow.addHorizontalSlider("sliderBrightness", "brightness", -127, 127, 0, attributes); l_filterWindow.addPanelBelow(); l_filterWindow.addLabel("lblContrast", "Contrast"); l_filterWindow.addHorizontalSlider("sliderContrast", "contrast", -127, 127, 0, attributes); l_filterWindow.setVisible(true); } O código anterior cria uma nova MarvinFilterWindow que implementa as funcionalidades de thumbnail, preview, reset e apply. Os botões preview e apply invocam métodos implementados no plug-in. Dois sliders horizontais são adicionados a janela, um associado ao atributo "brightness" e outro ao atributo "contrast". A janela resultante é apresetada abaixo: ![]() Histórico de Plug-insEm alguns casos, para atingir um determinado resultado, é necessário combinar diversos algoritmos. A preparação de uma imagem para reconhecimento de padrão, por exemplo, em algumas aplicações é interessante remover ruído, aumentar o contraste e destacar as bordas. Nestes casos, onde múltiplos algoritmos são utilizados, MarvinPluginHistory armazena a aplicação de todos os plug-ins, incluindo suas configurações e imagens resultantes. Esta funcionalidade permite uma analise do processo como um todo considerando cada passo. Outra aplicação, é a comparação da aplicação da mesma sequência de procedimentos, só que com configurações diferentes. Abaixo é apresentado um exemplo do histórico de plug-ins:![]() |
||