[PYTHON] Histoire de l'analyse d'image du fichier PDF et de l'extraction de données

introduction

C'est un sujet brûlant des données ouvertes maintenant, mais ce ne sont pas nécessairement des données brutes telles que CSV, donc cela peut être subtilement difficile à gérer. Bien sûr, le fait que nous publions de nouvelles données dont nous disposons est quelque chose qui mérite d’être loué, et nous l’attendons avec le sentiment que «je veux vraiment des données brutes». C'est pourquoi ce n'est pas mal car il a été publié en PDF, mais lors de l'utilisation des données, il est nécessaire de le rendre plus lisible par machine que le PDF. Cette fois, les données CSV sont basées sur les données PDF de À propos de la situation de la congestion dans la voiture pendant l'heure de pointe du matin publiées par le Bureau des transports de la ville de Sapporo. Je vais vous présenter la procédure de formation.

politique

Le fichier PDF obtenu à partir du site Web ci-dessus a ce format スクリーンショット 2020-03-18 21.38.35.png

Pour le moment, les données sont structurées et cela ressemble à une sortie Excel sous forme de PDF. Donc, "de la structure à la voie de l'analyse" vient à l'esprit, mais il semblait que cela prendrait du temps et des efforts, comme le japonais stocké dans le tableau étant brouillé pendant l'analyse. C'est pourquoi j'ai conçu une procédure comme l'image ci-dessous.

スクリーンショット 2020-03-18 21.38.35.JPG

Il était difficile d'utiliser un logiciel de traitement d'image, alors je l'ai écrit à la main sur mon iPad. En bref, en regardant certains fichiers PDF, j'ai trouvé que la cellule supérieure gauche est toujours dans la même position dans les tableaux de gauche et de droite, et que les tailles de cellule sont toutes les mêmes. Ensuite, si vous extrayez la valeur RVB (= couleur) du point rouge dans l'image et la convertissez en données de degré de congestion, vous obtiendrez les données souhaitées.

Conclusion

J'ai pu l'implémenter comme ça https://github.com/Kanahiro/sapporo_subway_analyze/

Sortie CSV comme ceci スクリーンショット 2020-03-18 22.07.30.png

Vous pouvez voir que la partie rouge est 4, la partie blanche est 0 et la partie bleue est 2. Maintenant, suivons les étapes de lecture du PDF → conversion en image → obtention de la couleur du pixel spécifié → génération des données de degré de congestion de la cellule à partir de la couleur → conversion en un fichier CSV.

Convertir du PDF en image

