Я пытаюсь определить круги, которые являются черными точками или имеют черные точки в них (те, которые я указал стрелкой на следующем изображении).
Мой текущий подход заключается в использовании функции HoughCircles в OpenCV для обнаружения кругов с радиусом более 2 пикселей. Мой вопрос к сообществу: скажем, я обнаружил эти круги (как показано ниже), как я могу отделить круги, которые я указал стрелками , от остальных. Круги, на которые указывает стрелка, - это круги, которые меня интересуют, те, которые имеют черный / темный цвет. Розовые блики - это те, которые обнаружил HoughCircles. Кроме того, я сам добавил стрелки, чтобы показать круг моих интересов.
Вот код python, которым я был с помощью. Вот ссылка на изображение на случай, если вы захотите его попробовать.
import sys
import cv2 as cv
import numpy as np
import math
filename = '72471_125_df.jpg'
src = cv.imread("72471_125_df.jpg", cv.IMREAD_COLOR)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
gray = cv.medianBlur(gray, 3)
# Inverse ratio of the accumulator resolution to the image resolution. For example, if dp=1 , the accumulator has the same resolution as the input image. If dp=2 , the accumulator has half as big width and height.
accum_size = 1
# Minimum distance between the centers of the detected circles.
minDist = 30
#First method-specific parameter. In case of CV_HOUGH_GRADIENT , it is the higher threshold of the two passed to the Canny() edge detector (the lower one is twice smaller).
param1 = 50
# Second method-specific parameter. In case of CV_HOUGH_GRADIENT , it is the accumulator threshold for the circle centers at the detection stage. The smaller it is, the more false circles may be detected. Circles, corresponding to the larger accumulator values, will be returned first.
param2 = 5
#
minRadius = 1
#
maxRadius = 10
circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, accum_size, minDist,
param1=param1, param2=param2,
minRadius=minRadius, maxRadius=maxRadius)
circles = circles.reshape(1,circles.shape[1], circles.shape[2])
if circles is not None:
circles = np.uint16(np.around(circles))
for ind, i in enumerate(circles[0, :]):
center = (i[0], i[1])
radius = 15
cv.circle(src, center, radius, (255, 0, 255), 3)
cv.imwrite("modif_"+filename,src)
Обратите внимание, что я использовал конфигурацию, в которой minRadius = 2
и maxRadius = 5
, однако она это сделала не дай мне круги с черными / темными точками в них. По какой-то причине он возвращает и другие круги. Кроме того, я попробовал подходы пороговой обработки, однако это не было устойчиво при всех условиях освещения. Пожалуйста, обратитесь к этой ссылке для просмотра изображений с различными условиями освещения.