3 votes

SimpleBlobDetector - Isole les gouttes qui sont distinctes de celles qui les entourent.

J'utilise SimpleBlobDetector pour localiser les points décimaux et d'autres types de signes de ponctuation, comme on peut le voir dans l'image ci-dessous, il arrive que le détecteur repère des taches dans les zones pleines du texte (le bas du 9 du milieu). SimpleBlobDetector ou en post-traitement.

Existe-t-il un moyen de spécifier qu'un blob doit être séparé de sa couleur de fond ? Peut-être une méthode de détection des bords ?

Votre aide est appréciée.

Le code du détecteur est :

    params = cv2.SimpleBlobDetector_Params()
    params.filterByArea = True
    params.minArea = 30
    params.minThreshold = 50
    params.maxThreshold = 200
    params.filterByConvexity = True
    params.minConvexity = 0.87
    params.filterByColor = True
    detector = cv2.SimpleBlobDetector_create(params)
    detections = detector.detect(img)

Image de sortie avec détections

Output image with detections Original :

Original image

2voto

nathancy Points 6407

Au lieu d'utiliser SimpleBlobDetector Dans ce cas, voici une solution utilisant la détection des bords et des contours qui permet un meilleur contrôle du filtrage. L'idée principale est la suivante

  • Convertir l'image en niveaux de gris
  • flou gaussien
  • Seuil de l'image pour séparer les caractéristiques principales du fond
  • Effectuer la détection des bords en douceur
  • Dilatez l'image de canny pour améliorer et fermer les contours.
  • Trouver les contours dans l'image et filtrer en utilisant une zone de seuil min/max

Image de seuil

enter image description here

Détection des bords à la Canny

enter image description here

Dilater pour améliorer les contours

enter image description here

Détection et filtrage des contours en fonction de la surface.

enter image description here

Résultats de sortie

contours détectés : 1

import numpy as np
import cv2

original_image = cv2.imread("1.jpg")
image = original_image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
thresh = cv2.threshold(blurred, 110, 255,cv2.THRESH_BINARY)[1]
canny = cv2.Canny(thresh, 150, 255, 1)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
dilate = cv2.dilate(canny, kernel, iterations=1)

cv2.imshow("dilate", dilate)
cv2.imshow("thresh", thresh)
cv2.imshow("canny", canny)

# Find contours in the image
cnts = cv2.findContours(dilate.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

contours = []

threshold_min_area = 1100
threshold_max_area = 1200

for c in cnts:
    area = cv2.contourArea(c)
    if area > threshold_min_area and area < threshold_max_area:
        cv2.drawContours(original_image,[c], 0, (0,255,0), 3)
        contours.append(c)

cv2.imshow("detected", original_image) 
print('contours detected: {}'.format(len(contours)))
cv2.waitKey(0)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X