dividir imagens jpg por proporções determinadas (imagemagick)

0

Eu tenho um monte de imagens digitalizadas em formato jpg. Como você pode ver nas figuras abaixo, os cartões são frente e verso. Ao digitalizar, coloquei 6 cartões dentro do scanner.

O lado frontal do primeiro cartão é numerado 1 na figura abaixo e o verso é numerado 7. O lado frontal do segundo cartão é numerado 2 e o verso é 8, etc.

O que eu quero realizar: Para dividir esses arquivos (image1.jpg e image2.jpg) de uma maneira que terei uma pasta contendo os cartões individuais, da seguinte forma:

1.jpg(1)
2.jpg(7) (since 7 is the back side of the 1.jpg) 

3.jpg(2)
4.jpg(8)
etc

(image1.jpg) Parte frontal dos seis cartões: Parte da frente dos cartões

(image2.jpg) Verso dos seis cartões: Verso dos cartões

1- Como posso dividir imagens com base nessas linhas divisórias usando o imagemagick (ou qualquer outra solução)? (Posso obter o xey dessas linhas porque todas as imagens são 2550x3507)

as linhas divisórias estão em vermelho: As linhas divisórias estão em vermelho

  1. após a divisão ou durante a divisão, é possível numerá-los automaticamente com base na ordem desejada descrita acima?
acman123
fonte

Respostas:

1

Como posso dividir imagens com base nessas linhas divisórias usando o [ImageMagick?]

Indiscutivelmente, a solução mais simples provavelmente seria usar -crop assim:

convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg

Este comando:

  • Divide cada imagem em 6 (aproximadamente) blocos de tamanho igual ( -corte 3x2 @ ), numerando cada um em ordem.

  • Inicia a sequência de numeração em 1( -cena 1 ), em vez de 0.

  • Dá aos números finais um 0preenchimento ( %02d) nos dígitos únicos [ 01-09].

Notas de comando

  • Embora seja possível especificar um tamanho exato (por exemplo 1000x1000) ou usar porcentagens (por exemplo 33%x50%) para uma colheita de ladrilhos, isso também pode potencialmente produzir imagens "aparadas" (provavelmente indesejáveis).

  • O uso de, por exemplo, -3x2@geralmente cria imagens com tamanho mais próximo (em relação ao outro) do que porcentagens de "superação" (por exemplo 33.4%x50%), para evitar a produção de imagens "aparadas".

  • Em um arquivo em lotes, você precisará dobrar os sinais de porcentagem para que funcionem conforme o esperado:

    convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%%02d.jpg
    
  • Se você estiver gravando em formatos que podem ter deslocamentos de imagem / tela (por exemplo .png), convém incluir + repage após -crop:

    convert -crop 3x2@ +repage -scene 1 image1.jpg image2.jpg cropped_%02d.png
    
  • Se os seus formatos de entrada puderem conter compensações de imagem / tela, convém +repagetambém.


Renomeando

É possível numerá-los automaticamente com base na ordem descrita acima?

Com o ImageMagick sozinho, não consegui fazê-lo (suspeito que provavelmente não seja possível, mas sinceramente não tenho certeza disso). Obviamente, separado do ImageMagick, isso é completamente possível.

Desde que você marcou essa pergunta batch, vale a pena mencionar que provavelmente não posso ajudar com boas soluções em lote. Com isso em mente, parece muito provável que você (ou outra pessoa) possa criar algo melhor do que o que detalho abaixo.

Resposta em lote obrigatória (não)

É possível renomear com força bruta no lote. Primeiro, renomeie todos os arquivos (exceto o primeiro e o último) temporariamente, por exemplo:

rename cropped_02.jpg  cropped_02_temp.jpg 
[...]
rename cropped_11.jpg  cropped_11_temp.jpg 

Em seguida, renomeie-os de volta para suas novas posições, por exemplo:

rename cropped_02_temp.jpg  cropped_03.jpg
rename cropped_03_temp.jpg  cropped_05.jpg 
rename cropped_04_temp.jpg  cropped_07.jpg 
rename cropped_05_temp.jpg  cropped_09.jpg 
rename cropped_06_temp.jpg  cropped_11.jpg 
rename cropped_07_temp.jpg  cropped_02.jpg 
rename cropped_08_temp.jpg  cropped_04.jpg 
rename cropped_09_temp.jpg  cropped_06.jpg 
rename cropped_10_temp.jpg  cropped_08.jpg 
rename cropped_11_temp.jpg  cropped_10.jpg 

