Potion Bottle Icon Manuel d'alchimie du code Potion Bottle Icon

Filtrer des images avec ImageMagick, R et Bash

- 553 mots - Temps de lecture estimé: 3 minutes

Offre de formation

Potion Bottle IconHéberger ton entreprise ou ton OBNL avec YunohostPotion Bottle Icon

Arrête de payer par utilisateur·ice pour des outils qui analysent tes données. Expérimente l'autohébergement sur un vrai serveur avec Yunohost et ses centaines d'applications libres.

Héberge tes données au Québec

Photographie d'une caméra canon, tirée de Pixabay

🌘 Introduction


Sun Face IconComment conserver seulement les images d’une résolution minimale avec ImageMagick, R et Bash ?Sun Face Icon


Ce tutoriel montre comment filtrer un répertoire d’images récupérées des réseaux sociaux et ne conserver que celles d’une résolution minimale de 720x720 pixels. L’outil identify d’ImageMagick liste les résolutions, awk extrait le nom de fichier et les dimensions, puis R avec tidyverse filtre et copie les images conformes. Une solution efficace pour éliminer les miniatures et images de thème indésirables.

J’ai un disque sur lequel je garde des images que j’enregistre depuis les réseaux sociaux, souvent des infographies. Dans ce tutoriel, nous allons utiliser bash, ImageMagick et R pour effectuer le ménage dans ce répertoire.

Il y a souvent des pages que j’enregistre au complet, mais seulement pour garder les photos qu’elles contiennent. Celles-ci contiennent souvent des miniatures et des images utilisées pour le thème de la page.

Bref, au fil des années, le répertoire devenait un fouillis.

🌘 Détecter la résolution des images avec ImageMagick

Logo officiel d'ImageMagick

Je cherchais donc un moyen de conserver seulement les grandes images, celles avec une résolution de 720x720 minimum.

Donc, ma première étape a été de trouver un moyen de lister la résolution de toutes les images du répertoire.

J’ai fait ceci en utilisant identify, un outil de la suite ImageMagick.

identify InvertedIndex.jpg

La sortie de ce logiciel ressemble à ceci:

InvertedIndex.jpg JPEG 588x447 588x447+0+0 8-bit sRGB 36166B 0.000u 0:00.000

Ensuite, en utilisant awk, je conserve le premier élément de la sortie, qui est le nom de fichier, ainsi que le 3e élément, qui est la résolution, sous la forme AxB.

identify InvertedIndex.jpg | awk '{print $1, $3}'

En sortie, on obtient

InvertedIndex.jpg 588x447

Je veux exécuter cette commande récursivement pour tous les sous-répertoires courants. Pour ce faire, find permet de lister tous les fichiers. Le programme complet ressemble donc à ceci, prenant en entrée deux arguments:

#!/bin/bash
find "$1" -type f -exec identify \{\} \; | awk '{print $1, $3}' > "$2"

🌘 Identifier les fichiers à supprimer

Pour la suite des choses, je vais utiliser le langage de programmation R, qui va me permettre de manipuler le fichier de sortie et de générer la liste des fichiers à supprimer

Je charge tidyverse (parce que je suis un peu lâche et ça comprend tout, comme Hélix de Vidéotron 🙃)

library("tidyverse")

Ensuite, définition de mon répertoire et du fichier de sortie

my_dir <- "/something/something/" 
output_file <- "somefile.txt"
system(paste0("bash liste_dimensions.sh ",my_dir," ",output_file))
setwd(my_dir)
files.txt <- read_table(paste0(my_dir,output_file), col_names = "nom")
files.txt$nom %>% 
  str_split_fixed(pattern = " ",n = 2) -> 
  files_split
files_split %>% 
  as.tibble() -> 
  files_tibble

J’utilise ensuite separate et transmute pour obtenir 3 colonnes, une avec le nom de fichier, une avec la largeur et une avec la hauteur au format numérique

files_tibble %>%
 separate(col = V2, sep = "x", into = c("width","height")) %>%
  transmute(
    path=V1,
    width = width %>% as.numeric(),
    height = height %>% as.numeric(),
  ) -> files_attr

Je filtre ensuite les fichiers à supprimer

files_attr %>% 
  filter(width <= 720 & height <= 720) -> to_delete

J’exporte la liste de fichiers à supprimer

to_delete$path %>% write_lines("to_delete.txt")

🌘 Supprimer les fichiers

De retour au terminal bash, je supprime les fichiers en utilisant xargs pour éviter un dépassement de capacité.

cat to_delete.txt | xargs -0 -I {} rm "{}"

🌘 Conclusion

Dans ce billet, j’ai montré comment faire le tri dans un répertoire de photos à l’aide d’un script qui permettra de sauver beaucoup de temps à un utilisateur averti.

🌘 Crédit photo

Image by S. Hermann & F. Richter from Pixabay

Offre de service

Shooting Stars IconConfiguration Express — 1 heure — 245 $Shooting Stars Icon

Un problème de configuration qui te semble insurmontable ? Environ une heure, en moyenne, je configure tes courriels, DNS, accès et conformité loi 25. Les suivis sont inclus pour valider ou corriger des configurations additionnelles au besoin. Tu repars avec une solution fonctionnelle, pas un devis.

Règle ton problème maintenant — 245 $
Abonne-toi au fil RSS pour ne rien manquer.

Étiquettes