обнаружение тонких линий в шумных изображениях

У меня есть шумное изображение, где я должен обнаружить круги определенных размеров. На нескольких изображениях могут быть очень тонкие линии. В настоящее время алгоритм, который я использую, в основном состоит в том, что как внешние (черные), так и внутренние центральные (белые) круги не обнаруживаются при обнаружении окружностей на основе контуров, я заявляю, что есть разрыв линии. Но этот метод не всегда работает. Также трудно обнаружить тонкие линии (по умолчанию линия на поверхности фона не должна быть обнаружена).введите описание изображения здесь

Псевдокод для определения круга и обрезки линии

1. convert image to grey scale
2. find hough circles
3. from the circles found, store the ones with expected radii.
4. apply canny to the grey scale image and dilate.
5. find contours on the canny image.
6. check if contour is circle :

if(contour.size() > lineThresh) {
cv::RotatedRect rect = cv::fitEllipse(contour);
float width = rect.size.width * 0.5;
float height = rect.size.height * 0.5;

float shortAxis = 0.0;
float longAxis = 0.0;

if (width < height) {
shortAxis = width;
longAxis = height;
} else {
shortAxis = height;
longAxis = width;
}

if (longAxis == 0.0) {
longAxis = 1.0;
}

float circleMeasure = ((longAxis - shortAxis) / longAxis);
float radius = (longAxis + shortAxis) / 2;

float perimeter = cv::arcLength(contour, false);
float area = abs(cv::contourArea(contour));

if (area <= 0) {
area = 1;
}
float area_diff = std::abs(area - ((radius * perimeter) / 2));
float area_delta = area_diff / area;

if(circleMeasure < this->circleError &&
area_delta < this->areaDelta) {
return true;
}else
return false;

7. if both (exterior and interior central) circles are found, circles are good
else if, found in hough and not in contours, there's a line cut.

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

2

Решение

Хорошо, ребята, наконец-то нашли решение!

- Use tophat morphology on the gray image. This enhances the line cuts along with noise
- Use line filter and rotate it by 10 degrees.
e.g. Mat kernel = (cv::Mat_<float>(3, 3) << -1, 4, -1,
-1, 4, -1,
-1, 4, -1;
(Now only the straight contours remain)
- Check the aspect ratio of the contours and store if it exceeds a threshold.
- Check for collinearity of the contours. If the length of collinear segment is more than a threshold, declare it as a line cut.

Этот алгоритм работает хорошо для меня

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]