Heim >Backend-Entwicklung >Python-Tutorial >Erstellen eines einfachen Pointillismus-Gemäldes mit OpenCv.

Erstellen eines einfachen Pointillismus-Gemäldes mit OpenCv.

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-28 00:51:19966Durchsuche

Einführung
Die Open Source Computer Vision Library (OpenCV) bietet frei verfügbare Programmiertools für die Verarbeitung visueller Eingaben wie Bilder oder Videodateien. Es enthält viele vorgefertigte Funktionen, auf die über verschiedene Programmiersprachen zugegriffen werden kann. Das Beispiel, das ich hier gepostet habe, verwendet Python. Wenn Sie den Code verstehen möchten, benötigen Sie daher mindestens Grundkenntnisse in Python und NumPy. Wenn Sie nach einer Einführung in OpenCV suchen, könnte dieser Link sehr wertvoll sein: [https://dev.to/arpitmandliya/opencv-python-tutorial-3dac].

Wie Pixel ein Bild ergeben
In den meisten Fällen basiert ein Computerbild auf dem RGB-Modell (BGR in Opencv). Dies bedeutet, dass die Pixelfarbe eine Mischung aus den Komponenten Red, Green und Blue ist. Es gibt auch andere Modelle (z. B. Hue, Saturation und Value) und Vektorgrafiken (SVG oder PDF), aber ich werde sie nicht erklären sie hier.

Ein Bild auf einem Computer kann als eine Ansammlung von Pixeln dargestellt werden, die Farbinformationen enthalten. Technisch gesehen ist ein Bild ein dreidimensionales Array (oder eine Pixelmatrix mit drei Farbkanälen), wobei die ersten beiden Dimensionen die Größe (Höhe und Breite) des Bildes bestimmen und die dritte Dimension die Werte für Rot und Grün enthält und Blau (jede Farbe mit Werten zwischen 0 und 255). Wenn ein Bild nur einen Farbkanal hat (8-Bit-Bild), handelt es sich um ein Graustufenbild mit unterschiedlichen Grauwerten im Bereich von 0 (Schwarz) bis 255 (Weiß). Abbildung 1 verdeutlicht das.

Making a simple pointillism painting using OpenCv.
Abbildung 1: Bilder werden als Arrays dargestellt. Rechts sehen Sie ein Beispiel für ein Farbbild, bei dem die Werte für Rot, Grün und Blau zwischen 0 und 255 liegen (0,0,255 ist Blau). Links ist ein Graustufenbild mit einem einzelnen Kanal, der verschiedene Grautöne darstellt.

Farbinformationen in Punkte unterschiedlicher Größe umwandeln
Die oben besprochenen Prinzipien können zur Bildbearbeitung in Python mithilfe der NumPy- und OpenCV-Bibliotheken angewendet werden. In diesem Beispiel verwende ich Schleifen, um ein Bild zu verarbeiten, das als NumPy-Array dargestellt wird. Die Schleife durchläuft nicht jedes Pixel im Bild, sondern überspringt Pixel in regelmäßigen Abständen (z. B. verarbeitet sie jedes 10. Pixel). Der Graustufenwert an jedem verarbeiteten Pixel wird verwendet, um die Größe eines Punkts zu bestimmen (z. B. entspricht ein Graustufenwert von 100 einer bestimmten Punktgröße). Diese Punkte werden dann auf einer leeren Kopie des Originalbilds gezeichnet, wobei die Farbinformationen des Originalbilds verwendet werden. Zusammenfassend erstelle ich eine Bildkopie, in der Punkte unterschiedlicher Größe basierend auf den Farbinformationen der Originalpixel gezeichnet werden (siehe Abbildung 2).

Making a simple pointillism painting using OpenCv.
Abbildung 2: Zum Zeichnen eines Punktes werden die Farbinformationen eines Pixels im Originalbild verwendet. Um die Größe des Punkts zu bestimmen, wird die Graustufenversion des Originalbilds verwendet.

Unten finden Sie den Code und ein mögliches Ergebnis ist in Abbildung 3.
dargestellt

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)

Making a simple pointillism painting using OpenCv.
Abbildung 3: Auf der rechten Seite wird das Originalbild und auf der linken Seite eine gepunktete Version angezeigt, die auf dem hier dargestellten Code basiert.

Ich hoffe, dass ich den Code umfassend präsentiert habe und dass jemand ihn nützlich finden könnte. Spielen Sie damit herum, wenn Sie möchten. Ersetzen Sie die Kreise durch Rechtecke, wählen Sie unterschiedliche Kreisgrößen aus, ändern Sie die Werte in der Schrittweite der Schleifen usw. und sehen Sie, was passiert.

Das obige ist der detaillierte Inhalt vonErstellen eines einfachen Pointillismus-Gemäldes mit OpenCv.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn