Pergunta

Eu gostaria de fazer algum trabalho com os nitty-gritties de imagens de computador. Eu estou procurando uma maneira de ler pixels individuais de dados, analisá-los através de programação, e alterá-las. Qual é a melhor linguagem para usar para esta (Python, C ++, Java ...)? Qual é a melhor fileformat?

Eu não quero nenhum software super chique / APIs ... Eu estou procurando o mais básico.

Foi útil?

Solução

Se você precisa de velocidade (você provavelmente vai querer sempre a velocidade com processamento de imagem), você definitivamente tem que trabalhar com dados de pixel brutos. Java tem algumas desvantagens reais, como você pode não memória de acesso diretamente que faz o acesso de pixel bastante lento em comparação com o acesso à memória diretamente. C ++ é definitivamente a linguagem de escolha para o processamento de imagem uso em produção. Mas você pode, por exemplo, também usam C #, pois permite código inseguro em áreas específicas. (Dê uma olhada na propriedade ponteiro scan0 da classe BitmapData.) Eu usei C # com sucesso para aplicações de processamento de imagem e eles são definitivamente muito mais rápido do que suas contrapartes java. Eu não usaria qualquer linguagem de script ou java para tal finalidade a.

Outras dicas

É muito leste de manipular os grandes arrays multi-dimensionais ou complexos de informação de pixel que são fotografias utilizando linguagens de alto nível como o Python . Há uma biblioteca chamada PIL ( Biblioteca Python Imaging), que é bastante útil e vai deixar você os filtros de gerais e transformações (alterar o brilho, amolecer, desaturate, cultura, etc), bem como manipular os dados de pixel em bruto.

É a mais fácil e simples imagem biblioteca eu utilizado até à data e pode ser estendido para fazer seja o que for que você está interessado ( borda detecção em muito pouco código, por exemplo).

Não só irá C / C ++ ser mais rápido, mas a maior parte do processamento de imagem código de exemplo que você encontrar lá fora, vai estar em C, bem, por isso vai ser mais fácil de incorporar coisas que você encontrar.

Se você estiver olhando para trabalho numérico em suas imagens (pense matriz) e você em Python confira http: / /www.scipy.org/PyLab -. isso é basicamente a capacidade de fazer Matlab em python, amigo meu jura por ele

(Isso pode não se aplicar para o OP que só queria o mais básico -. Mas agora que a questão da velocidade foi criado, eu faço necessidade de escrever isto, apenas para o registro)

Se você realmente velocidade de necessidade, é melhor esquecer trabalhando no nível de pixel por pixel, e sim ver se as operações que você precisa para realizar poderia ser vectorized . Por exemplo, para o seu código C / C ++, você poderia usar o excelente Intel IPP biblioteca (não, eu não trabalho para Intel).

Depende um pouco sobre o que você está tentando fazer.

Se a velocidade de execução é o seu problema, então c ++ é o melhor caminho a percorrer.

Se a velocidade de desenvolvimento é um problema, no entanto, gostaria de sugerir a olhar para java. Você disse que queria manipulação baixo nível de pixels, que java vai fazer por você. Mas a outra coisa que pode ser um problema é a manipulação dos vários formatos de arquivo. Java tem algumas muito agradáveis ??APIs para lidar com a leitura e escrita de vários formatos de imagem de arquivo (em particular a biblioteca Java2D. Você escolhe ignorar os níveis mais elevados da API)

Se você ir para a opção c ++ (ou python venha para pensar sobre isso) Eu voltaria a sugerir o uso de uma biblioteca para levá-lo ao longo dos problemas de inicialização de ler e gravar arquivos. Eu tive anteriormente com sucesso libgd

Qual a língua que você sabe o melhor? Para mim, essa é a verdadeira questão. Se você estiver indo para passar meses e meses aprendendo uma língua particular, então não há nenhuma vantagem real em usar Python ou Java apenas para sua velocidade de desenvolvimento (a ser comprovado). Estou particularmente proficientes em C ++ e eu acho que para esta tarefa particular que eu posso ser tão rápida como um programador Java, por exemplo. Com a ajuda de alguns boa biblioteca (OpenCV vem à mente), você pode criar qualquer coisa que você precisa em uma matéria de um par de linhas de código C ++, realmente.

Resposta curta: C ++ e OpenCV

Eu estudei Inteligência Artificial e Visão Computacional, assim, eu sei muito bem o tipo de ferramentas que são utilizados neste campo.

Basicamente:. Você pode usar o que quiser, desde que você saiba como ele funciona por trás da cena

Agora, dependendo do que você deseja alcançar, você pode usar:

  • linguagem C, mas você vai perder muito tempo em erros controlo e de gestão de memória ao implementar seus algoritmos. Então, teoricamente, este é o idioma mais rápido para fazer esse tipo de trabalho, mas se os seus algoritmos não são computationnally eficiente (em termos de complexidade) ou se você perder muito tempo em erros verificando, este não é claramente vale a pena. Então, eu aconselharia a primeira implementar sua aplicação em outro idioma, e depois você sempre pode otimizar pequenas partes de seu código com ligações C.
  • Octave / MatLab: linguagem muito eficiente, quase tanto como C, e você pode fazer algoritmos muito elegantes e sucintas. Se você estiver em operações de vectorização, matriz e lineares, você deve ir com isso. No entanto, você não será capaz de desenvolver um aplicativo inteiro com esta linguagem, é mais focado em algoritmos, mas então você pode sempre desenvolver uma interface usando outra linguagem mais tarde.
  • Python: all-in-one linguagem elegante e acessível, usado em aplicações gigantescamente de grande escala, como Google e Facebook. Você pode fazer praticamente tudo o que quiser com o Python, qualquer tipo de aplicação. Ele será perfeitamente adaptado, se você quiser fazer uma aplicação completa (com a interação do cliente e todos, não somente algoritmos), ou se você quer elaborar rapidamente um protótipo usando bibliotecas existentes desde Python tem um conjunto muito grande de bibliotecas de alta qualidade, como OpenCV . No entanto, se você só quer fazer algoritmos, você deve usar melhor Octave / MatLab.

A resposta que foi selecionada como uma solução é muito biaised, e você deve ter cuidado com este tipo de comentário arcaico.

Hoje em dia, o hardware é mais barato do que wetware (em humanos), e, portanto, você deve usar linguagens, onde você será capaz de produzir resultados mais rápidos, mesmo que seja à custa de alguns ciclos de CPU ou espaço de memória.

Além disso, um monte de gente tende a pensar que enquanto você implementar seu software em C / C ++, você está fazendo o Santo Graal da speedness: este não é apenas verdadeiro. Primeiro, porque algoritmos de complexidade importa muito mais do que o idioma que você está usando (um algoritmo ruim nunca vai bater um algoritmo melhor, mesmo que implementado na linguagem mais lento no universo), e em segundo lugar porque linguagens de alto nível são hoje fazendo um monte de caching e otimização de velocidade para você, e isso pode fazer a sua corrida programa ainda mais rápido do que em C / C ++.

Claro, você sempre pode fazer tudo o acima em C / C ++, mas como muito do seu tempo você está disposto a perder de reinventar a roda?

curta resposta? Eu diria C ++, você tem muito mais flexibilidade na manipulação de pedaços crus de memória do que Python ou Java.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top