python opencv - detecção de blob ou detecção de círculo
Estou tendo problemas para detectar áreas circulares. Eu tentei com a função HoughCircles do opencv. No entanto, embora as imagens sejam bastante semelhantes, os parâmetros para a função precisam ser diferentes para detectar os círculos.
Outra abordagem que tentei foi percorrer todos os pixels e verificar se o pixel atual é branco. Se for esse o caso, verifique se há um objeto de blob na área (distância ao centro do blob menor que um limite). Se houver, acrescente o pixel ao blob; caso contrário, crie um novo blob. Isso também não funcionou corretamente.
Alguém tem uma idéia de como posso fazer isso funcionar (detecção de 90%)? Anexei uma imagem de exemplo e outra imagem onde marquei os círculos. Obrigado!
ATUALIZAR: Obrigado pela ajuda até agora! Este é o código em que adquiro os contornos e os filtrei por área:
im = cv2.imread('extract_blue.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im_gauss = cv2.GaussianBlur(imgray, (5, 5), 0)
ret, thresh = cv2.threshold(im_gauss, 127, 255, 0)
# get contours
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours_area = []
# calculate area and filter into new array
for con in contours:
area = cv2.contourArea(con)
if 1000 < area < 10000:
contours_area.append(con)
Isso funciona muito bem. Eu os desenhei na imagem:
Essa é a parte em que eu filtro por circularidade, ela fica logo abaixo do código em que eu filtro por área:
contours_cirles = []
# check if contour is of circular shape
for con in contours_area:
perimeter = cv2.arcLength(con, True)
area = cv2.contourArea(con)
if perimeter == 0:
break
circularity = 4*math.pi*(area/perimeter*perimeter)
print circularity
if 0.8 < circularity < 1.2:
contours_cirles.append(con)
No entanto, a nova lista 'contours_cirles' está vazia. Imprimi 'circularidade' no loop e os valores estão todos entre 10 000 e 100 000.
ATUALIZAÇÃO # 2: Depois de corrigir os suportes ausentes, ele está funcionando agora!
contours_cirles = []
# check if contour is of circular shape
for con in contours_area:
perimeter = cv2.arcLength(con, True)
area = cv2.contourArea(con)
if perimeter == 0:
break
circularity = 4*math.pi*(area/(perimeter*perimeter))
print circularity
if 0.7 < circularity < 1.2:
contours_cirles.append(con)
Muito obrigado pessoal! :)