Dessin avec Matrix-Reinventor of Python Image Processing-

Une histoire sur le traitement d'image et le dessin par juste calcul matriciel sans compter sur la bibliothèque de traitement d'image. Également possible avec Pythonista

** Cliquez ici pour les informations de base **

Qu'est-ce qu'un «réinventeur»?

Au lieu de m'appuyer sur Open CV ou Pillow, j'écrirai en fait divers traitements d'images en utilisant numpy et matplotlib. C'est une combinaison qui peut également être utilisée avec l'application iOS Pythonista.

import numpy as np
import matplotlib.pyplot as plt

De plus, les fonctions suivantes sont pratiques pour afficher des images. (Pour plus de détails, Basics)

def img_show(img : np.ndarray, cmap = 'gray', vmin = 0, vmax = 255, interpolation = 'none') -> None:
    '''np.Afficher une image avec un tableau comme argument.'''
    
    #Définissez dtype sur uint8
    img = np.clip(img,vmin,vmax).astype(np.uint8)
    
    #Afficher l'image
    plt.imshow(img, cmap = cmap, vmin = vmin, vmax = vmax, interpolation = interpolation)
    plt.show()
    plt.close()

Dessin

Pour dessiner une figure, utilisez msgid pour obtenir les coordonnées sur l'image.

x, y = np.mgrid[:100,:100]

Notez que la direction positive de $ x $ est vers le bas et la direction positive de $ y $ est correcte.

Dessinez un rectangle

