我试图对一组灰度图像进行图像分析,如以下图像:

主要目标是能够测量椭圆液滴的尺寸并识别它们的中心坐标。我尝试过openCV和scikit图像中的Hough循环变换。到目前为止,我所看到的关于scikit的所有例子都比openCV运行得慢。
我在这段代码中取得了一定的成功(摘自本例):
img = read_img[600:,:]
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,30,
param1=45,param2=20,minRadius=1,maxRadius=45)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv2.imshow('detected circles',cimg)
fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(20, 20))
ax.imshow(cimg)探测到主液滴,但没能捕捉到三个较小的液滴。
我能够构造的最佳阈值是使用openCV的这些参数。
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\cv2.THRESH_BINARY,15,5)然而,我仍然无法找到更小的液滴使用上面的代码。
我有几千张图像要处理。我需要该算法能够自动找到最优参数的转换或阈值。到目前为止,我还不知道如何实现这样的东西。
任何正确执行的建议将不胜感激!
发布于 2018-07-01 18:49:19
我只是提出了一个可能的预处理步骤,而不是一个完整的解决方案。您可以在图像的绿色通道上执行自适应阈值。
代码:
img = cv2.imread('C:/Users/Jackson/Desktop/droplet.jpg', 1)
#--- Resized the image to half of its original dimension --
img = cv2.resize(img, (0, 0), fx = 0.5, fy = 0.5)
#--- I narrowed down to these values after some rigorous trial-and-error ---
th3 = cv2.adaptiveThreshold(img[:,:,1], 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY, 63, 5)
cv2.namedWindow('Original', 0)
cv2.imshow('Original', img)
cv2.namedWindow('th3', 0)
cv2.imshow('th3', th3)
cv2.waitKey()
cv2.destroyAllWindows()结果:

你可以从这里继续下去。
https://stackoverflow.com/questions/51124738
复制相似问题