[PYTHON] Erkennen Sie Mosaikpunkte im Bild

(Hinzugefügt am 24. Mai 2017) Ich habe den Code auf github registriert. Es ist dasselbe wie das auf dieser Seite beschriebene. https://github.com/summer4an/mosaic_detector

Annahme

https://twitter.com/stsiizk/status/858517661889646592 Das? Vielleicht ist das ... Also beschloss ich, mich (?) Auf den kommenden Tag vorzubereiten.

Es gibt mehrere Arten von Mosaiken, aber dieses Mal konzentrieren wir uns auf eine große Anzahl von Kisten, die in einer einzigen Farbe bemalt sind.

Ich habe Google ausprobiert, aber es ging nur um Mosaikverarbeitung, und ich konnte keinen Weg finden, den Mosaikteil zu erkennen, also habe ich es selbst gemacht.

Ziel ist es, den Mosaikteil des Bildes zu erkennen und weiß zu malen.

Ich habe Python3.5.2 und OpenCV3.2.0 verwendet.

Politik

Nach dem Erstellen eines Codes mit Bildverarbeitungssoftware und Python und dem Ausprobieren ergab das folgende Verfahren zufriedenstellende Ergebnisse.

  1. In Graustufen konvertieren
  2. Kantenerkennung mit Canny
  3. Schwarz-Weiß-Inversion
  4. Verwischen Sie ein wenig
  5. Mustervergleich für Rasterbilder verschiedener Größen
  6. Füllen Sie den übereinstimmenden Bereich aus

Der Grund für die leichte Unschärfe mit 4 ist, dass als Ergebnis von 3 die Randlinie der Box keine gerade Linie mit einer Breite von 1 Pixel wurde, sondern etwas, das zwischen den Breiten von 2 Pixeln hin und her ging, so dass es schwierig war, das Muster anzupassen Das ist weil Der Grund für die Verwendung von Rasterbildern verschiedener Größen in 5 ist, dass der Mustervergleich anfällig für Skalierungen ist. Ich habe ein Rasterbild von 11 bis 20 Pixel im Quadrat verwendet, was häufig vorkommt.

Code

Erstellen Sie zunächst ein Rasterbild für den Mustervergleich für jede der folgenden Größen.

python


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

#Generieren Sie eine Musterbilddatei für den Fall, dass die Mosaikgröße zwischen 11 und 20 liegt.
#Die folgenden Referenzmaterialien.
#  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 ")

Wenn Sie es ausführen, können Sie 10 Bilder wie dieses erhalten. pattern11x11.png pattern20x20.png

Die folgende Erkennung wird unter Verwendung dieses Gitterbildes durchgeführt.

python


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

#Erkennen Sie den Teil des Mosaiks und malen Sie ihn weiß.
#Die folgenden Referenzmaterialien.
#・ Vorlagenübereinstimmung
#    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) #Zu Graustufen
img_gray = cv2.Canny(img_gray,10,20) #Kantenerkennung
img_gray = 255-img_gray #Schwarz-Weiß-Inversion
img_gray = cv2.GaussianBlur(img_gray,(3,3),0) #Verwischen Sie ein wenig

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()

Ergebnis

Verarbeiten Sie Bilder mit Mosaiken in verschiedenen Größen. 000_pic8_many_mozaic.jpg Das Bild stammt von http://gahag.net/011032-cat-sunflower-smell/.

Das Ergebnis ist unten. output_result.png

Ich konnte alle Bereiche ausfüllen, in denen das Mosaik angebracht wurde. Die zusätzlichen Teile werden ebenfalls ausgefüllt, aber es wird trotzdem ergänzt, so dass es in Ordnung ist.

Ich bin auch mit den Ergebnissen der anderen Bilder zufrieden.

Referenzmaterial

Recommended Posts

Erkennen Sie Mosaikpunkte im Bild
Erkennen Sie Ordner mit demselben Bild in ImageHash
Im Python-Befehl zeigt Python auf Python3.8
Was ist im Docker Python-Image pfeifend?
Feststellen, ob das Bild Vögel enthält
Bestimmen Sie die Zahlen in dem mit der Webkamera aufgenommenen Bild
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
[Python] Holen Sie sich die Zahlen im Diagramm mit OCR
Konvertieren Sie das Bild in .zip mit Python in PDF
Bildformat in Python
Versuchen Sie, das Bild in einen separaten Thread zu laden (OpenCV-Python).
Bild-Uploader mit Flasche
Python Open CV hat versucht, das Bild im Text anzuzeigen.
Finden Sie den Durchschnitt / die Standardabweichung der Helligkeitswerte im Bild
Ich habe ein Skript geschrieben, das das Bild in zwei Teile teilt
Finde Fehler in Python
Punkt entsprechend dem Bild
Entfernen Sie den Rahmen aus dem Bild
Pipenv Einfach die Hauptpunkte
Tweet mit Bild in Python
In der Liste verfügbare Methoden
Bildverarbeitungssammlung in Python
Bildzusatznotiz in reportlab
Erkennen Sie Tastenanschläge in Python (tty)
Das Bild ist Namekuji
pyenv Einfach die Hauptpunkte
[Python] Lösen des Importproblems aufgrund der unterschiedlichen Einstiegspunkte
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten