Я хочу найти яркие пятна на изображении выше и пометить их каким-нибудь символом. Для этого я попытался использовать алгоритм Преобразование круга Хафа, который уже предоставляет 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)






Если вы собираетесь работать с простыми изображениями, такими как ваш пример, где у вас черный фон, вы можете использовать ту же базовую предварительную обработку / определение порога, а затем найти подключенные компоненты. Используйте этот пример кода, чтобы нарисовать круг внутри всех кругов на изображении.
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)
Обновлено: connectedComponentsWithStats принимает двоичное изображение в качестве входных данных и возвращает связанные группы пикселей в этом изображении. Если вы хотите реализовать эту функцию самостоятельно, наивный способ:
1- Сканируйте пиксели изображения сверху слева направо вниз, пока не найдете ненулевой пиксель, не имеющий метки (id) .
2- Когда вы сталкиваетесь с ненулевым пикселем, рекурсивно ищите всех его соседей (если вы используете 4 соединения, вы проверяете UP-LEFT-DOWN-RIGHT, при 8 подключениях вы также проверяете диагонали), пока не закончите эту область. Присвойте каждому пикселю метку. Увеличьте счетчик этикеток.
3- Продолжайте сканирование с того места, где вы ушли.
Извините, полностью согласен. Приложил пример изображения, как вы предложили.
Я в значительной степени понял код, но не понял, что на самом деле делает функция connectedComponentsWithStats?
Он принимает двоичное изображение в качестве входных данных и возвращает связанные группы пикселей в этом изображении. Если вы хотите реализовать эту функцию самостоятельно, наивным способом будет: 1 - Сканировать пиксели изображения сверху слева направо вниз, пока вы не встретите ненулевой пиксель, у которого нет метки (id). 2- Когда вы сталкиваетесь с ненулевым пикселем, рекурсивно ищите всех его соседей (если вы используете 4 соединения, вы проверяете UP-LEFT-DOWN-RIGHT, при 8 подключениях вы также проверяете диагонали), пока не закончите эту область. Присвойте каждому пикселю метку. Увеличьте счетчик этикеток. 3- Продолжайте сканирование с того места, где вы ушли.
Также есть способ создать линии сетки вокруг этих кругов, чтобы каждый круг находился внутри поля сетки?
Как я уже сказал, вы можете проверить вывод функции connectedComponentsWithStats, она возвращает такую информацию, как координата верхнего левого угла (x, y) найденных компонентов, ширина компонента, высота компонента, центр компонента ..., вы можете использовать их и функции рисования opencv.
Большое спасибо. Отличный ответ!
Почему бы не похвастаться своими результатами? Людям нравятся иллюстрированные ответы, их легко понять и проверить ...