OpenCV: подгонка одного круга к изображению (в Python) - PullRequest
3 голосов
/ 11 апреля 2019

У меня есть изображение, подобное этому:

enter image description here

Мне нужно подогнать эллипс к темной области (примечание: должен быть эллипс, а не круг). Каков наилучший способ сделать это в OpenCV? Моим первым шагом было применение к нему адаптивного (отсуского) порога, в результате чего:

enter image description here

Но я не уверен, куда идти дальше. Я пишу приложение на Python, но это больше дизайн алгоритма, который я ищу.

РЕДАКТИРОВАТЬ на основе ответа / комментария:

ОК, так что я уже попробовал морфологию. Основываясь на документации OpenCV , я выполнил 3-итерационную операцию «закрытия» над ним (расширение, затем эрозия), чтобы удалить мелкие частицы, в результате чего:

enter image description here

Затем, чтобы развернуть его ближе к исходной форме, я выполнил 3-итерационную операцию «открытия» (эрозия, затем растяжение), в результате чего:

enter image description here

Отсюда я сделал обнаружение края Канни, что привело к:

enter image description here

Теперь я использовал findContours, но столкнулся с проблемой. Он обнаружил десятки контуров вдоль края, каждый из которых был коротким отрезком по окружности. Это означает, что даже если я возьму контур максимального размера, он может представлять только 10% длины окружности, что недостаточно для точного прилегания к эллипсу. Вот почему другие вопросы, предложенные @ Demi-Lune, не сработали для меня; все они имеют очень чистые, острые края, и findContours находит хороший единственный контур, который покрывает весь периметр каждой фигуры, но этого не происходит для моего более грязного изображения. Итак, каков наилучший способ установить эллипс отсюда?

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

почему бы вам не сделать что-то вроде «закрыть», а затем «открыть», чтобы очистить весь беспорядок.

Необработанное изображение:

Raw image

Отсу:

Otsu

Закрыть + открыть;оба с ядром 7х7;Двоичное изображение - это красота и чистота.

Close + Open

Обнаружен только один контур:

One contour

Эллипсэто как: (пожалуйста, не считайте, что ваше изображение имеет форму круга, поэтому эллипс должен иметь форму круга)

Ellipse

1 голос
/ 11 апреля 2019

Если объект имеет форму круга, тогда используйте cv2.minEnclosingCircle.Или вы можете использовать cv2.fitEllipse, чтобы найти наиболее подходящий эллипс вокруг объекта.Не забудьте найти контур с белым объектом на черном фоне.

import cv2
import numpy as np

img = cv2.imread("1.jpg")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
thresh = cv2.bitwise_not(thresh)

element = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=(5, 5))

morph_img = thresh.copy()
cv2.morphologyEx(src=thresh, op=cv2.MORPH_CLOSE, kernel=element, dst=morph_img)

contours,_ = cv2.findContours(morph_img,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

areas = [cv2.contourArea(c) for c in contours]
sorted_areas = np.sort(areas)

#bounding box (red)
cnt=contours[areas.index(sorted_areas[-1])] #the biggest contour
r = cv2.boundingRect(cnt)
cv2.rectangle(img,(r[0],r[1]),(r[0]+r[2],r[1]+r[3]),(0,0,255),2)

#min circle (green)
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
cv2.circle(img,center,radius,(0,255,0),2)

#fit ellipse (blue)
ellipse = cv2.fitEllipse(cnt)
cv2.ellipse(img,ellipse,(255,0,0),2)


cv2.imshow("morph_img",morph_img)
cv2.imshow("img", img)
cv2.waitKey()

enter image description here enter image description here

0 голосов
/ 11 апреля 2019

После применения адаптивного порога к изображению вы можете использовать морфологические операции , чтобы сгладить ваше изображение с cv2.erode() и cv2.dilate().Выполнив эти операции, вы сможете изолировать изображение основного круга и удалить мелкие частицы шума.Затем вы можете найти круг на изображении, используя cv2.findContours() и фильтруя по контуру максимального размера.Это даст вам координаты ограничительной рамки, где вы можете найти центр круга.Когда у вас есть координаты центра, вы можете приспособить свое затмение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...