title: Opencv divide contacted circles into single
body: <p>I have an image to process.I need detect all the circles in the image.Here is it.
  <a href="https://i.stack.imgur.com/VQ77O.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/VQ77O.jpg" alt="org image"></a></p>
  
  <p>And here is my code.</p>
  
  <pre><code>import cv2
  import cv2.cv as cv
  img = cv2.imread(imgpath)
  cv2.imshow("imgorg",img)
  gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  cv2.imshow("gray",gray)
  ret,thresh = cv2.threshold(gray, 199, 255, cv.CV_THRESH_BINARY_INV)
  cv2.imshow("thresh",thresh)
  cv2.waitKey(0)
  cv2.destrotAllWindows()
  </code></pre>
  
  <p>Then,I got a image like this.
  <a href="https://i.stack.imgur.com/2Hsbp.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/2Hsbp.png" alt="enter image description here"></a></p>
  
  <p>And I tried to use erode and dilate to divided them into single.But it doesnt work.My question is how to divide these contacted circles into single,so i can detect them.</p>
  
  <p>According to @Micka's idea,I tried to process the image in following way,and here is my code.</p>
  
  <pre><code>import cv2
  import cv2.cv as cv
  import numpy as np
  
  def findcircles(img,contours):
      minArea = 300;
      minCircleRatio = 0.5;
      for  contour  in contours:
  
          area = cv2.contourArea(contour)
          if area &lt; minArea: 
              continue
  
          (x,y),radius = cv2.minEnclosingCircle(contour)
          center = (int(x),int(y))
          radius = int(radius)
          circleArea = radius*radius*cv.CV_PI;
  
          if area/circleArea &lt; minCircleRatio:
               continue;
          cv2.circle(img, center, radius, (0, 255, 0), 2)
          cv2.imshow("imggg",img)
  
  img = cv2.imread("a.png")
  cv2.imshow("org",img)
  
  gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  ret,threshold = cv2.threshold(gray, 199, 255,cv. CV_THRESH_BINARY_INV)
  cv2.imshow("threshold",threshold)
  
  blur = cv2.medianBlur(gray,5)
  cv2.imshow("blur",blur)
  
  laplacian=cv2.Laplacian(blur,-1,ksize = 5,delta = -50)
  cv2.imshow("laplacian",laplacian)
  
  kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7))
  dilation = cv2.dilate(laplacian,kernel,iterations = 1)
  cv2.imshow("dilation", dilation)
  
  result= cv2.subtract(threshold,dilation) 
  cv2.imshow("result",result)
  
  contours, hierarchy = cv2.findContours(result,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)
  findcircles(gray,contours)
  </code></pre>
  
  <p>But I dont get the same effect as @Micka's.I dont know which step is wrong.</p>