Pergunta

Estou completamente novo para processamento de imagem.Eu não sei nada sobre o que é JPEG internamente e como ele funciona.

Gostaria de saber, se eu posso encontrar em algum lugar pedaço de código ruby realizando a seguinte operação simples:

  1. Abra o arquivo jpeg.
  2. Iterar através de cada pixel e definir a cor do fx verde.
  3. Escreva o resultado em outro arquivo.

Estou interessado especialmente a em como isso pode ser feito usando o ruby-vips biblioteca
https://github.com/ender672/ruby-vips

Meu objetivo - para aprender como realizar operações de processamento de imagens, utilizando ruby-vips (correção de gama, brilho, matiz, ...)

Quaisquer links para exemplos mais complexos do que 'olá mundo'-como um ruby-vips do github página seria muito apreciado!

Se há alternativas para ruby-vips, eu ficaria grato por eles também.


ATUALIZAÇÃO

Muita coisa aconteceu desde que eu fiz essa pergunta:

Foi útil?

Solução

atualização ruby-vips mudou um pouco desde que esta resposta foi escrito.Eu já revisou para o atual (2018) versão.

Eu sou um dos mantenedores do libvips, a biblioteca de processamento de imagem que ruby-vips envolve.

Tim ruby-vips repositório não tenha sido tocado por um tempo.Eu tenho um garfo aqui que funciona com corrente libvips:

https://github.com/jcupitt/ruby-vips

Existem alguns exemplos aqui:

https://github.com/jcupitt/ruby-vips/tree/master/example

Para definir o vermelho e o azul e canais a zero e é só deixar um imagem verde você poderia multiplicar R e B por zero e G por 1.ruby-vips usa matrizes para representar pixel constantes, de modo que você pode apenas escrever:

out = in * [0, 1, 0]

Um completo runnable exemplo pode ser:

#!/usr/bin/ruby

require 'vips'

im = Vips::Image.new_from_file '/home/john/pics/theo.jpg'
im *= [0, 1, 0]
im.write_to_file 'x.jpg'

Há um truque que você pode usar para new_from_file:se você sabe que você só vai estar fazendo simples de cima para baixo operações na imagem, como a aritmética ou a filtragem ou redimensionar, pode dizer-ruby-vips que você só precisa de acesso sequencial para pixels:

im = Vips::Image.new_from_file '/home/john/pics/theo.jpg', access: :sequential

Agora ruby-os vips transmitir a sua imagem.Ele vai executar a carga, a multiplicar-se e salvar todos em paralelo e nunca manter mais do que alguns scanlines de pixels na memória a qualquer momento.Isso pode dar um bom realmente melhora a velocidade e uso de memória.

Para alterar a gama da imagem você pode tentar algo como:

im = im ** 0.5 * 255 / 255 ** 0.5

Apesar de que vai ser um pouco lento (vou chamar de pow() três vezes para cada pixel), seria muito mais rápido para fazer uma tabela de pesquisa, execute o pow() em que, em seguida, mapear a imagem através da tabela:

lut = Vips::Image.identity
lut = lut ** 0.5 * 255 /255 ** 0.5
im = im.maplut lut

Quaisquer dúvidas, por favor sinta-se livre para abrir no rubyvips issue tracker:

https://github.com/jcupitt/ruby-vips/issues

Outras dicas

Me desculpe, eu não sei Ruby-Vips, mas ImageMagick é um clássico quando se trata de processamento de imagem. Há ligações de rubi na forma de rmagick ( REPO atual ), e você pode obter muita funcionalidade dos documentos do ImageMagick, mas também há três tutoriais aqui , bem como muitos exemplos na web.

Se você realmente quer ir profundamente na teoria do processamento de imagem, que em suas raízes é uma forma de processamento de sinal (isso é totalmente emocionante e recompensador, pois muitas vezes permite que você aplique algoritmos muito semelhantes em imagens e sinais de áudio / vídeo, mas acabará por ficar muito pesado em matemática - Fourier Transforms), então, se a matemática não o assustar, só posso recomendar ler o livro Por Gonzalez e Woods, eu diria que é a referência definitiva neste campo. É caro, mas há tudo que você precisa lá para você começar e muito além. Aqui está Também uma página com links para ebooks gratuitos Se você gostaria de começar sem gastar Muito dinheiro primeiro.

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