2017-02-13 4 views
0

my photo is here. Я ищу лучшее решение или алгоритм для обнаружения части эллипса (тарелки) на этой фотографии и маскировки его на другой фотографии в Opencv. Не могли бы вы дать мне несколько советов или решений. и мой код:Обнаружение эллипса в opencv python

circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1.2, 1, param1=128, minRadius=200, maxRadius=600) 
    # draw detected circles on image 
    circles = circles.tolist() 
    for cir in circles: 
     for x, y, r in cir: 
      x, y, r = int(x), int(y), int(r) 
      cv2.circle(img, (x, y), r, (0, 255, 0), 4) 

    # show the output image 
    cv2.imshow("output", cv2.resize(img, (500, 500))) 
+1

You здесь не требуется обнаружение эллипса (кстати, не доступно в OpenCV). Вероятно, вы хорошо справляетесь с простым порогом ярких значений и сохраняете самый большой подключенный компонент. Также, пожалуйста, покажите, что вы пробовали – Miki

+0

Простая сегментация цвета может работать. – ZdaR

+0

Я добавляю специальную часть кода, которая связана с моим вопросом, вы бы посмотрели это плз. –

ответ

1

Существует альтернатива для него в skimage сделана Xie, Yonghong, and Qiang Ji и опубликовано в виде ...

«Новый эффективный метод обнаружения эллипса.» Pattern Recognition, 2002. Трудов. 16-я Международная конференция. Том 2. IEEE, 2002.

Их код обнаружения эллипса относительно медленный, и пример занимает около 70 секунд; по сравнению с заявленным сайтом «28 секунд».

Если у вас есть Конда или пип: «имя» установить scikit-образ и дать ему шанс ...

Их код можно найти here или копировать/вставить ниже:

import matplotlib.pyplot as plt 

from skimage import data, color, img_as_ubyte 
from skimage.feature import canny 
from skimage.transform import hough_ellipse 
from skimage.draw import ellipse_perimeter 

# Load picture, convert to grayscale and detect edges 
image_rgb = data.coffee()[0:220, 160:420] 
image_gray = color.rgb2gray(image_rgb) 
edges = canny(image_gray, sigma=2.0, 
       low_threshold=0.55, high_threshold=0.8) 

# Perform a Hough Transform 
# The accuracy corresponds to the bin size of a major axis. 
# The value is chosen in order to get a single high accumulator. 
# The threshold eliminates low accumulators 
result = hough_ellipse(edges, accuracy=20, threshold=250, 
         min_size=100, max_size=120) 
result.sort(order='accumulator') 

# Estimated parameters for the ellipse 
best = list(result[-1]) 
yc, xc, a, b = [int(round(x)) for x in best[1:5]] 
orientation = best[5] 

# Draw the ellipse on the original image 
cy, cx = ellipse_perimeter(yc, xc, a, b, orientation) 
image_rgb[cy, cx] = (0, 0, 255) 
# Draw the edge (white) and the resulting ellipse (red) 
edges = color.gray2rgb(img_as_ubyte(edges)) 
edges[cy, cx] = (250, 0, 0) 

fig2, (ax1, ax2) = plt.subplots(ncols=2, nrows=1, figsize=(8, 4), sharex=True, 
           sharey=True, 
           subplot_kw={'adjustable':'box-forced'}) 

ax1.set_title('Original picture') 
ax1.imshow(image_rgb) 

ax2.set_title('Edge (white) and result (red)') 
ax2.imshow(edges) 

plt.show() 
2

ПОДХОД 1:

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

КОД:

#--- First obtain the threshold using the greyscale image --- 
ret,th = cv2.threshold(gray,127,255, 0) 

#--- Find all the contours in the binary image --- 
_, contours,hierarchy = cv2.findContours(th,2,1) 
cnt = contours 
big_contour = [] 
max = 0 
for i in cnt: 
    area = cv2.contourArea(i) #--- find the contour having biggest area --- 
    if(area > max): 
     max = area 
     big_contour = i 

final = cv2.drawContours(img, big_contour, -1, (0,255,0), 3) 
cv2.imshow('final', final) 

Это то, что я получил:

enter image description here

ПОДХОД 2:

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

Вы должны предварительно обработать изображение. Я выполнил адаптивный порог и получил это:

enter image description here

Теперь вы можете выполнять обнаружение окружности Хафа на этом изображении.

Надеюсь, что это не глоток! : D

+0

спасибо, дорогие за помощь, но моя проблема в том, что я не могу использовать контур. Метод области Я пытаюсь сделать это с преобразованием HoughCircles, но моя проблема в том, что я не могу нарисовать эллипс вокруг моего блюда. вы мне поможете как я могу это сделать с помощью этого алгоритма? Заранее спасибо –

+0

Вы можете попробовать обнаружить круг, используя преобразование Хафа на втором изображении, которое я разместил. Дайте ему попробовать –

+1

Небольшой намек: HoughCircles не обнаруживает эллипсы ... просто круги;) @Moh – Miki