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

#python #image #opencv #image-processing #hough-transform

#python #изображение #opencv #обработка изображений #хаф-преобразование

Вопрос:

введите описание изображения здесь

У меня есть изображение, подобное приведенному выше, и я хочу, чтобы круг, как на изображении ниже, был выделен синим цветом введите описание изображения здесь

Однако, когда я это делаю, введите описание изображения здесьобнаруживается красный круг.
введите описание изображения здесь
Как я могу автоматически определять синий круг вместо красного? (не проходя через каждый отдельный круговой контур)

Комментарии:

1. вы могли бы попытаться установить пороговое значение синего цвета, а затем использовать обнаружение круга RANSAC (поиск по SO, я опубликовал несколько ответов с реализациями).

2. @Micka: ха-ха, у меня тоже возникло искушение ответить на эту шутку.

3. в качестве реального ответа: порог яркой области (близкой к белой), извлеките края и используйте обнаружение круга RANSAC.

4. Чего вы пытаетесь достичь? В зависимости от вашей цели, возможно, может быть полезно преобразование прямоугольной формы в полярную…

5. Моя конечная цель — изменить изображение датчика на прямоугольное изображение (чтобы отметки были выровнены по линейке). Я хочу найти синий круг, чтобы получить центр датчика, потому что мне нужно знать центр, чтобы правильно изменить прямоугольное изображение, иначе изображение искажается.

Ответ №1:

Этот приведенный ниже код даст вам несколько кругов при передаче изображения. Кроме того, это даст вам количество. Вы можете отредактировать его позже.

 import cv2

image = cv2.imread('image.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,27,3)

cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
count = 0
for c in cnts:
    area = cv2.contourArea(c)
    x,y,w,h = cv2.boundingRect(c)
    ratio = w/h
    ((x, y), r) = cv2.minEnclosingCircle(c)
    if ratio > .85 and ratio < 1.20 and area > 50 and area < 120 and r < 7:
        cv2.circle(image, (int(x), int(y)), int(r), (36, 255, 12), -1)
        count  = 1

print('Count: {}'.format(count))

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()