Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何正确选择液滴内部的气泡_Python_Opencv_Image Processing_Imagej - Fatal编程技术网

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)
结果将是

  • 气泡的速度是我的目标。我尝试将二值图像序列放入Iamgej中,并使用“trackmate”(一种用于自动和半自动粒子跟踪的工具)。它有一个固定的气泡大小设置来跟踪,但是,在我的例子中,气泡的大小是非常不同的,所以有没有任何方法来跟踪气泡移动

  • 如果这还不够清楚,请让我知道,我可以尝试更具体。谢谢您的时间。

    这里是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()