我的实验涉及对物质施加压力,使该物质最终破裂。裂纹随着时间和施加的压力而扩大。我有一个设置,可以以固定的时间间隔拍摄该物质的照片。
我需要测量裂纹增长的速度。我该怎么做? (我可以用Python编码)。
Google 云端硬盘链接到拍摄的一系列照片 - https://drive.google.com/open?id=189cv8B4rm3lhSgT6OYfI_aN0Xmqi-tYi
请多多指教。
我根据这个问题的建议尝试了 OpenCV 的洪水填充。但返回的掩码如图所示:
h, w = resized.shape[:2]
mask = np.zeros((h+2, w+2), np.uint8)
seed = (int(w/2),int(h/2))
# Floodfill from point (0, 0)
num,im,mask,rect = cv2.floodFill(resized, mask, (0,0), (255,0,0), (10,)*3, (10,)*3, floodflags)
我想如果我可以获得包围裂缝的矩形边界框的坐标,我就可以跨帧跟踪它的坐标并测量裂缝的大小并最终测量速度。
我尝试了如下阈值处理:
th, im_th = cv2.threshold(im, 100, 255, cv2.THRESH_BINARY);
我不确定这是否能让我过滤掉背景并单独在裂缝上绘制一个边界框。请指教。
提前致谢。
最佳答案
根据裂缝形成的速度,您可能不需要视频;无论如何,您可能最终会对每 X 帧进行采样,并丢弃所有额外的帧。您想要的是足够的帧来获得裂缝中的“增量”变化,而又不会获得太多的帧,以免计算成本过高。
如果您可以仔细控制设置中的照明条件,那么您很幸运!这成为一个非常简单的问题。您可以获取像素的直方图(openCV 有处理此功能的句柄,但 PIL 和 numpy 也有);你应该有两个颜色家族;一种是物质外部的颜色,另一种是由于裂缝中的阴影而产生的偏差。
您还可以尝试显着增加每个图像/帧的对比度,以获得裂缝的二进制掩模,或运行 edge detector在图像上方。这些技术将产生比原始素材更容易处理的帧。您甚至可以将它们输入到骨架化过程中,以便在 XY 图像坐标中生成基于矢量的线条表示。
如果您无法控制照明,或者样本的颜色与裂缝相似,您可能需要使用 object detection技术,但不太可能存在现有的“裂纹检测器”,因此您可能需要构建自己的检测器,或者寻找其他检测器作为形成裂纹的颜色和形状的良好代理。
如果可能的话,我强烈建议尝试第一个选项;像素和直方图数学比其他技术容易得多。
关于python - 从视频中测量裂纹的增长速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58790467/