circle函数python_使用houghcircle函数opencv python检测不规则形状

我目前正在对图像进行圆检测看起来像这样,但是一些墨滴合并并形成一些不规则的形状(原始图像中的红色标记).我在opencv中使用houghcircle函数来检测圆圈.对于那些不规则的形状,该功能只能将它们检测为几个小圆圈,但我真的希望程序将不规则形状视为一个完整的大形状并得到一个像我在输出图像中绘制的大圆圈.

我的代码将检测所有圆圈并获得它​​们的直径.

这是我的代码:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值