[PYTHON] Horizontale Linienverarbeitung mit OpenCV-Morphologietransformation

Ich denke, es gibt verschiedene Möglichkeiten, Horizont usw. in der Bildverarbeitung zu verarbeiten. Lassen Sie uns über die Horizontverarbeitung usw. mit OpenCV-Morphologiekonvertierung in Python nachdenken. Die Morphologiekonvertierung bezieht sich im Allgemeinen auf die Verarbeitung wie Expansions- und Kontraktionsverarbeitung. Geben wir hierfür einen extremen Kernel (Strukturelement) an. Es ist eine Art Trick.

Über die Verarbeitung

Führen Sie die Bildverarbeitung wie folgt durch.

  1. Führen Sie eine Binärisierung durch
  2. Generiere (n x 1) Kernel (Strukturelement) Für die Horizontverarbeitung (50x1), (100x1) ... Machen Sie es so Für die vertikale Linienverarbeitung (1x8), (1x10) ... Machen Sie es so
  3. Erosion mit dem erzeugten Kernel
  4. Verzögerung mit dem generierten Kernel

Über den Kernel (Strukturelement)

Der Kernel (Strukturelement) wird wie folgt erzeugt.

10x1 Kernel(Strukturelemente)Zur horizontalen Linienextraktion


>>> cv2.getStructuringElement(cv2.MORPH_RECT,(20,1))
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]],
      dtype=uint8)

1x10 Kernel(Strukturelemente)Zur vertikalen Linienextraktion


>>> cv2.getStructuringElement(cv2.MORPH_RECT, (1,10))
array([[1],
       [1],
       [1],
       [1],
       [1],
       [1],
       [1],
       [1],
       [1],
       [1]], dtype=uint8)

Übrigens sind auch allgemeine Expansion und Kontraktion aufgeführt.

Normalerweise rechteckiger Kernel(Strukturelemente)


>>> cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]], dtype=uint8)

Informationen zur Morphologiekonvertierung

horizontal = cv2.erode(horizontal, hKernel)
horizontal = cv2.dilate(horizontal, hKernel)

Die Verzögerung wird ausgeführt, nachdem die Erosion ausgeführt wurde.

Bild eingeben

Delta.png

Sehen Sie, wie horizontale Linien verarbeitet werden.

Programm

morph_delta.py


import numpy as np
import cv2
import sys

#Bildschirm
def showImage(winname, img):
    cv2.imshow(winname, img)
    cv2.moveWindow(winname, 500, 0)
    cv2.waitKey(0)
    cv2.destroyWindow(winname)

def main(imagefile):
    #Bild laden
    src = cv2.imread(imagefile,cv2.IMREAD_GRAYSCALE)
    if src is None:
        print ('Error image: ' + imagefile)
        return -1

    #Invertieren und binärisieren
    gray = cv2.bitwise_not(src)
    binimage = cv2.adaptiveThreshold(gray, 255, 
        cv2.ADAPTIVE_THRESH_MEAN_C, 
        cv2.THRESH_BINARY, 15, -2)
    #Binäre Anzeige
    showImage("BINARIZE", binimage)
    for hv in range(50, 301, 50):
        morphHorizontalLine(binimage, hv)
    for vv in range(2, 17, 2):
        morphVerticalLine(binimage, vv)
    return  0


#Morphologietransformation Horizontale Linien extrahieren
# hor_Größe Horizontale Linie extrahieren
#Strukturelementparameter der Morphologietransformation
def morphHorizontalLine(binimage, hor_size):
    horizontal = np.copy(binimage)

    #Horizont durch Morphologieberechnung
    #Generieren Sie Strukturelemente zur Extraktion.
    hKernel = cv2.getStructuringElement(cv2.MORPH_RECT,
                        (hor_size, 1))

    #Extrahieren Sie horizontale Linien durch Morphologieberechnung
    horizontal = cv2.erode(horizontal, hKernel)
    horizontal = cv2.dilate(horizontal, hKernel)

    cap = 'hor_size=%d' % (hor_size)
    cv2.putText(horizontal, cap, (10,25), 
        cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255), 1,cv2.LINE_AA)

    #Horizontbildanzeige
    showImage("HORIZONTAL LINES", horizontal)

#Morphologietransformation Vertikale Linien extrahieren
# ver_Größe Vertikale Linien extrahieren
#Strukturelementparameter der Morphologietransformation
def morphVerticalLine(binimage, ver_size):
    vertical = np.copy(binimage)

    #Vertikale Linien durch Morphologieberechnung
    #Generieren Sie Strukturelemente zur Extraktion.
    hKernel = cv2.getStructuringElement(cv2.MORPH_RECT,
                        (1,ver_size))

    #Extrahieren Sie horizontale Linien durch Morphologieberechnung
    vertical = cv2.erode(vertical, hKernel)
    vertical = cv2.dilate(vertical, hKernel)

    cap = 'ver_size=%d' % (ver_size)
    cv2.putText(vertical, cap, (10,25), 
        cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255), 1,cv2.LINE_AA)

    #Horizontbildanzeige
    showImage("VERTICAL LINES", vertical)

if __name__ == "__main__":
    main('image/Delta.png')

Entwicklungsumgebung

Windows10 Anaconda python 3.7.6 OpenCV 3.4.1

Ausführungsergebnis

Horizontale Linienextraktion

