2016-08-11 12 views
5

का उपयोग करके अनियमित आकार का पता लगाना मैं वर्तमान में छवियों पर सर्कल का पता लगाने कर रहा हूं, लेकिन कुछ बूंद मर्ज करते हैं और कुछ अनियमित आकार (मूल छवि में लाल अंक) बनाते हैं। मैं सर्कल का पता लगाने के लिए opencv में houghcircle समारोह का उपयोग कर रहा हूँ। उन अनियमित आकारों के लिए, फ़ंक्शन केवल उन्हें कई छोटी मंडलियों के रूप में पहचान सकता है, लेकिन मैं वास्तव में प्रोग्राम को एक बड़े आकार के रूप में अनियमित आकार पर विचार करना चाहता हूं और एक बड़ी सर्कल प्राप्त करता हूं जैसे कि मैं अपनी आउटपुट छवि में आकर्षित करता हूं।houghcircle function opencv python

Original image

Output image

मेरे कोड सभी हलकों का पता लगाने और उनमें से व्यास मिल जाएगा।

def circles(filename, p1, p2, minR, maxR): 
# print(filename) 
img = cv2.imread(filename, 0) 
img = img[0:1000, 0:1360] 
l = len(img) 
w = len(img[1]) 

cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) 

circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 25, 
          param1 = int(p1) ,param2 = int(p2), minRadius = int(minR), maxRadius = int(maxR)) 

diameter = open(filename[:-4] + "_diamater.txt", "w") 
diameter.write("Diameters(um)\n") 
for i in circles[0,:]: 
    diameter.write(str(i[2] * 1.29 * 2) + "\n") 

count = 0 
d = [] 
area = [] 
for i in circles[0,:]: 
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2) 
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3) 
    count += 1 
    d += [i[2]*2] 
    area += [i[2]*i[2]*pi*1.286*1.286] 

f = filename.split("/")[-1] 
cv2.imwrite(filename[:-4] + "_circle.jpg", cimg) 

# cv2.imwrite("test3/edge.jpg", edges) 
print "Number of Circles is %d" % count 

diaM = [] 
for i in d: 
    diaM += [i*1.286] 

bWidth = range(int(min(diaM)) - 10, int(max(diaM)) + 10, 2) 

txt = ''' 
Sample name: %s 
Average diameter(um): %f  std: %f 
Drop counts: %d 
Average coverage per drop(um^2): %f  std: %f 
''' % (f, np.mean(diaM), np.std(diaM), count, np.mean(area), np.std(area)) 

fig = plt.figure() 
fig.suptitle('Histogram of Diameters', fontsize=14, fontweight='bold') 
ax1 = fig.add_axes((.1,.4,.8,.5)) 
ax1.hist(diaM, bins = bWidth) 
ax1.set_xlabel('Diameter(um)') 
ax1.set_ylabel('Frequency') 
fig.text(.1,.1,txt) 
plt.savefig(filename[:-4] + '_histogram.jpg') 
plt.clf() 

print "Total area is %d" % (w*l) 
print "Total covered area is %d" % (np.sum(area)) 

rt = "Number of Circles is " + str(count) + "\n" + "Coverage percent is " + str(np.divide(np.sum(area), (w*l))) + "\n" 
return rt 

उत्तर

1

आप अभी भी HoughCircles समारोह का उपयोग करना चाहते हैं, तो आप सिर्फ अगर दो हलकों ओवरलैप देख सकते हैं और उनमें से बाहर एक नई मंडली बना सकता है:

यहाँ मेरी कोड है।

+0

मुझे लगता है कि जिस तरह से कोशिश की है, लेकिन वहाँ एक दूसरे के बगल में कई अन्य मंडलियां हैं। तो यह बहुत अच्छी तरह से काम नहीं करता है। फिर भी धन्यवाद। –

1

आप इसके लिए minEnclosingCircle का उपयोग कर सकते हैं। अपनी छवि के रूपों को ढूंढें, फिर आकृतियों को सर्कल के रूप में पहचानने के लिए फ़ंक्शन को लागू करें।

नीचे एक सी ++ कोड के साथ एक साधारण उदाहरण है। आपके मामले में, मुझे लगता है कि आपको हौ-सर्कल और मिनी एन्क्लोसिंगक्रिकल के संयोजन का उपयोग करना चाहिए, क्योंकि आपकी छवि में कुछ मंडल एक दूसरे के बहुत करीब हैं, एक मौका है कि उन्हें एक समोच्च के रूप में पहचाना जा सकता है।

इनपुट छवि:

input

हलकों:

output

Mat im = imread("circ.jpg"); 
Mat gr; 
cvtColor(im, gr, CV_BGR2GRAY); 
Mat bw; 
threshold(gr, bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); 

vector<vector<Point>> contours; 
vector<Vec4i> hierarchy; 
findContours(bw, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
for(int idx = 0; idx >= 0; idx = hierarchy[idx][0]) 
{ 
    Point2f center; 
    float radius; 
    minEnclosingCircle(contours[idx], center, radius); 

    circle(im, Point(center.x, center.y), radius, Scalar(0, 255, 255), 2); 
} 
0

आप इस तरह के सुंदर अच्छी तरह से अलग कर दिया और विषम पैटर्न है, तो सबसे आसान तरीका आकार अनुक्रमित उपयोग करने के लिए किया जाएगा । this paper या this poster देखें। दोनों स्थितियों में आपके पास आकृति अनुक्रमणिका की एक सूची है।

धन्यवाद अनुक्रमित आकार देने के लिए, तुम क्या पालन कर सकते हैं:

  • बाइनरी छवि
  • आदेश प्रत्येक पैटर्न
  • गणना आकार अनुक्रमित अलग करने के लिए (उनमें से ज्यादातर बुनियादी उपायों का उपयोग)
  • में
  • जुड़े घटक लेबलिंग
  • आकृति अनुक्रमणिका मानों के अनुसार पैटर्न वर्गीकृत करें।

अपने विशिष्ट मामले में गोल आकार बिल्कुल गोल कर रहे हैं, मैं निम्नलिखित आकार अनुक्रमित का प्रयोग करेंगे:

  • घेरा => सिर्फ त्रिज्या, तो सबसे आसान गणना और अपने मामले में सही करने के लिए इस्तेमाल करते हैं।
  • विस्तार/विस्तार/त्रिज्या द्वारा खींचना => आपके मामले में बिल्कुल सही है लेकिन सभी पुस्तकालयों में मिनियम बॉल गणना उपलब्ध नहीं है।
  • आईएसओ-पेरीमेट्रिक घाटा => गणना करने में वास्तव में आसान है, लेकिन परिधि की वजह से परिपत्र की तुलना में थोड़ा कम स्थिर है।

इसके अलावा अपने मामले में काम:

  • गैप खुदा डिस्क
  • मोर्टन की प्रसार व्यास द्वारा
  • डेफिसिट
  • एक्सटेंशन