Обнаружить маленькие точки на изображении - PullRequest
2 голосов
/ 09 марта 2020

У меня есть изображение в градациях серого с темными точками, которое я могу преобразовать в двоичное (черно-белое) изображение.

Образец:

Входной сигнал в градациях серого:

enter image description here

Ч / Б изображение:

enter image description here

Мне нужно найти точки в красных кружках, как на

enter image description here

Расстояние между точками больше- или менее равномерно, если нет острого угла.

У меня есть полуобработанное решение на основе исходного изображения в градациях серого и детектора углов Харриса вместе с кластеризацией, но оно довольно медленное и не такое прямолинейное .

Я пробовал преобразование Хафа для кругов, но точки слишком малы (приблизительно 10x10 px), чтобы их можно было правильно определить без слишком большого шума.

Однако я могу сделать это правильно обнаружить линию на изображении в градациях серого - увидеть красную линию на изображении. Я уже использую эти знания и фильтрую точки по расстоянию от линии.

enter image description here

Однако в некоторых случаях это не удается. Например, приведенное ниже изображение весьма проблематично c - на границе вика имеется «дыра», а точки расположены слишком близко, соединены жирной линией. У меня также есть ложные срабатывания от чисел, которые определяются как точки.

enter image description here

Есть ли у вас какие-либо идеи для возможного решения, в идеале с OpenCV?

Обратите внимание, что это всего лишь образец, точки могут быть не на тонкой линии, а скорее на отдельной линии или слишком яркая линия и т. Д. c. Таким образом, линия не может быть использована для обнаружения точек.

1 Ответ

1 голос
/ 10 марта 2020

Потенциальным решением является использование морфологических операций с ядром cv2.MORPH_ELLIPSE для выделения маленьких точек. Идея состоит в том, чтобы получить двоичное изображение с порогом Оцу , а затем отфильтровать большие несвязные объекты, используя фильтрацию области контура. Откуда мы выполняем морфинг, чтобы изолировать точки. Наконец мы находим контуры и изолируем точки. Вот результаты:

enter image description here enter image description here

enter image description here enter image description here

код

import cv2
import numpy as np

# Load image, grayscale, Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Filter out large non-connecting objects
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area < 500:
        cv2.drawContours(thresh,[c],0,0,-1)

# Morph open using elliptical shaped kernel
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=3)

# Find circles 
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area > 20 and area < 50:
        ((x, y), r) = cv2.minEnclosingCircle(c)
        cv2.circle(image, (int(x), int(y)), int(r), (36, 255, 12), 2)

cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.imshow('image', image)
cv2.waitKey()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...