Как обнаружить отдельные фигуры на изображении? - PullRequest
2 голосов
/ 21 апреля 2019

У меня есть изображение, похожее на следующее.Я хочу разделить два числа 7 и 4, как показано на рисунке, так как я хочу иметь ограничивающую рамку для каждого из этих двух объектов.

enter image description here

Как я могу сделать это с OpenCV?Я понятия не имею, как я мог это сделать, и думал, если есть какой-то способ с помощью оператора Собеля.Единственное, что мне надоело, так это получение Собел.

s = cv2.Sobel(img, cv2.CV_64F,1,0,ksize=5)

enter image description here

, но я не знаю, как действовать дальше.

Ответы [ 2 ]

3 голосов
/ 23 апреля 2019

Для сегментирования и обнаружения фигур на изображении основная идея заключается в следующем:

  1. Преобразование изображения в оттенки серого с использованием cv2.cvtColor()
  2. размытое изображение с cv2.GaussianBlur()
  3. Найти ребра с cv2.Canny()
  4. Найти контуры с помощью cv2.findContours()
  5. Итерация по каждому контуру
    • Получить ограничивающий прямоугольник, используя cv2.boundingRect()
    • Найти ROI для каждого контура с нарезкой Numpy
    • Нарисуйте прямоугольник ограничительной рамки, используя cv2.Rectangle()

Помутнение enter image description here

Canny Edge Detection enter image description here

Обнаруженные контуры enter image description here

выход

Обнаружены контуры: 2

import numpy as np
import cv2

original_image = cv2.imread("1.png")
image = original_image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
canny = cv2.Canny(blurred, 120, 255, 1)

cv2.imshow("canny", canny)

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

contours = []

for c in cnts:
    # Obtain bounding rectangle for each contour
    x,y,w,h = cv2.boundingRect(c)

    # Find ROI of the contour
    roi = image[y:y+h, x:x+w]

    # Draw bounding box rectangle
    cv2.rectangle(original_image,(x,y),(x+w,y+h),(0,255,0),3)
    contours.append(c)

cv2.imshow("detected", original_image) 
print('contours detected: {}'.format(len(contours)))
cv2.waitKey(0)
1 голос
/ 21 апреля 2019

Выполните следующие шаги:

  1. Преобразование изображения в оттенки серого.
  2. Используйте пороговое значение для преобразования изображения в двоичное изображение, в вашей проблеме я думаю adaptive gausian будет наиболее полезным для использования.
  3. Применить обнаружение контуров, после чего вы можете создать ограничивающий прямоугольник вокруг контуров.

Возможно, вам придется отфильтровать контуры по размеру или положению.

...