(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
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.
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.
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.
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.
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()
Traitez les images avec des mosaïques de différentes tailles ci-dessous. L'image provient de http://gahag.net/011032-cat-sunflower-smell/.
Le résultat est ci-dessous.
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.
Comment utiliser la bibliothèque d'images http://qiita.com/suto3/items/5181b4a3b9ebc206f579
Template Matching http://docs.opencv.org/3.2.0/d4/dc6/tutorial_py_template_matching.html http://opencv.jp/cookbook/opencv_img.html#id32
Recommended Posts