Zeichnen eines Bildes mit OpenCV - Python
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 -
Original Bild
Cartoon-Version
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 alle 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.