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