[PYTHON] OpenCV mit dem Ziel einer anständigen Strichzeichnung

</ i> Übersicht

Nehmen Sie eine Strichzeichnung aus einem Farbbild. Eine Strichzeichnung ist ein monochromes Bild, das (wahrscheinlich) nicht binärisiert ist. Wenn ich über die Verwendung von OpenCV nachdenke, lese ich es in Graustufen → Ich habe mir eine Binärisierung mit "adaptiveThreshold" ausgedacht, aber es ist nicht sehr gut. Lassen Sie uns also überprüfen, wie die Kommentare zum Thema erstellt werden.

</ i> Referenz

  • [Anfänger hat versucht, Strichzeichnungen mit Chainer zu färben. Ich konnte es schaffen. - Qiita Kommentar] Ich konnte ohne das vorausgesetzte Wissen nicht verstehen
  • [miztis Tweet: "Es ist jetzt möglich, Strichzeichnungen sauber zu extrahieren, wobei das Extrahieren von" Konturkonturen "vermieden wird, die häufig beim Extrahieren von Konturen in Abbildungen auftreten! (1. Blatt: Original, 2. Blatt: normale Konturextraktion, 3. Blatt: diese Methode) https://t.co/XJetLxsIc7 "] ich habe mich gewundert
  • [Pixelexpansionsverarbeitung (Dilatation) und Kontraktionsverarbeitung (Erosion) (mit ein wenig Erklärung) in Python OpenCV3 - von umentu import dumm] Es wurde gespeichert, weil es die Erweiterung des Bildes sein sollte. 8 Ausleihe der Nachbarschaftsdefinition

</ i> Code


# -*- coding: utf-8 -*-
"""
Created on Fri Jan 27 11:30:12 2017

@author: khsk
"""

import numpy as np
import cv2 as c
import glob
import os

#8 Definition der Nachbarschaft
neiborhood8 = np.array([[1, 1, 1],
                            [1, 1, 1],
                            [1, 1, 1]],
                            np.uint8)

for path in glob.glob('./images/eupho/*'):
    if (os.path.basename(path) == 'Thumbs.db'):
        continue
    img = c.imread(path, 0) #Farbe ohne 0
    img_dilate = c.dilate(img, neiborhood8, iterations=1)
    img_diff = c.absdiff(img, img_dilate)
    img_diff_not = c.bitwise_not(img_diff)
    #gray = c.cvtColor(img_diff_not, c.COLOR_RGB2GRAY)
    
    #at = c.adaptiveThreshold(img_diff_not, 255, c.ADAPTIVE_THRESH_GAUSSIAN_C, c.THRESH_BINARY, 7, 8) #Passen Sie int gut an
    c.imwrite(os.path.dirname(path) + '_clean_senga_color_gray/' + os.path.basename(path), img_diff_not)
    
c.imshow('test',img)
c.imshow('test2',img_dilate)
c.imshow('test3',img_diff)
c.imshow('test4',img_diff_not)
c.waitKey(10000)

c.destroyAllWindows()

Grundcode. Kommentieren Sie aus, ändern Sie Variablen und spielen Sie mit int-Werten. Es scheint eine Erweiterung von ungefähr 4 zu geben, aber wenn Sie es klarer machen wollen, dachte ich, dass es ungefähr 8 weitere sein könnten. Sofern nicht anders angegeben, erfolgt der Messwert jedoch in Graustufen.

</ i> Originalbild

still_01.jpg

Ich erinnere mich, dass ich Namen wie Euphonium in meinen Forschungen zum maschinellen Lernen gesehen habe, aber ich habe die Details vergessen. Ist es ideal für maschinelles Lernen? Machst du es damit? Es hat nichts mit Strichzeichnung zu tun. Wahrscheinlich.

</ i> Binarisierung

Nur "adaptiveThreshold"

still_01.jpg

Die Linien klappern und das ist besser, aber manchmal gibt es schwarze Flecken wie Staub

</ i> 1 Erweiterung

still_01.jpg

Ich war überrascht, weil es zu schön war. Apropos besorgniserregend, es gibt Schatten und es erscheinen oft schwache Linien.

hibikeyufoirasuto01002.jpg

</ i> 3,5-fache Erweiterung

still_01.jpg

still_01.jpg

Ich habe die Anzahl der Erweiterungen erhöht, sodass, wenn der Unterschied dicker wird, sogar eine dünne Linie deutlich erscheint. Das Gefühl der Fremdheit breitet sich aus, indem die dunklen Linien dicker werden. Es kann immer noch gut sein, wenn es zweimal ist.

</ i> Farbunterschied → Graustufen

still_01.jpg

still_01.jpg

Da der Referenz-Tweet am Ende grau skaliert war, habe ich versucht, die erste Lesung in Farbe zu verarbeiten. (1 Erweiterung) Ich denke, es geht um einen Fehler. Die farbige Strichzeichnung hat einen Geschmack.

</ i> Nach einer Erweiterung Binarisierung

still_01.jpg

Es ist eine schöne Strichzeichnung, aber ich dachte, es sei nicht binär, also habe ich es am Ende binär gemacht. Es scheint, dass die Informationsmenge durch die Binärisierung reduziert wurde.

</ i> 1 Erweiterung nach der Binärisierung

still_01.jpg

Bis zu diesem Punkt habe ich festgestellt, dass die Erweiterung auf das binärisierte Bild angewendet zu werden scheint. Befolgen Sie daher die Anweisungen zum Lesen → Binärisierung → Erweiterung → Differenz. Der Unterschied kann nicht mehr in Worten ausgedrückt werden.

</ i> Ende

Ich denke, es war anständig. Ich weiß nicht, was eine "gute Strichzeichnung" überhaupt ist.

Ich habe darüber nachgedacht, einen Datensatz zu erstellen, aber ich möchte Daten für maschinelles Lernen mit maschinellem Lernen erstellen. Das Zeichnen von groben Linien wurde bereits untersucht, sodass mehrdeutige Linien ergänzt werden können.

Ich bin also nicht in das maschinelle Lernen eingestiegen, aber als ich mich fragte, ob die Datenaufbereitung einen Schritt nach vorne gemacht hatte weil das trainierte Modell zu einem Webdienst gemacht wurde, anstatt veröffentlicht zu werden, ist es definitiv besser, hier zu spielen. angenehm.

QFW455OLKMO3EC3E1OSRTD4T8ID75DNV_0.jpg

Die Haarfarbe passt super.

[Pixelexpansionsverarbeitung (Dilatation) und Kontraktionsverarbeitung (Erosion) mit Python OpenCV3 (eine kleine Erklärung) - von umentu import dumm]: https://www.blog.umentu.work/python-opencv3%E3%81%A7 % E7% 94% BB% E7% B4% A0% E3% 81% AE% E8% 86% A8% E5% BC% B5% E5% 87% A6% E7% 90% 86Dilatation% E3% 81% A8% E5 % 8F% 8E% E7% B8% AE% E5% 87% A6% E7% 90% 86erosion-% E3% 81% A1% E3% 82% 87% E3% 81% A3% E3% 81% A8% E8% A7% A3 /