如何检测透明容器中的水位?

时间:2015-10-20 13:40:19

标签: python-2.7 opencv image-processing

Original image

我使用opencv-python库进行液位检测。到目前为止,我能够将图像转换为灰度,并应用canny边缘检测容器已被识别。

import numpy as np
import cv2
import math
from matplotlib import pyplot as plt
from cv2 import threshold, drawContours


img1 = cv2.imread('botone.jpg')
kernel = np.ones((5,5),np.uint8)
#convert the image to grayscale
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(imgray,120,230)

I applied different threshold effect to see which edge detection is better. Apparently, the final edge detection was chosen for directly on gray-scale image.

我需要知道如何从这个阶段找到水位。 我应该尝试机器学习,还是有其他选项或算法可用?

我采取了一种方法,找出边缘检测图像中的水平线。如果水平线超过某个阈值,我可以将其视为水平。但结果不一致。

我想知道是否有其他方法可供参考或白皮书供参考?

1 个答案:

答案 0 :(得分:3)

我不知道如何使用numpyopencv来实现这一点,因为我使用的是ImageMagick(大多数Linux发行版都安装了,并且可以用于OSX和Windows),但是这个概念应该适用。

首先,我可能会选择旋转的Sobel滤波器来找到水平边缘 - 即方向滤波器。

convert chemistry.jpg -morphology Convolve Sobel:90 sobel.jpg

enter image description here

然后我可能会考虑添加Hough变换以找到水平边缘检测图像中的线条。所以,我的单线程在终端/ shell中看起来像这样:

convert chemistry.jpg -morphology Convolve Sobel:90 -hough-lines 5x5+30 level.jpg

enter image description here

如果我添加一些调试,你可以看到Sobel滤波器的系数:

convert chemistry.jpg -define showkernel=1 -morphology Convolve Sobel:90 -hough-lines 5x5+30 sobel.jpg
Kernel "Sobel@90" of size 3x3+1+1 with values from -2 to 2
Forming a output range from -4 to 4 (Zero-Summing)
 0:         1         2         1
 1:         0         0         0
 2:        -1        -2        -1

如果我添加一些调试,你可以看到检测到的行的坐标:

convert chemistry.jpg -morphology Convolve Sobel:90 -hough-lines 5x5+30 -write lines.mvg level.jpg

<强> lines.mvg

# Hough line transform: 5x5+30
viewbox 0 0 86 196
line 0,1.52265 86,18.2394  # 30      <-- this is the topmost, somewhat diagonal line
line 0,84.2484 86,82.7472  # 40      <-- this is your actual level
line 0,84.5 86,84.5  # 40            <-- this is also your actual level
line 0,94.5 86,94.5  # 30            <-- this is the line just below the surface
line 0,93.7489 86,95.25  # 30        <-- so is this
line 0,132.379 86,124.854  # 32      <-- this is the red&white valve(?)
line 0,131.021 86,128.018  # 34
line 0,130.255 86,128.754  # 34
line 0,130.5 86,130.5  # 34
line 0,129.754 86,131.256  # 34
line 0,192.265 86,190.764  # 86
line 0,191.5 86,191.5  # 86
line 0,190.764 86,192.265  # 86
line 0,192.5 86,192.5  # 86

正如我在评论中所说,请考虑更好地照亮你的实验 - 使用不同颜色的灯,更多的漫射灯,不同的方向灯。此外,如果您的实验在一段时间内发生,您可以考虑查看图像之间的差异,以查看哪条线正在移动......

以下是原始图片顶部的线条:

enter image description here