[PYTHON] [Attention] Lors de la création d'une image binaire (1 bit / pixel), faites attention au format de fichier!

introduction

salut! Cette fois, je voudrais parler du format de fichier lors de la création d'une image binaire.

Ici, le cas de la "conversion d'une image en échelle de gris (8 bits / pixel) en une image binaire (1 bit / pixel)" sera expliqué à titre d'exemple.

L'explication est basée sur la conversion d'image en utilisant un oreiller comme exemple, mais cette histoire est due au format de fichier, c'est donc une histoire que vous devez connaître lors de la création d'une image binaire (1 bit / pixel). est.

En revanche, si vous souhaitez enregistrer l'image binaire en 0 (noir) et 255 (blanc), ce sera 8 bits / pixel, donc le format expliqué ici ne répond pas à vos attentes. (Changez l'extension en JPEG etc. et enregistrez.)

Quel format de fichier peut enregistrer une image binaire (1 bit / pixel)?

Il s'agit d'une image binaire dessinée en noir et blanc, mais il est courant de définir 1 pixel (1 pixel) sur 1 bit (0: noir, 1: blanc).

Cependant, selon le format de fichier, 1 pixel (1 pixel) ne peut pas être enregistré en 1 bit (0: noir, 1: blanc) comme l'échelle de gris, et il peut être enregistré en 8 bits (0: noir, 255: blanc). Faire. (JPEG est applicable.)

Par conséquent, si vous souhaitez enregistrer 1 pixel sur 1 bit (0: noir, 1: blanc), vous devez sélectionner un format de fichier compatible. Voici des exemples typiques. png pbm bmp etc

Dans cet exemple, l'oreiller est utilisé, vérifiez donc si le format de fichier est pris en charge par l'oreiller. https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html

Vous pouvez voir que png et bmp sont compatibles avec l'oreiller.

Je ne vais pas l'utiliser cette fois, mais si vous souhaitez utiliser une autre bibliothèque telle qu'openCV, veuillez vérifier à nouveau s'il s'agit d'un format de fichier pris en charge. http://opencv.jp/opencv-2svn/cpp/highgui_reading_and_writing_images_and_video.html?highlight=write#imwrite

Environnement de développement

Windows10 python3.7.7 pillow=7.1.2

"Convertir une image en échelle de gris (8 bits / pixel) en image binaire (1 bit / pixel)"

Montrons en fait le code source. Cette fois, nous convertissons une image en échelle de gris (8 bits / pixel) en une image binaire (1 bit / pixel). Il est également possible de convertir une image en couleur (8 bits / pixel pour chaque RVB) en une image binaire (1 bit / pixel). Dans ce cas, veuillez commenter si inimg.mode == "L":. (N'oublie pas l'autre)

gray2bin.py


import os
import glob

from PIL import Image

if __name__ == "__main__":
    get_dir = os.walk("./input")

    #Obtenez le répertoire actuel
    current_dir = os.getcwd()

    #Obtenir le répertoire d'entrée
    indir = current_dir + "\\input\\"

    #Obtenir le répertoire de sortie
    outdir = current_dir + "\\output_bin\\"

    #Créer s'il n'y a pas de dossier de sortie
    if os.path.isdir(outdir) == False:
        os.mkdir(outdir)

    #Sélectionnez une image dans le répertoire d'entrée
    all_images = glob.glob(indir + "\\*")

    #Traitement pour chaque image
    for img in all_images:

        #Obtenez le nom de l'image de l'image d'entrée (avec l'extension)
        basename = os.path.basename(img)
        print(basename)

        #Séparez l'extension du nom d'image de l'image d'entrée
        name, ext = os.path.splitext(basename)

        #Enregistrer la destination de l'image convertie en image binaire
        save_path = outdir + name + "_bin.png " #pbm ou bmp c'est bien
        #save_path = outdir + name + "_bin.bmp"


        if ext != ".bat" and ext != ".txt":
            with Image.open(img) as inimg:

                # print("inimg mode:",inimg.mode) # inimg mode: RGB

                # L(grayscale)Si vous voulez binariser sans poser de questions, commentez.
                if inimg.mode == "L":

                    conv_image = inimg.convert("1")
                    #print("inimg.mode:", conv_image.mode)

                    conv_image.save(save_path)

                else:
                    print("inimg mode(not L):", inimg.mode)

Résumé

Cette fois, en utilisant comme exemple "Conversion d'une image en niveaux de gris (8 bits / pixel) en image binaire (1 bit / pixel)", Expliqué les points à noter lors de l'enregistrement d'une image binaire (1 bit / pixel).

Les formats de fichiers décrits ici (png / bmp, etc.) ne sont pas typiques, mais pas tous. Nous espérons que vous essaierez divers autres formats de fichiers en fonction de vos besoins.

Si vous avez des commentaires, veuillez nous le faire savoir. (Je veux pouvoir le publier sur github la prochaine fois.)

Recommended Posts

[Attention] Lors de la création d'une image binaire (1 bit / pixel), faites attention au format de fichier!
Soyez prudent lors de la différenciation des vecteurs propres d'une matrice
Diff d'un fichier binaire (fichier image, etc.)
Choses à prendre en compte lors de la création d'un système de recommandation avec Item2Vec
[Mémo Python] Soyez prudent lors de la création d'un tableau à deux dimensions (liste de listes)
Faites attention au type lorsque vous créez un masque d'image avec Numpy
L'histoire de Django créant une bibliothèque qui pourrait être un peu plus utile
Essayez de modifier un peu la vue du fichier de TortoiseHg
Lorsqu'un fichier est placé dans le dossier partagé de Raspberry Pi, le processus est exécuté.
Afficher le résultat de sortie de sklearn.metrics.classification_report sous forme de fichier CSV
Créer une liste lorsque la nomenclature est pour une certaine période de temps