【发布时间】:2021-04-10 04:26:32
【问题描述】:
我正在开展一个项目,该项目涉及确定密闭空间中透明液体(或空气,如果证明更容易的话)的体积。 我正在使用的图像是没有任何液体的容器的背景图像和前景图像,在极少数情况下也可能是空的,但大多数时候部分填充了一定量的液体。
虽然这似乎是一种非常简单的平滑和阈值方法,但事实证明它有点困难。 我正在使用一组包含大量背景和前景图像的图像对,但我似乎无法找到一种足够强大的方法来应用于集合中的所有图像。 到目前为止,我的工作涉及对图像进行平滑和阈值处理,并应用关闭来包裹它。
bg_image = cv.imread("bg_image", 0)
fg_image = cv.imread("fg_image", 0)
blur_fg = cv.GaussianBlur(fg_image, (5, 5), sigmaX=0, sigmaY=0)
thresholded_image = cv.threshold(blur_fg, 186, 255, cv.THRESH_BINARY_INV)[1]
kernel = np.ones((4,2),np.uint8)
closing = cv.morphologyEx(thresholded_image, cv.MORPH_CLOSE, kernel)
结果各不相同,这里是一个顺利的例子:
在其他示例中,情况并非如此:
除此之外,我也尝试过:
- 背景和前景图像的减法
- 对比拉伸
- 直方图均衡化
- 其他阈值技术,例如 Otsu
主要问题是空气和液体中的像素强度有时会重叠(通常对比度很低),导致估计不准确。我倾向于利用液体和空气之间的边缘,但我不确定如何..
我不想在这里过多地介绍信息,所以我将其留在那里。我很感激任何建议,如有需要可以提供更多信息。
编辑:
这里有一些示例图片可供使用。
【问题讨论】:
-
我倾向于利用液体和空气之间的边缘,但我不确定如何。从三个给定的图像看来,提到的与周围的两个区域相比,“边缘”相当暗。您是否尝试过构建一些渐变图像(仅限水平渐变),例如也用于边缘检测(Canny、Sobel)?另外,请发布一些实际的输入图像(不是那些情节),以便这里的人们可以玩耍。
-
我用过Canny边缘检测,但还没有构建渐变图像。但是如果说可以挑出一个清晰的边缘,这对估计数量有什么帮助呢?我的想法是它可以用来确定有液体的区域的长度。另一种方法可能是将一些适应的阈值应用于由边缘分隔的不同区域。我添加了两对输入图像。
标签: image-processing image-segmentation opencv-python image-thresholding