2017-07-25 4 views
5

J'ai une image dans laquelle j'essaie d'appliquer des transformations de cercle Hough aux objets circulaires en vue.Hough cercle transformer en ombre circulaire

J'ai de la difficulté à trouver un cercle qui s'adapte à l'ombre extérieure du cyclindre. Que peut-on faire pour segmenter correctement cette ombre et y insérer facilement un cercle?

code:

img = cv2.medianBlur(im,7) 
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) 

plt.imshow(cimg) 
plt.show() 

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20, 
          param1=50,param2=150,minRadius=100,maxRadius=0) 

circles = np.uint16(np.around(circles)) 

for i in circles[0,:]: 
    # draw the outer circle 
    cv2.circle(cimg,(i[0],i[1]),i[2],(255,0,0),10) 
    # draw the center of the circle 
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),20) 

    radius = i[2] 
    print 'radius', radius, 'px' 

plt.imshow(cimg) 
plt.show() 
+0

vous voulez dire que "croissant" zone à en haut de l'image? – Micka

+0

Oui- l'ombre sombre présente dans la moitié supérieure de l'image. – Sam

+0

Pouvez-vous fournir l'image d'entrée? –

Répondre

2

Je vais juste écrire le code et ne pas le passer parce qu'il y a beaucoup de fonctions et je détesterais supposer ce que vous savez ou ne savez pas et passer beaucoup de temps à faire l'écriture. Si vous avez des questions n'hésitez pas à demander et je vais les ajouter à la poste.

Vous m'avez demandé d'ajuster un cercle aux ombres en croissant, j'ai donc inséré des cercles dans les ombres. Il est important de réaliser que dans une sorte de code de production qui, j'imagine, doit traiter beaucoup d'images de cette nature, il faudrait affiner les cercles ajustés. En particulier, tout type d'analyse structurelle de ce type est juste préoccupé par l'ajustement de la forme donnée aux pixels, pas que l'objet en question soit ce que vous cherchez.

J'ai intentionnellement laissé le cercle mal ajusté là-dedans. Je suggère d'aller pour le enveloppe convexe, ou un détecteur Haar ou correspondant de forme en fonction de ce que vous êtes exactement intéressé.

import cv2 
import numpy as np 

img = cv2.imread("orig.png", cv2.IMREAD_GRAYSCALE) 

ret, thresh = cv2.threshold(img, 80, 255, cv2.THRESH_BINARY_INV) 

ero = cv2.erode(thresh, np.ones((5,5))) 
dil = cv2.dilate(ero, np.ones((5,5))) 

img, contours, hierarchy = cv2.findContours(dil, cv2.RETR_EXTERNAL, 
              cv2.CHAIN_APPROX_NONE) 

#just for drawing purposes, the cimg is not really required 
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 
for cnt in contours: 
    (x, y), radius = cv2.minEnclosingCircle(cnt) 
    center = (int(x), int(y)) 
    radius = int(radius) 
    cv2.circle(cimg, center, radius, (255, 0, 0), 1) 

L'image de sortie je suis arrivé était

enter image description here

Les deux Croissants sont équipés à correctement avec le fond correspondant à l'extérieur du réservoir et non le croissant exactement. Vous pouvez effectuer une sorte de suivi de l'hystérésis et déplacer ce cercle jusqu'à ce que son bord extérieur soit précisément au croissant.

Un cercle supplémentaire peut être supprimé si vous réglez les paramètres correctement, mais que le filtrage des cercles dont vous avez besoin dépend de vous. F.e. si vous voulez seulement le croissant supérieur demander la plus petite coordonnée y, si toutes les ombres sont aussi grandes que celles-ci vous pouvez demander seulement des cercles de rayons plus grands qu'un certain seuil etc ...

2

L'ombre que vous cherchez à segmenter est de loin la région la plus sombre. J'utiliserais un seuil pour filtrer tous les pixels qui sont plus brillants. S'il reste du bruit, j'utiliserais les composants connectés pour trouver le plus gros "blob". Une fois que l'ombre est la seule chose qui reste et tous les autres pixels sont mis à 0, j'essaierai le minEnclosingCircle que dhanushka recommandé ci-dessus.