[PYTHON] Traitement de lignes horizontales à l'aide de la transformation de morphologie OpenCV

Je pense qu'il existe différentes manières de traiter horizon, etc. Pensons au traitement d'horizon, etc. en utilisant la conversion de morphologie OpenCV en python. La conversion morphologique fait généralement référence à un traitement tel que le traitement d'expansion et de contraction. Spécifions un noyau extrême (élément structurel) pour cela. C'est une sorte de truc.

À propos du traitement

Le traitement d'image est effectué comme suit.

  1. Effectuer la binarisation
  2. Générer (n x 1) noyau (élément structurel) Pour le traitement de l'horizon (50x1), (100x1) ... Faites comme ça Pour le traitement de ligne verticale (1x8), (1x10) ... Faites comme ça
  3. Erosion avec le noyau généré
  4. Retard avec le noyau généré

À propos du noyau (élément structurel)

Le noyau (élément structurel) est généré comme suit.

Noyau 10x1(Éléments structurels)Pour l'extraction de lignes horizontales


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

Noyau 1x10(Éléments structurels)Pour l'extraction de lignes verticales


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

À propos, l'expansion et la contraction générales sont également répertoriées.

Noyau généralement rectangulaire(Éléments structurels)


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

À propos de la conversion de morphologie

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

Le délai est exécuté après l'exécution de l'érosion.

Image d'entrée

Delta.png

Découvrez comment les lignes horizontales sont traitées.

programme

morph_delta.py


import numpy as np
import cv2
import sys

#Affichage de l'image
def showImage(winname, img):
    cv2.imshow(winname, img)
    cv2.moveWindow(winname, 500, 0)
    cv2.waitKey(0)
    cv2.destroyWindow(winname)

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

    #Inverser et binariser
    gray = cv2.bitwise_not(src)
    binimage = cv2.adaptiveThreshold(gray, 255, 
        cv2.ADAPTIVE_THRESH_MEAN_C, 
        cv2.THRESH_BINARY, 15, -2)
    #Affichage binaire
    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


#Transformation morphologique Extraire des lignes horizontales
# hor_taille Extraire la ligne horizontale
#Paramètres d'élément structurel de transformation morphologique
def morphHorizontalLine(binimage, hor_size):
    horizontal = np.copy(binimage)

    #Calcul de l'horizon par morphologie
    #Générer des éléments structurels pour l'extraction.
    hKernel = cv2.getStructuringElement(cv2.MORPH_RECT,
                        (hor_size, 1))

    #Extraire des lignes horizontales par calcul de morphologie
    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)

    #Affichage d'image Horizon
    showImage("HORIZONTAL LINES", horizontal)

#Transformation morphologique Extraire des lignes verticales
# ver_taille Extraire les lignes verticales
#Paramètres d'élément structurel de transformation morphologique
def morphVerticalLine(binimage, ver_size):
    vertical = np.copy(binimage)

    #Lignes verticales par calcul de morphologie
    #Générer des éléments structurels pour l'extraction.
    hKernel = cv2.getStructuringElement(cv2.MORPH_RECT,
                        (1,ver_size))

    #Extraire des lignes horizontales par calcul de morphologie
    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)

    #Affichage d'image Horizon
    showImage("VERTICAL LINES", vertical)

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

Environnement de développement

Windows10 Anaconda python 3.7.6 OpenCV 3.4.1

Résultat d'exécution

Extraction de ligne horizontale

20200118_result.jpg hor_size = 50 est traité par le noyau (50,1) (élément structurel). hor_size = 100 exécute jusqu'à (100,1), (300,1).

La ligne verticale et la courte ligne horizontale en haut disparaissent.

Extraction de ligne verticale

20200118_vresult.jpg

ver_size = 2 est traité par le noyau (1,2) (élément structurel). ver_size = 6 est exécuté comme (1,6), (1,8). La ligne horizontale a disparu. bon sentiment.

application

Maintenant que nous connaissons le mouvement de conversion morphologique, nous allons appliquer les cinq lignes de la partition. Je vais essayer de le traiter. Au fait, le score est "Gunkan March" qui semble être en plein essor. Le début est extrait.