(2\times|x-x_0|

x, y = np.mgrid[:100,:100]
x_0, y_0 = (50, 60) #Point central
x_size, y_size = (10, 20) #La taille du rectangle

#Dessinez un rectangle
rect = ((2*abs(x - x_0) < x_size) & (2*abs(y - y_0) < y_size)).astype(np.uint8)
img_show(rect*255)

rect.png

Dessiner une ellipse

$ \ frac {(x-x_0) ^ 2} {a ^ 2} + \ frac {(y-y_0) ^ 2} {b ^ 2} --1 <0 $ est utilisé.


x, y = np.mgrid[:100,:100]
x_0, y_0 = (20, 40) #Point central
a, b = (5, 10)
ellipse = ((x - x_0)**2/a**2 + (y - y_0)**2/b**2 - 1<0).astype(np.uint8)

img_show(ellipse*255)

ellipse.png

Dessin en ligne droite par l'algorithme de Bresenham (pseudo)

Lien de référence

J'ai essayé d'utiliser la fonction d'erreur de l'algorithme de Bresenham.

Supposons que vous vouliez tracer une ligne droite M: $ ax + by + c = 0 $. Si vous définissez la condition $ a \ geq -b \ geq 0, a> 0 $, vous pouvez dessiner un point pour chaque colonne et approcher la ligne droite M. En d'autres termes, pour chaque $ y $, il suffit de choisir un $ x $ suffisamment proche de M.

Soit A: $ (x_1, y_1) $ le point central d'un pixel Considérant le point B: $ \ left (- \ frac {b} {a} y- \ frac {c} {a}, y_1 \ right) $ sur M où les coordonnées $ y $ correspondent, pour ce point A La différence entre les coordonnées $ x $ $ e $ est $ - \ frac {b} {a} y_1- \ frac {c} {a} -x_1 $. Ensuite, la condition qu'il soit suffisamment proche de M peut s'écrire $ 0,5 \ leq e <0,5 $. Parce que le même point A et le même point B sont dans le même pixel.

x,y = np.mgrid[:5,:5]
a,b,c = 2,-1,-1
e = -(b/a)*y-c/a-x

#array([[ 0.5,  1. ,  1.5,  2. ,  2.5],
#       [-0.5,  0. ,  0.5,  1. ,  1.5],
#       [-1.5, -1. , -0.5,  0. ,  0.5],
#       [-2.5, -2. , -1.5, -1. , -0.5],
#       [-3.5, -3. , -2.5, -2. , -1.5]])

line = ((-0.5<=e)&(e<0.5)).astype(np.uint8)

#array([[0, 0, 0, 0, 0],
#       [1, 1, 0, 0, 0],
#       [0, 0, 1, 1, 0],
#       [0, 0, 0, 0, 1],
#       [0, 0, 0, 0, 0]], dtype=uint8)
img_show(line*255)

line_float.png

Si vous n'aimez pas les types à virgule flottante, multipliez $ e $ par $ 2a $. La condition qu'il soit suffisamment proche de M peut être écrite comme $ -a \ leq e <a $.

x,y = np.mgrid[:20,:20]
a,b,c = 2,-1,-1
e = 2*(-b*y-c-a*x)
line = ((-a<=e)&(e<a)).astype(np.uint8)
img_show(line*255)

line_int.png

Enfin, en supposant que $ a == 0 \ land b == 0 $ n'existe pas et que $ a \ geq -b \ geq 0, a> 0 $ n'est pas pris en compte, l'algorithme suivant est approprié. ..

x,y = np.mgrid[:20,:20]
a,b,c = 13,14,-200
e = 2*(-b*y-c-a*x)
threshold = max(abs(a),abs(b))
line = ((-threshold<=e)&(e<threshold)).astype(np.uint8)
img_show(line*255)

line_cases.png

Les chiffres produits par cet algorithme sont les mêmes que ceux produits par l'algorithme de Bresenham.

Ligne droite avec anti-aliasing (4/5 ajoutés)

Je l'ai fait moi-même. ** Cliquez ici pour plus de détails **

antinalias.png

Ce qui précède dessine $ -3x-7y + 60 = 0 $ sur une figure carrée de 1000 pixels. Ce qui suit est une ligne droite créée par l'algorithme de Bresenham. bresenham.png

Recommended Posts

Dessin avec Matrix-Reinventor of Python Image Processing-
Traitement d'image avec Python
Bases du traitement d'images binarisées par Python
Échelle de gris par matrice-Reinventor of Python image processing-
Traitement d'image avec Python (partie 2)
Traitement d'image avec Python (partie 1)
Traitement d'image avec Python (3)
[Python] Traitement d'image avec scicit-image
Traitement d'image avec la binarisation Python 100 knocks # 3
100 traitement d'image par Python Knock # 2 Échelle de gris
traitement d'image python
Traitement d'image par Python 100 knock # 10 filtre médian
Traitement d'image avec Python et OpenCV [Tone Curve]
Traitement d'image par Python 100 knock # 12 motion filter
Traitez facilement des images en Python avec Pillow
Traitement d'image avec Python 100 knocks # 7 pooling moyen
Traitement d'image léger avec Python x OpenCV
Filtrage par convolution par matrice-Reinventor of Python image processing-
Traitement d'image par Python 100 knock # 9 Filtre Gaussien
Dessin linéaire avec une matrice - Recherche originale par un réinventeur du traitement d'image Python -
Traitement d'image par Python 100 knock # 4 Binarisation Otsu (méthode d'analyse de discrimination)
Traitement d'image avec MyHDL
Premier traitement d'image Python
Dessiner avec Python Tinker
Divers traitements de Python
Traitement d'image avec PIL
Traitement d'image à partir de zéro avec python (5) Transformation de Fourier
Traitement d'image à partir de zéro avec python (4) Extraction de contour
Traitement d'image? L'histoire du démarrage de Python pour
Traitement d'image avec la configuration de l'environnement Python pour Windows
100 coups de traitement du langage avec Python 2015
Extraire le tableau des fichiers image avec OneDrive et Python
Traitement d'image par matrice Basics & Contents-Reinventor of Python image processing-
"Traitement Apple" avec OpenCV3 + Python3
Remarques sur le traitement d'images HDR et RAW avec Python
Édition d'image avec python OpenCV
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
Traitement du signal acoustique avec Python
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
Tri des fichiers image avec Python (2)
Tri des fichiers image avec Python (3)
Traitement parallèle avec Parallel de scikit-learn
Tweet avec image en Python
Tri des fichiers image avec Python
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
Traitement d'image par python (Pillow)
Post-traitement de python (NG)
Collection de traitement d'image en Python
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
[Jouons avec Python] Traitement d'image en monochrome et points
[Python] Lecture facile des fichiers image du numéro de série avec OpenCV
Principes de base du traitement d'image en temps réel avec opencv
Capture d'image de Firefox en utilisant Python
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
100 traitements de langage avec Python
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
Premiers pas avec Python Bases de Python