使用OpenCV Python、显微视频

2024-09-27 09:33:47 发布

您现在位置:Python中文网/ 问答频道 /正文

当我使用scikit框架时,我有一个执行缓慢的Imshow,这是因为下面的代码吗

while True:
    ret, frame = offlinevid.read()
    frame = cv2.resize(frame, size, interpolation = cv2.INTER_AREA)
    # Test Processing
    imgforprocessing = img_as_float(frame)
    sigma_est = np.mean(estimate_sigma(imgforprocessing, multichannel = True))
    nlm = denoise_nl_means(imgforprocessing, h = 1.5*sigma_est, fast_mode=True, patch_size = 5, patch_distance= 3, multichannel = True)
    #cv2.imshow("Test", nlm) 
    cv2.imshow("Test", frame)

我想像普通的30fps视频一样播放,但当我加入去噪的意思时,它只是下降到每秒5帧。我怎样才能改进它

编辑:我应该提供更多信息。当我移除去噪nl_意味着,视频播放帧速率恢复正常。我想使用去噪,因为我正在处理有很多噪声的显微图像。是否有一个OpenCV函数可以让我像去噪一样去做

我尝试过变形脊线检测

ridge_filter = cv2.ximgproc.RidgeDetectionFilter_create(cv2.CV_32FC1, 1, 1 , 3, cv2.CV_8UC1, 1, 0 , cv2.BORDER_DEFAULT)
    ridges = ridge_filter.getRidgeFilteredImage(frame)

    blank_mask = np.zeros(frame.shape, dtype=np.uint8)
    thresh = cv2.threshold(ridges, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
    opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)  

    inverse = 255 - opening
    inverse = cv2.merge([inverse,inverse,inverse])
    removed_artifacts = cv2.bitwise_and(frame,frame,mask=opening)

去除的_伪影仍然有来自显微图像的噪声。 这只是一个例子Image 结果非常嘈杂。有没有关于如何移除它们的建议


Tags: testtruesizenlnpnlmcv2frame
1条回答
网友
1楼 · 发布于 2024-09-27 09:33:47

当面临性能问题时,首先要做的是测量发生了什么,以便明智地将时间花在优化关键部件上。不管我回答的其余部分如何,请测量捕获时间和处理时间。您可以通过注释处理来测量捕获时间。您可以通过注释捕获并重复处理静态的代表性帧来测量处理时间

如果您的代码以每秒30帧的速度运行而不进行处理,我们可以推断采集可能需要33毫秒——尽管您应该对其进行测量

如果代码以5fps的速度运行并进行处理,这意味着每帧200ms,因此我们可以推断处理需要167ms,即200ms-33ms

因此,您的最佳选择是:

  • 找到一个同样有效和更快的等效算法,或者
  • 尝试使用多处理将帧循环发送到(比如)4个CPU内核中的每一个,因此希望每42ms(167/4)返回一个去噪帧,这意味着您可能希望接近20-25 fps

进一步,你应该考虑提供一个强的实际的图像,而不是你的组合结果的屏幕抓取,这样人们就可以在代表性数据上运行测试,甚至知道你的图像的大小。处理数据的实际图像也有助于评估降噪性能。如果您包含import语句,以便人们知道您使用的是哪些模块,那么它也会更好

相关问题 更多 >

    热门问题