4

У меня есть очень простой код, который использует стандартную команду HoughCircles в openCV для обнаружения круга. Однако моя проблема заключается в том, что мои данные (изображения) генерируются с использованием алгоритма (для целей моделирования данных), который отображает точку в диапазоне + -15% (случайным образом в этом диапазоне) r (где r - радиус круга, который был случайным образом сгенерирован между 5 и 10 (действительные числа)) и делает это на 360 градусов, используя уравнение круга. (Прикреплено образ образца). http://imgur.com/a/iIZ1N Теперь, используя команду Hough circle, мне удалось обнаружить круг примерно такого же радиуса, ручно поиграв с параметрами (настройками трекбаров, вдохновленными кодом github того же характера), но я хочу автоматизировать процесс, поскольку у меня есть более 1000 изображений, которые я хочу делать снова и снова. Есть ли лучший способ сделать это? Или, если у кого-то есть какие-то предложения, я бы очень оценил их, поскольку я начинаю работать в области обработки изображений и имею физический фон, а не CS. Грубый пример моего кода (без trackbars и т.д. ниже):Как улучшить преобразование Hough Circle для определения круга, состоящего из разбросанных точек

Mat img = imread("C:\\Users\\walee\\Documents\\MATLAB\\plot_2 .jpeg", 0); 
Mat cimg,copy; 
copy = img; 
medianBlur(img, img, 5); 
GaussianBlur(img, img, Size(1, 5), 1.1, 0); 

cvtColor(img, cimg, COLOR_GRAY2BGR); 
vector<Vec3f> circles; 
HoughCircles(img, circles, HOUGH_GRADIENT,1, 10, 94, 57, 120, 250); 
for (size_t i = 0; i < circles.size(); i++) 
{ 
    Vec3i c = circles[i]; 
    circle(cimg, Point(c[0], c[1]), c[2], Scalar(0, 0, 255), 1, LINE_AA); 
    circle(cimg, Point(c[0], c[1]), 2, Scalar(0, 255, 0), 1, LINE_AA); 
} 
imshow("detected circles", cimg); 
waitKey(); 
return 0; 

ответ

0

Если все изображения имеют ту же природу (черную ось и точки, как круги) Я бы предложил сделать следующее:

1) удалить ось, находя черные элементы и заменить их на фоне

2) инвертировать цвета, чтобы иметь черный фон,

3) выполняет морфологическое закрытие для заполнения кругов и создать более прочные точки

4) (опционально), если плотность точек высока, вы можете попробовать применить другую морфологическую операцию, а именно расширение, чтобы сделать круг данных тоньше

5) применять Хаф круг

+0

Я наполню круги и вернуться к вам как можно скорее, так как это легко. (поскольку это симуляция, и я могу контролировать данные, которые я даю программе, незаполненные круги были только мне ленивыми во время генерации данных). Что касается инвертирования цветов, я был под впечатлением, бинаризуя изображение, сделав изображение только черно-белым, я ошибаюсь в этом предположении? – user2918711

+0

Правильно - бинаризация делает изображение черно-белым. Я просто хочу заверить, что фон черный, а передний план белый. В противном случае морфологические операции будут работать как противоположные. – MateuszB

+0

Я пробовал все это, и пока он улучшал результаты для первых нескольких снимков, программа не смогла сделать это для большего количества изображений. Я также подумал о реализации своего рода поискового алгоритма для идеального значения массива аккумуляторов для определения наилучшего одиночного круга, но затем программа начала обнаруживать круги немного меньше, чем те, которые я намеревался сделать. – user2918711