Référence: Résumé du traitement PDF de Python (combinaison / division, conversion d'image, libération de mot de passe)

Utilisez pdf2image. Consultez l'article ci-dessus pour savoir comment l'utiliser. Dans l'article, il est dit pip install poppler, mais actuellement, il ne peut pas être installé avec pip. Pour Linux: L'explication des autres systèmes d'exploitation est omise.

sudo apt install poppler-utils

Obtenez la valeur RVB du pixel spécifié à partir de l'image

Les données lues par pdf2image peuvent être converties en tableau numpy. En d'autres termes, le tableau RVB est inséré dans le tableau bidimensionnel qui correspond à la structure de pixels pour former un tableau tridimensionnel.

#convert_from_le chemin est une fonction de pdf2image
pdf_images = convert_from_path(pdffile)
img_array = np.asarray(pdf_images[0])
'''
img_échantillon de tableau

[[[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

(Omis)

 ...

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]]

Les bords du PDF sont blancs, donc c'est naturel, mais [255 255 255], c'est-à-dire tout est blanc. J'ai pu le stocker dans un tableau en unités de pixels.

Accès à un pixel spécifique (data_of_pixel)


x = START_CELL[0] + c * CELL_SIZE[0] #coordonnée x
y = START_CELL[1] + r * CELL_SIZE[1] #coordonnée y
data_of_pixel = img_array[y][x]

Ce sera. Vous pouvez maintenant obtenir la valeur RVB d'une partie spécifique de l'image convertie en PDF.

Jugement de congestion

À partir de l'image ci-dessus, vous pouvez voir que la congestion est plus élevée dans l'ordre du blanc, du bleu clair, du bleu, du jaune et du rouge. Cependant, dans la zone de légende et de données en haut à droite, le PDF a été terminé avec des valeurs RVB légèrement différentes. Heureusement, il y a une grande différence de couleur d'une étape à l'autre, je voudrais donc juger ici par la taille de la différence de valeurs RVB entre la légende et les cellules dans la zone de données.

#Valeur RVB de la légende de la congestion
CROWD_RGBs = [
    [255, 255, 255],
    [112, 200, 241],
    [57, 83, 164],
    [246, 235, 20],
    [237, 32, 36]
]

def rgb_to_type(rgb_list)->int:
    #Seuil de différence de couleur
    threshold = 50
    color_array = np.asarray(rgb_list)
    for i in range(len(CROWD_RGBs)):
        crowd_rgb_array = np.asarray(CROWD_RGBs[i])
        color_dist = abs(color_array - crowd_rgb_array)
        sum_dist = color_dist.sum()
        if sum_dist < threshold:
            return i #0 -4 Combien de monde

La transmission d'une liste de valeurs RVB à cette fonction renverra le degré de congestion sous forme de valeur entière de 0 à 4. Ce que nous faisons, c'est comparer la valeur RVB du pixel que nous avons obtenu plus tôt avec la valeur RVB de la légende de congestion. La somme des valeurs absolues des différences entre les valeurs RVB est définie comme la différence de couleur, et si la différence est dans les 50, le degré de congestion est déterminé.

Avec cela, le degré de congestion de toutes les cellules est évalué, et s'il est converti en CSV, les données CSV au début sont terminées.

À la fin

Ce type de traitement est une certaine histoire dans le domaine des données ouvertes. Certaines personnes ont dit qu'elles feraient du riz avec des gâteaux de riz, mais est-ce que je peux me qualifier d'alchimiste? Cependant, après tout, le riz ne peut pas être fondu sans données primaires (mochi), donc je suis seulement reconnaissant pour cela, merci toujours. Puisque la quantité de données a augmenté, je me demande si la prochaine étape sera la qualité de ces données ...

Recommended Posts

Histoire de l'analyse d'image du fichier PDF et de l'extraction de données
Nettoyage des données 3 Utilisation d'OpenCV et prétraitement des données d'image
Analyse des données financières par pandas et leur visualisation (2)
Analyse des données financières par pandas et leur visualisation (1)
Analyse des données de mesure (2) -Hydrobacter et raccord, recommandation lmfit-
Application de Python: Nettoyage des données Partie 3: Utilisation d'OpenCV et prétraitement des données d'image
Fichier PDF de gestion des données de l'état d'émission de ma carte numérique
Début de l'analyse de l'encyclopédie Nico Nico ~ Appuyez sur les données fournies par JSON
Livres et sources recommandés de programmation d'analyse de données (Python ou R)
L'histoire de Python et l'histoire de NaN
Pratique de l'analyse de données par Python et pandas (Tokyo COVID-19 data edition)
L'histoire du "trou" dans le fichier
10 sélections d'extraction de données par pandas.DataFrame.query
Recommandation d'analyse des données à l'aide de MessagePack
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Traitement des données 2 Analyse de divers formats de données
Imaginez le fichier pdf et tamponnez toutes les pages avec des tampons (images) confidentiels.
Résumé des distributions de probabilité qui apparaissent souvent dans les statistiques et l'analyse des données
Visualisation et analyse des informations de localisation des données Twitter Stava
Traitement des données 1 Formatage des données et entrée / sortie de fichier
Extraction de tweet.js (json.loads et eval) (Python)
Séparation de la conception et des données dans matplotlib
L'histoire d'essayer deep3d et de perdre
Analyse d'image de microtomographie à rayons X par Python
[Classification des images] Analyse faciale du chien
[Python] De l'analyse morphologique des données CSV à la sortie CSV et à l'affichage graphique [GiNZA]
L'analyse d'image a été facile à l'aide des données et de l'API fournies par Microsoft COCO
Pratique de création d'une plateforme d'analyse de données avec BigQuery et Cloud DataFlow (traitement de données)
Générer et publier des données d'image factice avec Django
Lire les données de la table dans un fichier PDF avec Python
Traitement d'image? L'histoire du démarrage de Python pour
Lissage des séries temporelles et des données de forme d'onde 3 méthodes (lissage)
L'histoire de la lecture des données HSPICE en Python
Traitement et jugement de la collecte du plan d'analyse des données (partie 1)
Analyse émotionnelle des données de tweet à grande échelle par NLTK
J'ai essayé l'analyse morphologique et la vectorisation de mots
Environnement enregistré pour l'analyse des données avec Python
[Petite histoire] Téléchargez l'image de Ghibli immédiatement
Trier les données Fashion-MNIST et les enregistrer au format PNG
Traitement et jugement de la collecte du plan d'analyse des données (partie 2)
Histoire de l'analyse de données par apprentissage automatique
Obtenez une grande quantité de données Twitter de Starba avec python et essayez l'analyse de données Partie 1
Data wrangling (pdfplumber) PDF sur l'épidémie de grippe par le ministère de la Santé, du Travail et du Bien-être social
Une histoire sur l'amélioration du programme pour le remplissage partiel des données d'image binarisées 3D
[Dernière méthode] Visualisation des données de séries chronologiques et extraction de modèles fréquents à l'aide du profil Pan-Matrix
Data Langling PDF sur l'épidémie de grippe par le ministère de la Santé, du Travail et du Bien-être social
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 4: Extraction de fonctionnalités de données à l'aide de T-SQL
Une histoire sur la tentative de contribuer à l'analyse COVID-19 avec l'offre gratuite d'AWS et l'échec
[Mémo du débutant Python] Importance et méthode de confirmation de la valeur manquante NaN avant l'analyse des données