#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()