【问题标题】:Robust estimation of volume of transparent liquid using image processing使用图像处理鲁棒估计透明液体的体积
【发布时间】: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)

结果各不相同,这里是一个顺利的例子:

在其他示例中,情况并非如此:

除此之外,我也尝试过:

  1. 背景和前景图像的减法
  2. 对比拉伸
  3. 直方图均衡化
  4. 其他阈值技术,例如 Otsu

主要问题是空气和液体中的像素强度有时会重叠(通常对比度很低),导致估计不准确。我倾向于利用液体和空气之间的边缘,但我不确定如何..

我不想在这里过多地介绍信息,所以我将其留在那里。我很感激任何建议,如有需要可以提供更多信息。

编辑:

这里有一些示例图片可供使用。

【问题讨论】:

  • 我倾向于利用液体和空气之间的边缘,但我不确定如何。从三个给定的图像看来,提到的与周围的两个区域相比,“边缘”相当暗。您是否尝试过构建一些渐变图像(仅限水平渐变),例如也用于边缘检测(Canny、Sobel)?另外,请发布一些实际的输入图像(不是那些情节),以便这里的人们可以玩耍。
  • 我用过Canny边缘检测,但还没有构建渐变图像。但是如果说可以挑出一个清晰的边缘,这对估计数量有什么帮助呢?我的想法是它可以用来确定有液体的区域的长度。另一种方法可能是将一些适应的阈值应用于由边缘分隔的不同区域。我添加了两对输入图像。

标签: image-processing image-segmentation opencv-python image-thresholding


【解决方案1】:

这是一种方法,您可以计算图像中每列像素的平均值,然后计算平均值的梯度:

#!/usr/bin/env python3

import cv2
import numpy as np
import matplotlib.pyplot as plt

filename = 'fg1.png'

# Load image as greyscale and calculate means of each column of pixels
im = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)
means = np.mean(im, axis=0)

# Calculate the gradient of the means
y = np.gradient(means)

# Plot the gradient of the means
xdata = np.arange(0, y.shape[0])
plt.plot(xdata, y, 'bo')           # blue circles
plt.title(f'Gradient of Column Means for "{filename}"')
plt.xlabel('x')
plt.ylabel('Gradient of Column Means')
plt.grid(True)
plt.show()


如果你只绘制所有列的平均值,而不用梯度,你会得到:

【讨论】:

  • 这是一个很好的开始,但是我仍然不确定如何使用它来估计体积(黑暗区域中的像素数)。
  • 不确定我是否理解。如果过渡在第一张图像中的像素 58 和第二张图像中的像素 22 处,并且图像的宽度为 118 像素,那么肯定会在第一张图像中产生 58/118 像素,在第二张图像中产生 22/118 像素吗?跨度>
  • 哦,是的,这是真的,抱歉太稠了。有没有办法以编程方式确定液体在梯度的哪一侧? (在两个示例中,液体在一种情况下位于渐变的左侧,而在另一种情况下位于渐变的右侧。
  • 如果您查看第二个红色图,您可以看到左侧的平均像素亮度明显比右侧暗(低)。在第一个红色情节上……好吧,谁都猜猜哪一边更黑!
  • 如果您可以控制实验室设备和摄影,也许您可​​以通过选择更具对比度的背景、为液体着色、改善照明或标记底部末端来帮助自己试管...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
相关资源
最近更新 更多