20200118_result.jpg hor_size = 50 wird vom (50,1) Kernel (Strukturelement) verarbeitet. hor_size = 100 führt bis zu (100,1), (300,1) aus.

Die vertikale Linie und die kurze horizontale Linie oben verschwinden.

Vertikale Linienextraktion

20200118_vresult.jpg

ver_size = 2 wird vom (1,2) Kernel (Strukturelement) verarbeitet. ver_size = 6 wird als (1,6), (1,8) ausgeführt. Die horizontale Linie ist verschwunden. gutes Gefühl.

Anwendung

Nachdem wir die Bewegung der Morphologieumwandlung kennen, werden wir die fünf Zeilen in der Partitur anwenden. Ich werde versuchen, es zu verarbeiten. Die Partitur ist übrigens "Gunkan March", was zu boomen scheint. Der Anfang ist ein Auszug.

Warship_march_score2.png

Erweitertes Programm

morph_lines.py


import numpy as np
import cv2
import sys

#Bildschirm
def showImage(winname, img):
	cv2.imshow(winname, img)
	cv2.moveWindow(winname, 500, 0)
	cv2.waitKey(0)
	cv2.destroyWindow(winname)

def	main(imagefile):
	#Bild laden
	src = cv2.imread(imagefile, cv2.IMREAD_GRAYSCALE)
	if src is None:
		print ('Error image: ' + imagefile)
	return -1

	#Invertieren und binärisieren
	gray = cv2.bitwise_not(src)
	binimage = cv2.adaptiveThreshold(gray, 255, 
		cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 15, -2)
	#Binäre Anzeige
	showImage("BINARIZE", binimage)
	morphLine(binimage, 5)
	return	0

#Morphologie-Transformation
# ver_Größe Horizontale Linie extrahieren Strukturelementparameter der Morphologietransformation
def	morphLine(binimage, ver_size):
	#Bildpuffererzeugung zur horizontalen Linienextraktion
	vertical = np.copy(binimage)

	#Generieren Sie Strukturelemente zum Extrahieren vertikaler Linien durch Morphologieberechnung.
	vKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, ver_size))

	#Extrahieren Sie vertikale Linien durch Morphologieberechnung
	vertical = cv2.erode(vertical, vKernel)
	vertical = cv2.dilate(vertical, vKernel)

	#Vertikales Linienbild anzeigen
	showImage("VERTICAL LINES", vertical)

	#	1)Kanten extrahieren
	#	2)Expansion erweitern(contour_edge)
	#	3)Glatt glatt
	#	4)Vertikales Linienbild und Kante zusammenführen

	#Extrahieren Sie Konturkanten und glätten Sie das Bild
	contour_edge = cv2.adaptiveThreshold(vertical, 255, 
		cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 3, -2)
	showImage("CONTOUR EDGE", contour_edge)

	#Randbilderweiterung
	kernel = np.ones((2, 2), np.uint8)
	contour_edge = cv2.dilate(contour_edge, kernel)
	showImage("DILATE contour_edge", contour_edge)

	#Bildunschärfe(Glätten)
	#Normalisierter Boxfilter für den Durchschnitt
	smooth = cv2.blur(np.copy(vertical), (2, 2))

	#Vertikales Linienbild und Kante zusammenführen
	#Koordinatenextraktion für den Teil, in dem die Kante vorhanden ist
	#Überschreiben Sie das vertikale Bild vom Rand aus den extrahierten Koordinaten
	(height, width) = np.where(contour_edge != 0)
	vertical[height, width] = smooth[height, width]

	#Ergebnisbildanzeige
	showImage("RESULT IMAGE", vertical)

if __name__ == "__main__":
	main('image/Warship_march_score.png')

Ich laufe auf einem 5x1 Kernel (Strukturelement). Die Rückseite des Prozesses ist der Wiederherstellungsprozess, um das Erscheinungsbild des Bildes zu erhalten. Da es sich nicht insbesondere um das Wesentliche handelt, wird die Erklärung weggelassen.

Anwendungsversion Ausführungsergebnis

ResultLine_v5.png

Ist es so ein Ort? Über den Ort, an dem "Ich kann das tun" steht, indem der Kernel (Strukturelement) geändert wird Inhaltlich ist es keine große Sache, aber es gibt Dinge, die damit gemacht werden können Ich fühlte etwas und schrieb es auf.

Referenz

Morphology Conversion - OpenCV-Python Tutorials 1 Dokumentation opencv.org - Extract horizontal and vertical lines by using morphological operations JMSDF BAND der Tokyo Self-Defense Force Tokyo Music Corps, TOKYO - März "Gunkan"

Recommended Posts

Horizontale Linienverarbeitung mit OpenCV-Morphologietransformation
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
"Apple-Verarbeitung" mit OpenCV3 + Python3
Feature-Erkennung mit opencv (Eckenerkennung)
[Python] Verwenden von OpenCV mit Python (Basic)
Versuchen Sie es mit OpenCV unter Windows
Affine Transformation durch OpenCV (CUDA)
Gammakorrektur ohne OpenCV
Implementieren Sie die Umkehrumkehrverarbeitung mit BitBoard
Verwenden des Python-Modus in der Verarbeitung
Verwenden von OpenCV mit Python @Mac
[Bildverarbeitung] Poo-san ist durch Kantenerkennung mit Python und OpenCV nackt!