Présentation
La bibliothèque Open Source Computer Vision (OpenCV) propose des outils de programmation disponibles gratuitement pour gérer les entrées visuelles telles que des images ou des fichiers vidéo. Il contient de nombreuses fonctions prêtes à l’emploi, accessibles via différents langages de programmation. L'exemple que j'ai posté ici utilise python. Par conséquent, si vous souhaitez comprendre le code, vous avez besoin au moins d’une connaissance de base de Python et de NumPy. Si vous recherchez une introduction à OpenCV, ce lien peut être très utile : [https://dev.to/arpitmandliya/opencv-python-tutorial-3dac].
Comment les pixels créent une image
Dans la plupart des cas, une image informatique est basée sur le modèle RVB (BGR dans Opencv). Cela signifie que la couleur des pixels est un mélange des composants Red, Green et Blue. Il existe également d'autres modèles (par exemple, Hue, Saturation et Value) et des graphiques vectoriels (SVG ou PDF) mais je ne les expliquerai pas les ici.
Une image sur un ordinateur peut être représentée comme une collection de pixels contenant des informations de couleur. En termes plus techniques, une image est un tableau tridimensionnel (ou une matrice de pixels avec trois canaux de couleur) dont les deux premières dimensions déterminent la taille (hauteur et largeur) de l'image et la troisième dimension contient les valeurs du rouge, du vert. et bleu (chaque couleur avec des valeurs comprises entre 0 et 255) . Si une image n'a qu'un seul canal de couleur (image 8 bits), il s'agit d'une image en échelle de gris avec différentes valeurs de gris allant de 0 (noir) à 255 (blanc). Figure 1 illustre cela.
Figure 1 : Les images sont représentées sous forme de tableaux. Sur la droite se trouve un exemple d'image couleur, où les valeurs du rouge, du vert et du bleu vont de 0 à 255 (0,0,255 est le bleu). Sur la gauche se trouve une image en niveaux de gris avec un seul canal représentant différentes nuances de gris.
Transformer les informations de couleur en points de différentes tailles
Les principes discutés ci-dessus peuvent être appliqués pour effectuer l'édition d'images en Python à l'aide des bibliothèques NumPy et OpenCV. Dans cet exemple, j'utilise des boucles pour traiter une image représentée sous forme de tableau NumPy. La boucle ne parcourt pas chaque pixel de l'image mais saute des pixels à intervalles réguliers (par exemple, elle traite tous les 10 pixels). La valeur d'échelle de gris de chaque pixel traité est utilisée pour déterminer la taille d'un point (par exemple, une valeur d'échelle de gris de 100 correspond à une taille de point spécifique). Ces points sont ensuite dessinés sur une copie vide de l'image originale, en utilisant les informations de couleur de l'image originale. En résumé, je crée une copie d'image où des points de différentes tailles sont dessinés en fonction des informations de couleur des pixels d'origine (voir Figure 2).
Figure 2 : Pour dessiner un point, les informations de couleur d'un pixel de l'image originale sont utilisées. Pour déterminer la taille du point, la version en niveaux de gris de l'image originale est utilisée.
Vous trouverez ci-dessous le code et un résultat possible est présenté dans la Figure 3.
import numpy as np import cv2 # load an image; image has to be in working directory when giving no path information img = cv2.imread('FlowerPower.jpg',cv2.IMREAD_UNCHANGED) # show the dimensions of the image array print(img.shape) # choose a resizing factor for the whole image; to depict it on computer screen resizing = .2 #convert original image to greyscale image img_grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # make a copy of the orignal image img_output = img.copy() # make a white canvas by assigning the color white (255,255, 255) to each pixel # [:,:] covers all values of the first and second array dimension img_output[:,:] = [255,255,255] # or with black [0,0,0] or any other color # Settings for looping over the image step_width = 40 # steps of loop; here: every 30th pixel # - 1 fills circle that is drawn onto output image; positive value define # line thickness of circle thickness = -1 perc = .2 # size factor for drawing circles/dots onto output image # for loops running over the first two dimensions of the array (width and height) # step_width defines which pixels are included for i in range(2, img.shape[0] - step_width, step_width): for u in range(2, img.shape[1] - step_width, step_width): # radius (dot size) is based on the value of greyscale version of original image # at the current index; e.g., pixel at i = 10, u = 30 might have 123 # perc variable modifies dot size radius = int((255-img_grey[i,u])*perc) +1 if radius <= 0: radius +=1 # take color from pixel at position [i,u] of original image # e.g., i = 10, u = 30 might have [123,0,61] color = img[i,u].astype(int).tolist() # draw a circle on output image using dot size based on greyscale # value with color of original image cv2.circle(img_output, (u,i), radius, color, thickness) # resize images, so they are not too big for computerscreen # based on the resizing variable defined at the top of the page img_size = img.shape img_sm = cv2.resize(img,(int(img_size[1]*resizing), int(img_size[0] * resizing)), interpolation = cv2.INTER_CUBIC) # open window that shows original image cv2.imshow("Original", img_sm) img_output_sm = cv2.resize(img_output,(int(img_size[1]*resizing), int(img_size[0]* resizing)), interpolation = cv2.INTER_CUBIC) # show the dotted image cv2.imshow("Dotted Image", img_output_sm)
Figure 3 : Sur le côté droit, l'image originale est affichée et sur le côté gauche, une version en pointillés basée sur le code présenté ici est affichée.
J'espère avoir présenté le code de manière complète et que quelqu'un pourrait le trouver utile. Jouez avec, si vous le souhaitez. Remplacez les cercles par des rectangles, sélectionnez différentes tailles de cercles, modifiez les valeurs de largeur de pas des boucles, etc. et voyez ce qui se passe.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!