Warship_march_score2.png

Programme avancé

morph_lines.py


import numpy as np
import cv2
import sys

#Affichage de l'image
def showImage(winname, img):
	cv2.imshow(winname, img)
	cv2.moveWindow(winname, 500, 0)
	cv2.waitKey(0)
	cv2.destroyWindow(winname)

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

	#Inverser et binariser
	gray = cv2.bitwise_not(src)
	binimage = cv2.adaptiveThreshold(gray, 255, 
		cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 15, -2)
	#Affichage binaire
	showImage("BINARIZE", binimage)
	morphLine(binimage, 5)
	return	0

#Transformation morphologique
# ver_taille Extraction de la ligne horizontale Transformation morphologique
def	morphLine(binimage, ver_size):
	#Génération de tampon d'image pour l'extraction de lignes horizontales
	vertical = np.copy(binimage)

	#Générer des éléments structurels pour extraire des lignes verticales par calcul de morphologie.
	vKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, ver_size))

	#Extraire des lignes verticales par calcul de morphologie
	vertical = cv2.erode(vertical, vKernel)
	vertical = cv2.dilate(vertical, vKernel)

	#Afficher l'image de la ligne verticale
	showImage("VERTICAL LINES", vertical)

	#	1)Extraire les bords
	#	2)Expansion dilatée(contour_edge)
	#	3)Lisse lisse
	#	4)Fusionner l'image de la ligne verticale et le bord

	#Extraire les bords du contour et lisser l'image
	contour_edge = cv2.adaptiveThreshold(vertical, 255, 
		cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 3, -2)
	showImage("CONTOUR EDGE", contour_edge)

	#Extension d'image de bord
	kernel = np.ones((2, 2), np.uint8)
	contour_edge = cv2.dilate(contour_edge, kernel)
	showImage("DILATE contour_edge", contour_edge)

	#Flou d'image(Lissage)
	#Filtre de boîte normalisé pour prendre la moyenne
	smooth = cv2.blur(np.copy(vertical), (2, 2))

	#Fusionner l'image de la ligne verticale et le bord
	#Extraction de coordonnées pour la pièce où se trouve l'arête
	#Écraser l'image verticale à partir du bord des coordonnées extraites
	(height, width) = np.where(contour_edge != 0)
	vertical[height, width] = smooth[height, width]

	#Affichage de l'image de résultat
	showImage("RESULT IMAGE", vertical)

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

Je cours sur un noyau 5x1 (élément structurel). L'arrière du processus est le processus de restauration pour obtenir l'apparence de l'image. Comme ce n'est pas l'essence en particulier, l'explication est omise.

Version de l'application Résultat de l'exécution

ResultLine_v5.png

Est-ce un tel endroit? À propos de l'endroit qui dit "Je peux le faire" en changeant le noyau (élément structurel) Ce n'est pas un gros problème en termes de contenu, mais il y a des choses qui peuvent être faites avec Il y avait quelque chose que j'ai ressenti et je l'ai noté.

référence

Conversion de morphologie - documentation OpenCV-Python Tutorials 1 opencv.org - Extract horizontal and vertical lines by using morphological operations Marine Self-Defense Force Tokyo Music Corps JMSDF BAND, TOKYO - Mars "Gunkan"

Recommended Posts

Traitement de lignes horizontales à l'aide de la transformation de morphologie OpenCV
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
"Traitement Apple" avec OpenCV3 + Python3
Détection de caractéristiques à l'aide d'opencv (détection de coin)
[Python] Utilisation d'OpenCV avec Python (basique)
Essayez d'utiliser OpenCV sur Windows
Transformation affine par OpenCV (CUDA)
Correction gamma sans utiliser OpenCV
Implémenter le traitement de l'inversion à l'aide de BitBoard
Utilisation du mode Python dans le traitement
Utiliser OpenCV avec Python @Mac
[Traitement d'image] Poo-san est nu par détection de bord en utilisant Python et OpenCV!