Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/04/2015, à 14:25

O'Bit

Script de tri automatique de photos par couleurs avec imageMagick

Bonjour je viens vers vous car je bloque un peu sur la rédaction d'un script shell (pourtant basique)
Voila je reviens de vacances en Islande avec trois autres potes, tous armés d'appareils photos, autant vous dire que la quantité de donnée à traité est énorme. j'avais envie de me faire un petit programme PureData ou autre pour faire un diaporama interactif qui change de la soirée diapo de vacance mais pour cela je cherche à trier mes photos de façons chromatique.
Ma première envie est de les trier de la plus claire à la plus sombre (de jour dans la neige - de nuits avec les étoiles).
Me penchant sur la question je découvre ImageMagick super top avec la commande

O-bit:~$  convert ~/Photos/Islande/IMG_3009.JPG -gravity center -crop 70x70%+0+0 -scale 1x1\! -depth 8 txt:-

et il me répond

# ImageMagick pixel enumeration: 1,1,255,rgb
0,0: (153,156,159)  #999C9F  rgb(153,156,159) 

code trouvé ici : http://www.imagemagick.org/Usage/compare/#type_general

en utilisant cut je peux récupérer et additionner les trois valeurs RGB et organiser ainsi jusqu’à 765photos (3*255) de la plus claire à la plus sombre.
Je me rédige un début de script shell :

#!/bin/bash

IMAGE=$('~/Photos/Islande/IMG_3009.JPG')
RED=$(convert "$IMAGE" -gravity center -crop 70x70%+0+0 -scale 1x1\! -depth 8 txt:- | cut -d" " -f6| cut -b5-7)
GREEN=$(convert "$IMAGE" -gravity center -crop 70x70%+0+0 -scale 1x1\! -depth 8 txt:- | cut -d" " -f6| cut -b9-11)
BLUE=$(convert "$IMAGE" -gravity center -crop 70x70%+0+0 -scale 1x1\! -depth 8 txt:- | cut -d" " -f6| cut -b13-15)
mv "$IMAGE" "~/Photos/Islande/Rename/$(echo "($RED+$GREEN+$BLUE)/3"| bc).jpg"

Je nomme mon fichier luminosite.sh et le rend exécutable, mais celui ci me répond 

luminosite.sh: ligne 3: ~/Photos/Islande/IMG_3009.JPG: Permission non accordée

et pourtant toute les permission et shakra me semblent ouvertes...
j'ai sûrement une mauvaise syntaxe et ne trouve pas de tuto qui arrivent à m'éclairer.
Si vous trouvez ce qui ne vas pas je vous en serez reconnaissant !!



PS: je me doute bien que je vais ensuite rencontrer des problème de doublons dans les noms et que la syntaxe pour traiter l'ensemble d'un dossier sera différente que pour une photo (sûrement une boucle qui s'incrémente ou un truc comme ça) mais si déja le test sur une photo ne marche pas alors sur plusieurs centaine ....

Hors ligne

#2 Le 12/04/2015, à 17:23

pingouinux

Re : Script de tri automatique de photos par couleurs avec imageMagick

Bonjour,
C'est

IMAGE=~/Photos/Islande/IMG_3009.JPG

Hors ligne

#3 Le 17/04/2015, à 15:42

O'Bit

Re : Script de tri automatique de photos par couleurs avec imageMagick

Merci pingouinux pour l'info,
depuis j'ai essayé d'élaborer plus en avant mon script
actuellement il donne cela :

#!/bin/sh
echo "_______________________"
echo "Debut"
for file in $(find /dossier/ou/son les/Photos/ -maxdepth 1 -type f -name '*.jpg') 
do
echo "fichier : $file"
convert -scale 4x4 -format %c -depth 8 $file histogram:info:-| sed -e 's/(//g' -e 's/,/ /g' -e 's/)//g' temp.txt |cut -d"#" -f-1 |cut -d":" -f2 > /dossier/ou/son les/Photos/temp.txt
for ((ligne=1; ligne<13; ligne++))
do
LIGNECOULEUR=$(sed -n ${ligne}p temp.txt)
Rouge=$(echo ${LIGNECOULEUR[0]})
Vert=$(echo ${LIGNECOULEUR[1]})
Bleu=$(echo ${LIGNECOULEUR[2]})
echo "R: $Rouge V: $Vert B: $Bleu"
done		
done
echo "travail fini !"
echo "______________________________________"

en gros l'option histogram de convert me donne 12 série de trois valeurs (rvb) ainsi que d'autres infos. Mon but est de nettoyer ce résultat pour ne garder que trois valeurs sous cette forme : 255 255 255 , d'ou les série de cut et sed, cela ne posait pas de problème. j'enregistre ensuite dans un fichier txt ces valeurs pour dans une boucle y accéder ligne par ligne et tenter de dispatcher sur trois variable Rouge Vert et Bleu. Mon gros problème est que le fichier texte est bien édité avec les valeurs comme je les veux (parfois des espaces viennent se rajouter selon les photos mais j'ajusterais ça après) mais quand je refais appel au fichier tmp.txt ensuite il me ressort l'intégralité des infos ignorant superbement tout mes filtres ...
Je vous avoue être dépassé et ne trouve pas vraiment d'info qui puisse m'éclairer...
si vous avez des idées smile

Hors ligne

#4 Le 17/04/2015, à 17:22

pingouinux

Re : Script de tri automatique de photos par couleurs avec imageMagick

O'Bit a écrit :

convert -scale 4x4 -format %c -depth 8 $file histogram:info:-| sed -e 's/(//g' -e 's/,/ /g' -e 's/)//g' temp.txt |cut -d"#" -f-1 |cut -d":" -f2 > /dossier/ou/son les/Photos/temp.txt

Ton fichier temp.txt apparaît 2 fois de manière incohérente.

Voici une suggestion en bash

#!/bin/bash

echo "_______________________"
echo "Debut"

while read file
do
   echo "fichier : $file"

   while read Rouge Vert Bleu
   do
      echo "R: $Rouge V: $Vert B: $Bleu"
   done < <(convert -scale 4x4 -format %c -depth 8 "$file" histogram:info:-| awk -F'[,()]' '!/^ *$/{print $2" "$3" "$4}')

done < <(find "/dossier_ou_sont_les_Photos/" -maxdepth 1 -type f -name '*.jpg')

echo "travail fini !"
echo "______________________________________"

Édité : Un peu plus simple

#!/bin/bash

echo "_______________________"
echo "Debut"

while read file
do
   echo "fichier : $file"

   while IFS='(),' read bidon Rouge Vert Bleu bidon
   do
      [ "$Rouge" ] || continue
      echo "R: $Rouge V: $Vert B: $Bleu"
   done < <(convert -scale 4x4 -format %c -depth 8 "$file" histogram:info:-)

done < <(find "/dossier_ou_sont_les_Photos/" -maxdepth 1 -type f -name '*.jpg')

echo "travail fini !"
echo "______________________________________"

Dernière modification par pingouinux (Le 18/04/2015, à 06:26)

Hors ligne