[PYTHON] OpenCV vise un dessin au trait décent

</ i> Présentation

Prenez un dessin au trait à partir d'une image couleur. Un dessin au trait est une image monochrome, non binarisée (probablement) Quand je pense à utiliser OpenCV, je l'ai lu en échelle de gris → J'ai trouvé la binarisation avec ʻadaptiveThreshold`, mais ce n'est pas très bon. Alors, vérifions comment les commentaires du sujet sont faits.

</ i> Référence

  • Le débutant a essayé de colorier le dessin au trait avec un chainer. J'ai pu le faire. - Commentaire Qiita Je ne pourrais pas comprendre sans les connaissances préalables
  • [tweet de mizti: "Il est désormais possible d'extraire des dessins au trait proprement, en évitant l'extraction des" contours de contour "qui se produisent souvent lorsque les contours sont extraits dans les illustrations! (1ère feuille: originale, 2ème feuille: extraction de contour normal, 3ème feuille: cette méthode) https://t.co/XJetLxsIc7 "] Je me demandais
  • [Traitement de l'expansion des pixels (dilatation) et traitement de la contraction (érosion) (avec une petite explication) en Python OpenCV3 --from umentu import stupid] Il a été sauvegardé parce que c'était censé être l'expansion de l'image. 8 Emprunt de définition de quartier

</ 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 Définition du quartier
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) #Couleur sans 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) #Ajustez bien int
    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()

Code de base. Commentez, changez les variables et dérangez les valeurs int. Il semble y avoir une expansion d'environ 4, mais si vous voulez être plus clair, j'ai pensé que cela pourrait être environ 8 de plus. Cependant, sauf indication contraire, la lecture est en échelle de gris.

</ i> Image d'origine

still_01.jpg

Je me souviens avoir vu des noms tels que Euphonium dans mes recherches sur l'apprentissage automatique, mais j'ai oublié les détails. Est-ce idéal pour l'apprentissage automatique? Le faites-vous en l'utilisant? Cela n'a rien à voir avec le dessin au trait. Probablement.

</ i> Binarisation

ʻAdaptive Threshold` uniquement

still_01.jpg

Les lignes claquent et c'est mieux, mais parfois il y a des points noirs comme la poussière

</ i> 1 extension

still_01.jpg

J'ai été surpris parce que c'était trop beau. En parlant de points préoccupants, il y a des nuances et des lignes pâles apparaissent souvent.

hibikeyufoirasuto01002.jpg

</ i> Expansion 3,5 fois

still_01.jpg

still_01.jpg

J'ai augmenté le nombre d'extensions de sorte que si la différence devient plus épaisse, même une ligne fine apparaîtra clairement, La sensation d'étrangeté se propage simplement en épaississant les lignes sombres. Cela peut encore être bon si c'est deux fois.

</ i> Différence de couleur → Échelle de gris

still_01.jpg

still_01.jpg

Puisque le tweet de référence était en niveaux de gris à la fin, j'ai essayé de traiter la première lecture en couleur. (1 extension) Je pense que c'est une erreur. Le dessin au trait de couleur a un goût.

</ i> Après une expansion, binarisation

still_01.jpg

C'est un beau dessin au trait, mais je pensais que ce n'était pas binaire, donc je l'ai fait binaire à la fin. On a l'impression que la quantité d'informations a été réduite grâce à la binarisation.

</ i> 1 expansion après binarisation

still_01.jpg

Jusque-là, j'ai remarqué que l'expansion semble être appliquée à l'image binarisée, alors suivez la procédure de lecture → binarisation → expansion → différence. La différence ne peut plus être exprimée en mots.

</ i> Fin

Je pense que ça a été décent. Je ne sais pas ce qu'est un "bon dessin au trait" en premier lieu.

Je pensais créer un jeu de données, mais j'ai envie de créer des données pour l'apprentissage automatique avec l'apprentissage automatique. [Le dessin au trait approximatif a déjà été étudié], donc des lignes ambiguës peuvent être complétées.

Donc, je ne suis pas entré dans l'apprentissage automatique, mais quand je me demandais si la préparation des données avait fait un pas en avant [parce que le modèle entraîné a été transformé en un service Web au lieu d'être publié], il est certainement préférable de jouer ici. agréable.

QFW455OLKMO3EC3E1OSRTD4T8ID75DNV_0.jpg

La couleur des cheveux correspond bien.

[Traitement de l'expansion des pixels (dilatation) et traitement de la contraction (érosion) en Python OpenCV3 (avec une petite explication) - de umentu import stupid]: 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% 86dilation% 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 /