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.
Führen Sie die Bildverarbeitung wie folgt durch.
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)
horizontal = cv2.erode(horizontal, hKernel)
horizontal = cv2.dilate(horizontal, hKernel)
Die Verzögerung wird ausgeführt, nachdem die Erosion ausgeführt wurde.
Sehen Sie, wie horizontale Linien verarbeitet werden.
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')
Windows10 Anaconda python 3.7.6 OpenCV 3.4.1
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.
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.
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.
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.
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.
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