Classificação de arquivos de imagem com base em se o conteúdo é imagem ou gráficos: atualizando uma solução antiga?

2

Alguém queria classificar arquivos em um diretório de acordo com os arquivos imagens (câmera) vs. gráficos de design . Em Stackoverflow , há uma solução / prova de conceito mais antiga envolvendo a comparação do intervalo de cores em imagens. Eu reproduzo quase como está: 1

CheckCartoon.sh :

#!/bin/sh

IMAGE=$1
COLORS=$(convert $IMAGE -format %c histogram:info:- | wc -l)
WIDTH=$(identify $IMAGE | sed -r "s/.* ([0-9]+)x[0-9]+ .*//")
HEIGHT=$(identify $IMAGE | sed -r 's/.* [0-9]+x([0-9]+) .*//')
RATIO=$(echo $WIDTH $HEIGHT $COLORS | awk '{ print ($1 * $2)/$3;}')
echo $RATIO | awk '{ printf "%020.5f",$1 }' 

CheckAll .sh:

#!/bin/sh

FILES=$(ls)
for FILE in $FILES; do
IsIMAGE=$(identify $FILE 2>&1 | grep " no decode delegate " | grep -o "no")
if [ "$IsIMAGE" = "no" ]; then continue; fi
IsIMAGE=$(identify $FILE 2>&1 | grep " Improper image header " | grep -o "Improper")
if [ "$IsIMAGE" = "Improper" ]; then continue; fi
echo $(CheckCartoon.sh $FILE) $FILE
done

Saída típica :

00000000000002.16959 Burne_Jones_The_Doom_Fulfilled_1884_85.jpg
00000000047480.70000 Dürer-Hieronymus-im-Gehäus.jpg
00000000000016.03440 IMG_00000138.jpg
00000000000015.67780 IMG_00000143.jpg
00000000000014.37140 IMG_00000144.jpg
00000000000015.05500 IMG_00000145.jpg
00000000000011.79040 M2-GrandTurk1.jpg
00000000000013.05840 Real-01.jpg

Acho que a solução é interessante apesar de suas deficiências e gostaria de explorá-la e:

  • use as práticas recomendadas para atualizá-lo e torná-lo mais seguro e mais robusto, pois acredito que o script acabou de ser adicionado para mostrar a ideia
  • crie dois diretórios para copiar os arquivos de acordo com um limite que seria definido no script ou como um parâmetro em tempo de execução. De um modo geral, valor muito baixo é suposto significar algo semelhante a uma imagem da câmera (ou pelo menos não é um tipo de gráfico limitado a cores. Então aqui, eu tinha definido o limiar a 50, todas, exceto uma, as imagens seriam copiadas para o imagens diretório, enquanto o Durer iria para gráficos .

Gostaria de receber ajuda / conselhos sobre como tentar fazer isso.

1. A resposta em SO sofre com o editor fazendo algo errado com os backticks. Além disso, há negrito? marcação dentro de um dos blocos. Certamente todo mundo tentando descobrir, mas um iniciante provavelmente não vai.

    
por jus cogens prime 15.11.2014 / 01:48

1 resposta

1

Se você usar mkdir -p , não haverá reclamações sobre os diretórios já existentes, portanto, coloque o seguinte na parte superior de CheckAll.sh :

 mkdir -p graphics pictures

A linha echo $(CheckCartoon.sh $FILE) $FILE apenas exibe o resultado do cálculo junto com o nome do arquivo, você deve fazer algo mais com ele, então substitua-o por:

# store value
result=$(CheckCartoon.sh $FILE)
# do a string compare
if [[ $result < "00000000000050." ]]
then
    echo move "$FILE" to graphics $result
    mv "$FILE" graphics
else
    echo move "$FILE" to pictures $result
    mv "$FILE" pictures
fi

Quanto à robustez, você provavelmente não deveria estar usando scripts de shell em primeiro lugar. Mas você poderia pelo menos colocar verificações adicionais em $result para garantir que o script retornasse um valor válido.

    
por 15.11.2014 / 07:16