Python 如何正确选择液滴内部的气泡
这是温迪。图像处理相关问题。 我必须正确地选择气泡,以分析其大小并计算图像序列中的速度 原始图像Python 如何正确选择液滴内部的气泡,python,opencv,image-processing,imagej,Python,Opencv,Image Processing,Imagej,这是温迪。图像处理相关问题。 我必须正确地选择气泡,以分析其大小并计算图像序列中的速度 原始图像 图像序列 //// 在这张照片中,最大的形状是一个液滴,液滴内部包含许多微小的气泡 到目前为止,问题是: 1.由于气泡的形状被破坏,因此检测到的轮廓很少。同时,检测到大量的边缘。如何将边缘填充为轮廓(就像硬币一样,我只想要每个气泡的轮廓,而不想要气泡内的线条) 当前进度 编码(检测轮廓) gray=cv2.imread(“1000.tif”) 模糊=cv2.高斯模糊(灰色,(3,3),0) 边
图像序列 //// 在这张照片中,最大的形状是一个液滴,液滴内部包含许多微小的气泡 到目前为止,问题是: 1.由于气泡的形状被破坏,因此检测到的轮廓很少。同时,检测到大量的边缘。如何将边缘填充为轮廓(就像硬币一样,我只想要每个气泡的轮廓,而不想要气泡内的线条) 当前进度
编码(检测轮廓)
gray=cv2.imread(“1000.tif”)
模糊=cv2.高斯模糊(灰色,(3,3),0)
边缘=cv2.Canny(模糊,5,60)
cv2.imshow(“边缘”,边缘)
cv2.等待键(0)
轮廓,层次=cv2.findContours(边缘,cv2.RETR\u外部,cv2.RETR\u列表)
img=gray.copy()
cv2.等高线图(img,等高线-1,(0255),1)
cv2.imwrite(“轮廓.tif”,img)
cv2.imshow(“轮廓”,img)
cv2.等待键(0)
代码(填充孔)
im\u floodfill=sized.copy()
h、 w=边缘形状[:2]
掩码=np.0((h+2,w+2),np.uint8)
cv2.泛光填充(im_泛光填充,遮罩,(0,0),255)
im\U泛光填充\U inv=cv2。按位\U not(im\U泛光填充)
im_out=边缘| im_洪水填充_inv
cv2.imshow(“阈值图像”,边缘)
cv2.imshow(“泛光填充图像”,im_泛光填充)
cv2.imshow(“反转泛光填充图像”,im\U泛光填充\U inv)
cv2.imshow(“前景”,im_out)
cv2.等待键(0)
cv2.imwrite(“fill.jpg”,im_out)
结果将是如果这还不够清楚,请让我知道,我可以尝试更具体。谢谢您的时间。这里是Python/OpenCV中的一种方法
- 读取输入
- 变灰
- 门槛
- 把这些洞填满
- 获取轮廓和最大轮廓(尽管可能只有一个)
- 在输入的副本上绘制轮廓
- 保存结果
输入:
阈值图像: 形态填充图像: 轮廓图像:
您能否澄清您想要检测和跟踪的是什么?什么是“蒸汽”?我看到一个很大的灰色形状,我看到这个形状里面有气泡。你需要追踪哪一个?嗨,谢谢你的回复。在图片中,最大的形状是一个液滴,液滴内部包含许多微小的气泡。我必须跟踪气泡并分析它们在每张图片中的速度。你总共有多少张图片?也许手动标记会更快更好。最后你需要什么质量?嗨,谢谢你的建议:)你分析的形状是水滴,但我的目标是分析里面的小气泡
import cv2
import numpy as np
# read image
img = cv2.imread('vapor.jpg')
# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# threshold
#thresh = cv2.threshold(gray,5,255,cv2.THRESH_BINARY)[1]
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
# apply close morphology to fill white circles
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (45,45))
thresh_cleaned = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# get largest contour
contours = cv2.findContours(thresh_cleaned, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
big_contour = max(contours, key=cv2.contourArea)
# draw contour
result = img.copy()
cv2.drawContours(result,[big_contour],0,(0,0,255),1)
# save image with points drawn
cv2.imwrite('vapor_thresh.jpg',thresh)
cv2.imwrite('vapor_cleaned_thresh.jpg',thresh_cleaned)
cv2.imwrite('vapor_contour.jpg',result)
cv2.imshow("thresh", thresh)
cv2.imshow("thresh_cleaned", thresh_cleaned)
cv2.imshow("contour", result)
cv2.waitKey(0)
cv2.destroyAllWindows()