[PYTHON] Détecter les points de mosaïque dans l'image

(Ajouté le 24 mai 2017) J'ai enregistré le code sur github. C'est le même que celui décrit sur cette page. https://github.com/summer4an/mosaic_detector

supposition

https://twitter.com/stsiizk/status/858517661889646592 cette? Peut-être que c'est ... J'ai donc décidé de me préparer (?) Pour le jour à venir.

Il existe plusieurs types de mosaïques, mais cette fois nous nous concentrerons sur un grand nombre de boîtes peintes d'une seule couleur.

J'ai essayé google, mais tout était question de traitement de la mosaïque, et je n'ai pas trouvé de moyen de détecter la partie de la mosaïque, alors je l'ai fait moi-même.

Le but est de détecter la partie mosaïque de l'image et de la peindre en blanc.

J'ai utilisé python3.5.2 et OpenCV3.2.0.

politique

Après avoir créé un code avec un logiciel de traitement d'image et python et fait des essais et des erreurs, la procédure suivante a donné des résultats satisfaisants.

  1. Conversion en échelle de gris
  2. Détection des bords avec Canny
  3. Inversion noir et blanc
  4. Brouiller un peu
  5. Correspondance de motifs pour les images de grille de différentes tailles
  6. Remplissez la zone correspondante

La raison du flou un peu avec 4 est que, à la suite de 3, la ligne de bordure de la boîte n'est pas devenue une ligne droite d'une largeur de 1 pixel, mais elle est devenue quelque chose qui allait et venait entre les largeurs de 2 pixels, il était donc difficile de faire correspondre le motif. Ceci est dû au fait La raison de l'utilisation d'images de grille de différentes tailles dans 5 est que la correspondance de motifs est vulnérable à la mise à l'échelle. J'ai utilisé une image quadrillée de 11 à 20 pixels carrés, ce qui semble être courant.

code

Tout d'abord, créez une image de grille pour la correspondance des motifs de chaque taille ci-dessous.

python


#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Générez un fichier d'image de motif lorsque la taille de la mosaïque est comprise entre 11 et 20.
#Les matériaux de référence suivants.
#  http://qiita.com/suto3/items/5181b4a3b9ebc206f579

from PIL import Image

def make_image(masksize, filename):
    picturesize = 2+masksize+masksize-1+2
    screen = (picturesize, picturesize)

    img = Image.new('RGB', screen, (0xff,0xff,0xff))

    pix = img.load()

    for i in range(2,picturesize,masksize-1):
        for j in range(2,picturesize,masksize-1):
            for k in range(0,picturesize):
                pix[i, k] = (0,0,0)
                pix[k, j] = (0,0,0)

    img.save(filename)
    return

for i in range(11, 20+1):
    make_image(i, "pattern"+str(i)+"x"+str(i)+".png ")

Si vous l'exécutez, vous pouvez obtenir 10 images comme celle-ci. pattern11x11.png pattern20x20.png

La détection suivante est effectuée à l'aide de cette image de grille.

python


#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Détectez la partie de la mosaïque et peignez-la en blanc.
#Les matériaux de référence suivants.
#・ Correspondance des modèles
#    http://docs.opencv.org/3.2.0/d4/dc6/tutorial_py_template_matching.html
#    http://opencv.jp/cookbook/opencv_img.html#id32

import cv2
import numpy as np

import sys
args = sys.argv

if len(args) != 2:
    print("too few argument.")
    sys.exit(1)

img_rgb = cv2.imread(args[1])

img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) #Vers l'échelle de gris
img_gray = cv2.Canny(img_gray,10,20) #Détection des bords
img_gray = 255-img_gray #Inversion noir et blanc
img_gray = cv2.GaussianBlur(img_gray,(3,3),0) #Flouter un peu

cv2.imwrite('output_gray.png', img_gray)

for i in range(11,20+1):
    pattern_filename = "pattern"+str(i)+"x"+str(i)+".png "
    template = cv2.imread(pattern_filename, 0)
    w, h = template.shape[::-1]

    img_kensyutu_kekka = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
    threshold = 0.3
    loc = np.where(img_kensyutu_kekka >= threshold)
    for pt in zip(*loc[::-1]):
        #cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (255,255,255), 1)
        cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (255,255,255), -1)
    cv2.imwrite('output_progress_'+str(i)+'.png', img_rgb)

cv2.imwrite('output_result.png', img_rgb)

cv2.imshow('window1', img_rgb)
cv2.imshow('window2', img_gray)
cv2.waitKey(0)

cv2.destroyAllWindows()

résultat

Traitez les images avec des mosaïques de différentes tailles ci-dessous. 000_pic8_many_mozaic.jpg L'image provient de http://gahag.net/011032-cat-sunflower-smell/.

Le résultat est ci-dessous. output_result.png

J'ai pu remplir toutes les zones où la mosaïque a été appliquée. Les parties supplémentaires sont également remplies, mais elles seront quand même complétées, donc ce sera OK.

Je suis également satisfait des résultats des autres images.

Matériel de référence

Recommended Posts

Détecter les points de mosaïque dans l'image
Détecter les dossiers avec la même image dans ImageHash
Dans la commande python, python pointe vers python3.8
Qu'est-ce que wheezy dans l'image Docker Python?
Déterminer s'il y a des oiseaux dans l'image
Déterminez les nombres dans l'image prise avec la webcam
J'ai essayé de détecter l'iris à partir de l'image de la caméra
[Python] Obtenez les nombres dans l'image graphique avec OCR
Convertissez l'image au format .zip en PDF avec Python
Format d'image en Python
Essayez de charger l'image dans un thread séparé (OpenCV-Python)
Téléchargeur d'images avec Flask
Python Open CV a essayé d'afficher l'image sous forme de texte.
Trouvez l'écart moyen / standard des valeurs de luminosité dans l'image
J'ai écrit un script qui divise l'image en deux
Trouver des erreurs en Python
Point selon l'image
Supprimer le cadre de l'image
Pipenv Simplement les points principaux
Tweet avec image en Python
Méthodes disponibles dans la liste
Collection de traitement d'image en Python
Mémo d'ajout d'image dans reportlab
Détecter les frappes en python (tty)
L'image est Namekuji
pyenv Simplement les points principaux
[Python] Résolution du problème d'importation dû à la différence des points d'entrée
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV