Wie Sie wissen (oder auch wenn Sie es nicht tun), ist Computer Vision ein sehr leistungsfähiges Werkzeug mit immensen Möglichkeiten. Als ich mich darauf vorbereitete, einen Comic über das College-Leben meines Freundes vorzubereiten, wurde mir schnell klar, dass ich etwas brauchte, das meine Bemühungen, es tatsächlich zu malen, reduzierte, aber die Qualität beibehielt, und ich fand die folgende Lösung.

Lassen Sie uns zuerst das Ergebnis sehen -

Zeichnen eines Bildes mit OpenCV (Python)Original Bild

 

Zeichnen eines Bildes mit OpenCV (Python) 1



Cartoon-Version

1

Aus dem Bild erhaltene Kanten (Ergebnis des adaptiven Schwellenwerts)

Sehen wir uns den Code an:

class Cartoonizer:  
    
        
        
        
    
    def __init__(self):  
        pass
  
    def render(self, img_rgb):  
        img_rgb = cv2.imread(img_rgb)  
        img_rgb = cv2.resize(img_rgb, (1366,768))  
        numDownSamples = 2  
        numBilateralFilters = 50
  
        
  
        
        img_color = img_rgb  
        for _ in range(numDownSamples):  
            img_color = cv2.pyrDown(img_color)  
  
        
        
        
        
        for _ in range(numBilateralFilters):  
            img_color = cv2.bilateralFilter(img_color, 9, 9, 7
  
        
        
        
        for _ in range(numDownSamples):  
            img_color = cv2.pyrUp(img_color)  
        
        
  
        
        
        img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)  
        img_blur = cv2.medianBlur(img_gray, 3
        
        
  
        
        
        img_edge = cv2.adaptiveThreshold(img_blur, 255
                                        cv2.ADAPTIVE_THRESH_MEAN_C,  
                                        cv2.THRESH_BINARY, 9, 2
        
        
  
        
        
        (x,y,z) = img_color.shape  
        img_edge = cv2.resize(img_edge,(y,x))  
        img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB)  
        cv2.imwrite("edge.png",img_edge)  
        
        
        
        
        return cv2.bitwise_and(img_color, img_edge)  
  
tmp_canvas = Cartoonizer()  
  
file_name = "Screenshot.png"
res = tmp_canvas.render(file_name)  
  
cv2.imwrite("Cartoon version.jpg", res)  
cv2.imshow("Cartoon version", res)  
cv2.waitKey(0
cv2.destroyAllWindows()  

Erläuterung:

Grundsätzlich werden wir eine Reihe von Filtern und Bildkonvertierungen verwenden.

  • Zuerst verkleinern wir das Bild und wenden dann einen bilateralen Filter an, um einen Cartoon-Geschmack zu erhalten. Andererseits skalieren wir das Bild hoch.
  • Der nächste Schritt besteht darin, eine unscharfe Version des Originalbilds zu erhalten. Jetzt wollen wir nicht, dass die Farben diesen Prozess stören. Wir wollen nur die Grenzen verwischen. Dazu konvertieren wir zuerst das Bild in Graustufen und wenden dann den Medienunschärfefilter an.
  • Der nächste Schritt besteht darin, die Kanten im Bild zu identifizieren und diese dann zu den zuvor geänderten Bildern hinzuzufügen, um einen Skizzenstifteffekt zu erzielen. Für diesen ersten verwenden wir den adaptiven Schwellenwert. Sie können auch mit anderen Arten von Schwellenwerttechniken experimentieren. Denn beim Computer Vision dreht sich alles ums Experimentieren. In Schritt 5 stellen wir die endgültigen Bilder zusammen, die aus den vorherigen Schritten erhalten wurden.

Einfachere Implementierung -

import cv2 
import numpy as np 
  
img = cv2.imread("koala.jpeg") 
   
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
gray = cv2.medianBlur(gray, 5) 
edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,  
                                         cv2.THRESH_BINARY, 9, 9) 
   
color = cv2.bilateralFilter(img, 9, 250, 250) 
cartoon = cv2.bitwise_and(color, color, mask=edges) 
   
   
cv2.imshow("Image", img) 
cv2.imshow("edges", edges) 
cv2.imshow("Cartoon", cartoon) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Was du tun kannst?
Experiment! Versuchen Sie, die Abwärtsabtastschritte oder die Anzahl der angewendeten bilateralen Filter oder sogar die Größe des Filters oder die Schwellenwerttechnik zu ändern, um die Kanten zu erhalten. Nun eine Sache zu beachten. Dieser Vorgang ist allgemein gehalten und liefert nicht das beste Ergebnis für verschiedene Bilder. Deshalb sollten Sie mit verschiedenen Werten experimentieren, um ein Gefühl für den gesamten Prozess zu bekommen.

Das ist alles von meiner Seite! Auf Wiedersehen!

Über den Autor:

Vishwesh Shrimali ist Maschinenbaustudent bei BITS Pilani. Er erfüllt vishalle Anforderungen, die sein White-Hat-Hacker, Netzwerksicherheitsbetreiber und ein ehemaliger wettbewerbsfähiger Programmierer nicht erfüllen. Als überzeugter Anhänger der Macht von Python war seine Mehrheitsarbeit in derselben Sprache. Immer wenn er etwas Zeit hat, außer zu programmieren, Kurse zu besuchen, CSI Cyber ​​zu schauen, macht er einen langen Spaziergang und spielt schweigend Gitarre. Sein Lebensmotto lautet: "Genieße dein Leben, denn es lohnt sich zu genießen!"

Wenn Sie Ihr Blog auch hier präsentieren möchten, lesen Sie bitte GBlog , um  Gastblogs auf GeeksforGeeks zu schreiben.