Обнаружить контуры мух на белом фоне (липкая ловушка), которая оставляет серые пятна - PullRequest
0 голосов
/ 28 апреля 2020

Итак, я пытаюсь определить контуры мух на белой ловушке, а затем обрезать их по разным фотографиям. Но я получаю контуры пятен на ловушке, и некоторые мухи не обнаруживаются. Также мне не нужны зеленые цветные линии ловушки. Мой вопрос, есть ли способ убедиться, что я получаю контуры всех мух и только файлов?

код:

image = cv2.imread('test3.jpeg') 
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  
ret,thresh = cv2.threshold(gray,100,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)  

пример изображения

enter image description here

результат с текущим кодом

enter image description here

1 Ответ

2 голосов
/ 28 апреля 2020

Использовать преобразование цветового пространства в HSV и морфологические операции:

import cv2

img1 = cv2.imread('flys.jpg')
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (6,6))
img=cv2.cvtColor(img1, cv2.COLOR_BGR2HSV)
mask=cv2.threshold(img1[:,:,2], 85, 255, cv2.THRESH_BINARY)[1] 
mask = cv2.dilate(mask, kernel, iterations = 2)
mask = cv2.erode(mask, kernel, iterations = 7)

mask=cv2.bitwise_not(mask)
output = cv2.connectedComponentsWithStats(mask, 4, cv2.CV_32S)
print('number of flies: ', output[0])
for i in range(1, output[0]):
    x,y,w,h,s=output[2][i]
    img_crop=img1[y:y+h, x:x+w,:]
    cv2.imwrite(str(i)+'_crop_fly.jpg', img_crop)
mask=cv2.cvtColor(mask,cv2.COLOR_GRAY2BGR)


mask[:,:,1]=0
dst = cv2.addWeighted(img1, 0.7, mask, 0.3, 0.0)
cv2.imshow('test', dst)
cv2.imwrite('out_fly.jpg', dst)

enter image description here

...