Поиск ярких пятен на изображении с помощью opencv

Поиск ярких пятен на изображении с помощью opencv

Я хочу найти яркие пятна на изображении выше и пометить их каким-нибудь символом. Для этого я попытался использовать алгоритм Преобразование круга Хафа, который уже предоставляет OpenCV. Но когда я запускаю код, он выдает какую-то ошибку утверждения. Я также пробовал алгоритм Обнаружение хитрых краев, который также предоставляется в OpenCV, но он также дает некоторую ошибку утверждения. Я хотел бы знать, есть ли способ сделать это или я могу предотвратить появление этих сообщений об ошибках.

Я новичок в OpenCV, и любая помощь будет очень признательна.

P.S. - Я также могу использовать Scikit-image, если необходимо. Итак, если это можно сделать с помощью Scikit-image, расскажите, пожалуйста, как это сделать.

Ниже мой код предварительной обработки:

import cv2
import numpy as np



image = cv2.imread("image1.png")

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

binary_image = np.where(gray_image > np.mean(gray_image),1.0,0.0)

binary_image = cv2.Laplacian(binary_image, cv2.CV_8UC1)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
5 197
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы собираетесь работать с простыми изображениями, такими как ваш пример, где у вас черный фон, вы можете использовать ту же базовую предварительную обработку / определение порога, а затем найти подключенные компоненты. Используйте этот пример кода, чтобы нарисовать круг внутри всех кругов на изображении.

import cv2 
import numpy as np

image = cv2.imread("image1.png")

#  constants
BINARY_THRESHOLD = 20
CONNECTIVITY = 4
DRAW_CIRCLE_RADIUS = 4

#  convert to gray
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

#  extract edges
binary_image = cv2.Laplacian(gray_image, cv2.CV_8UC1)

#  fill in the holes between edges with dilation
dilated_image = cv2.dilate(binary_image, np.ones((5, 5)))

#  threshold the black/ non-black areas
_, thresh = cv2.threshold(dilated_image, BINARY_THRESHOLD, 255, cv2.THRESH_BINARY)

#  find connected components
components = cv2.connectedComponentsWithStats(thresh, CONNECTIVITY, cv2.CV_32S)

#  draw circles around center of components
#see connectedComponentsWithStats function for attributes of components variable
centers = components[3]
for center in centers:
    cv2.circle(thresh, (int(center[0]), int(center[1])), DRAW_CIRCLE_RADIUS, (255), thickness=-1)

cv2.imwrite("res.png", thresh)
cv2.imshow("result", thresh)
cv2.waitKey(0)

Вот итоговое изображение: Picture showing drawn circles inside found connected components

Обновлено: connectedComponentsWithStats принимает двоичное изображение в качестве входных данных и возвращает связанные группы пикселей в этом изображении. Если вы хотите реализовать эту функцию самостоятельно, наивный способ:
1- Сканируйте пиксели изображения сверху слева направо вниз, пока не найдете ненулевой пиксель, не имеющий метки (id) .
2- Когда вы сталкиваетесь с ненулевым пикселем, рекурсивно ищите всех его соседей (если вы используете 4 соединения, вы проверяете UP-LEFT-DOWN-RIGHT, при 8 подключениях вы также проверяете диагонали), пока не закончите эту область. Присвойте каждому пикселю метку. Увеличьте счетчик этикеток. 3- Продолжайте сканирование с того места, где вы ушли.

Почему бы не похвастаться своими результатами? Людям нравятся иллюстрированные ответы, их легко понять и проверить ...

Mark Setchell 14.08.2018 22:57

Извините, полностью согласен. Приложил пример изображения, как вы предложили.

unlut 14.08.2018 23:00

Я в значительной степени понял код, но не понял, что на самом деле делает функция connectedComponentsWithStats?

Sahil 15.08.2018 12:13

Он принимает двоичное изображение в качестве входных данных и возвращает связанные группы пикселей в этом изображении. Если вы хотите реализовать эту функцию самостоятельно, наивным способом будет: 1 - Сканировать пиксели изображения сверху слева направо вниз, пока вы не встретите ненулевой пиксель, у которого нет метки (id). 2- Когда вы сталкиваетесь с ненулевым пикселем, рекурсивно ищите всех его соседей (если вы используете 4 соединения, вы проверяете UP-LEFT-DOWN-RIGHT, при 8 подключениях вы также проверяете диагонали), пока не закончите эту область. Присвойте каждому пикселю метку. Увеличьте счетчик этикеток. 3- Продолжайте сканирование с того места, где вы ушли.

unlut 15.08.2018 12:30

Также есть способ создать линии сетки вокруг этих кругов, чтобы каждый круг находился внутри поля сетки?

Sahil 15.08.2018 12:34

Как я уже сказал, вы можете проверить вывод функции connectedComponentsWithStats, она возвращает такую ​​информацию, как координата верхнего левого угла (x, y) найденных компонентов, ширина компонента, высота компонента, центр компонента ..., вы можете использовать их и функции рисования opencv.

unlut 15.08.2018 12:38

Большое спасибо. Отличный ответ!

Sahil 15.08.2018 12:42

Другие вопросы по теме