O lote tem a capacidade de pegar argumentos da linha de comando e fazer contas, além de possuir forloops e ifinstruções, etc., portanto, essa solução pode (obviamente) ser aprimorada.


Renomeando Notas

Se você observar a segunda metade do processo de renomeação acima, notará um padrão nos nomes dos arquivos. Efetivamente, para uma determinada posição N, podemos usar uma das duas fórmulas a seguir para encontrar a nova posição de um item no seu esquema:

  • Itens até o ponto "meio caminho" (por exemplo, 2-6): (Position_N * 2) - 1
  • Itens além do ponto "intermediário" (por exemplo, 7 a 11): (Position_N * 2) - Total_Items

Nota: Embora seja possível aplicar essas fórmulas a uma sequência inteira (por exemplo, 1 e 12), o primeiro e o último item nunca mudam de posição. Isso sem dúvida torna desnecessário renomeá-los.


Além disso, eles devem funcionar para qualquer número par (não ímpar) de itens / posições (4 ou mais), assumindo que os nomes dos arquivos estejam em ordem (por exemplo, 1 a 12). Então, para seus exemplos originais:

Temp Item 2 becomes (2 * 2) - 1  = Item 3
Temp Item 7 becomes (7 * 2) - 12 = Item 2
Temp Item 8 becomes (8 * 2) - 12 = Item 4
[...]

Assim, as fórmulas fornecidas podem potencialmente ser a base para soluções em lote (ou outros scripts). No entanto, há algumas outras coisas a serem observadas se você decidir usá-las como tal ...

Classificação

A classificação (conforme mencionado acima) pode ter consequências práticas em coisas como scripts, pois os itens retornados "fora de ordem" pelo Windows "quebrarão" as fórmulas fornecidas. Particularmente:

  • O Windows classifica os nomes em ordem lexicográfica por padrão. Isso significa que os itens que não possuem um 0dígito na frente de um dígito (por exemplo, imagem_1.jpg vs. imagem_01.jpg ) não aparecerão em ordem (natural) quando retornados diretamente pelo Windows. Ou seja, eles serão retornados como por exemplo:

    cropped_1.jpg, cropped_10.jpg, cropped_11.jpg, cropped_12.jpg, cropped_2.jpg, etc.
    
  • Certas palavras e frases (como - Copy) nos nomes dos arquivos também podem afetar a ordem na qual os nomes dos arquivos são retornados.

Se você usar as fórmulas acima, certifique-se de 0digitar apenas um dígito nos nomes dos arquivos e remova coisas como - Copy(ou tome medidas para mitigar esses problemas).

Loops / contadores começando com 0

Se você estiver usando um idioma que começa a contar 0(por exemplo, em loops), isso pode alterar ligeiramente as fórmulas:

  • Itens até o ponto "meio caminho" (por exemplo, 1-5): (Position_N * 2)
  • Itens além do ponto "intermediário" (por exemplo, 6 a 10): (Position_N * 2) - (Total_Items - 1)

Lembre-se de que, contando de 0 a 12 itens, seria executado 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11.


Um script Python

Se você estiver interessado, escrevi um pequeno script Python (provavelmente terrível) para o Python 3.x (testado com 3.6.4), que pode ser usado na linha de comando para renomear arquivos arbitrários que estão em sequência (por exemplo, cropped_01. jpg ... cropped_XX.jpg ) na ordem especificada na sua pergunta. Você precisará ter uma cópia do Python instalada se decidir experimentá-la.

Limitações

  • Não lê arquivos de texto para obter informações (portanto, não é necessário especificar uma lista de arquivos no momento). Da mesma forma, um prefixo e uma extensão de nome de imagem / arquivo são necessários na linha de comando.

  • Como está, o script espera que os nomes dos arquivos sejam retornados na ordem correta automaticamente (consulte Windows e 0padding, acima).

  • Existe uma opção para usar um módulo de terceiros chamado natsort(instalado com, por exemplo python -m pip install natsort) se seus itens não estiverem 0preenchidos. No entanto, é necessário descomentar a linha 13 ( from natsort import natsorted) e a linha 105 ( item_list = list(natsorted(item_list))) no script após a instalação natsortpara usar esta opção.

Para ser claro, "descomentar" significa remover o #espaço inicial e o início da linha. Instruções adicionais sobre o uso estão incluídas no script.

Anaksunaman
fonte
Seu script python não funcionou, embora sua primeira parte da resposta fez o trabalho como eu precisava
acman123
Hmm ... Bem, estou feliz que pelo menos algumas das respostas funcionaram! = P
Anaksunaman 14/03