현재이 이미지와 같은 원 감지를하고 있지만 일부 얼룩이 병합되어 불규칙한 모양 (원본 이미지의 빨간색 표시)을 형성합니다. opencv에서 원을 감지하기 위해 houghcircle 함수를 사용하고 있습니다. 이러한 불규칙한 모양의 경우 함수는 여러 개의 작은 원으로 만 감지 할 수 있지만 프로그램에서 불규칙한 모양을 전체 큰 모양으로 간주하여 출력 이미지에서 그리는 것처럼 큰 원을 얻길 원합니다. houghcircle 함수를 사용하여 불규칙한 모양을 감지했습니다. opencv python
는내 코드는 모든 원을 감지하고 그 직경을 얻을 것이다. 여전히 HoughCircles 기능을 사용하려면, 당신은 단지 두 개의 원이 겹쳐 있는지 확인하고 밖으로 새로운 원을 만들 수
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
직경에 의해