dosya97
@dosya97
Fullstack web-developer

Как разделить прилипшие контуры в opencv?

Привет, возникла проблема при распознавании монеток. Не получается разделить прилипшие объекты. Пробовал менять параметры функции dilate(), erode(). Отделяется, но возникает ошибка с другими примерами, где есть пересветы (Где сердцевина монеты выцветает). Делаю closing() - прилипают.
import cv2
import numpy as np
from matplotlib import pyplot as plt
imgs = [ 
         "P1000697s.jpg", 
         "P1000698s.jpg", 
         "P1000699s.jpg", 
         "P1000703s.jpg", 
         "P1000705s.jpg", 
         "P1000706s.jpg", 
         "P1000709s.jpg",
         "P1000710s.jpg",
         "P1000713s.jpg"
       ]
img = cv2.imread("lab1assets/{img}".format(img = imgs[4]))
b,g,r = cv2.split(img)
blur = cv2.blur(r, (7, 7))
retval, threshold = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

plt.imshow(threshold, cmap="gray")
plt.show()

plt.subplot(3,1,2), plt.hist(img.ravel(), 256)
plt.axvline(x=retval, color='r', linestyle='dashed', linewidth=2)
plt.show()

print(retval)

59f642b3d8a5f857784661.png
kernelc = np.ones((1,1),np.uint8)
kernel = np.ones((20,20),np.uint8)
element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))

erosion = cv2.erode(threshold, element, iterations = 1)
dilation = cv2.dilate(erosion, element, iterations = 1)
# opening = cv2.morphologyEx(dilation, cv2.MORPH_OPEN, element)
closing = cv2.morphologyEx(dilation, cv2.MORPH_CLOSE, element)

plt.imshow(closing, cmap="gray")
plt.show()

59f642e759e42927363207.png
im2, contours, hierarchy = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
validc = []

for c in contours:
    m = cv2.moments(c)
    (x,y),radius = cv2.minEnclosingCircle(c)
    center = (int(x),int(y))
    radius = int(radius)
    if(m['m00'] <= 2*np.pi*np.square(61) and m['m00'] >= 3322):
        validc.append(c)
        cv2.circle(img,center,radius,(0,255,0),2)

# cv2.drawContours(img, validc,-1,(0,255,0),5)
cv2.putText(img,"Hello World!!!", (50,50), cv2.FONT_HERSHEY_SIMPLEX, 2, 255)

plt.imshow(img, cmap="gray")
plt.show()

59f6434fda1c7360556204.png
  • Вопрос задан
  • 1809 просмотров
Пригласить эксперта
Ответы на вопрос 2
@krox
аспирант, программист, исследователь
Попробуй запустить из примеров поиск окружностей. Неплохо бы ещё выкладывать картинку оригинал или ссылку на неё, чтобы самим можно было пробовать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы