В настоящее время я пытаюсь найти контуры зерен в образце отображения после применения к нему порога. На рисунке вы можете видеть, что, если эти зерна расположены очень близко друг к другу, они обнаруживаются как единый контур. Поэтому я пытаюсь разделить контуры в их самом тонком сечении. Однако моя главная проблема заключается в том, что я не знаю, как работать с массивом numpy, чтобы фактически разделить контур так, чтобы в результате получилось два массива.
(Я не могу включить изображения из-за репутации, я новый пользователь)
https://imgur.com/1dtI2BV
Я попытался сделать функцию, чтобы я мог передавать контуры, найденные с помощью cv2.findContours (), чтобы разделить их, используя некоторые критерии. Я сравниваю расстояния друг с другом и немного фильтрую их двумя факторами. В основном я получаю два индекса двух точек, где должно произойти разделение (a и b). Теперь я хочу переместить точки между ними в новый контур (массив?) И удалить эти точки из старого. Затем добавьте оба в новый список или массив, равный cv2.findContour () в результате. Я предполагаю, что моя проблема в основном не в понимании концепции типа numpy (массив).
def split(contours, ki = 0.25, ks = 0.25):
contours_new = []
for contour in contours:
dists = []
count = len(contour)
for i in range(0,count-1,1):
for j in range(i+1,count-1,1):
idist = j - i # "index-distance", to exclude neighboring points
if idist > ki*count:
p1 = contour[i][0]
p2 = contour[j][0]
d = dist(p1,p2) #calculates the distance between two points using simple pythagoras
if d <= fit_size(contour)*ks:
dists.append([d, i, j])
#print('{}-{}: {}'.format(i,j,d))
#print(dists)
if len(dists) > 0:
dists = sorted(dists, key=lambda a: a[0])
a = dists[0][1] #first point
b = dists[0][2] # second point, split bewteen these!
old = contour
new = old[a:b] # ????????????
old = np.delete(old,range(a,b,1)) # ????????????
# i = 0
# new = []
# while a < (b - i):
# new.append(old.pop(a))
# i = i + 1
contours_new.append(old)
contours_new.append(new)
else:
contours_new.append(contour)
print('OLD: {} - NEW: {}'.format(len(contours),len(contours_new)))
return contours_new
Передача результата моей функции рисования (которая отлично рисует контуры, найденные cv2.findContours ()), приводит к ошибке:
ошибка: (-215: утверждение не выполнено) npoints> 0 в функции 'cv :: drawContours'