我使用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)
我需要知道如何从这个阶段找到水位。 我应该尝试机器学习,还是有其他选项或算法可用?
我采取了一种方法,找出边缘检测图像中的水平线。如果水平线超过某个阈值,我可以将其视为水平。但结果不一致。
我想知道是否有其他方法可供参考或白皮书供参考?
答案 0 :(得分:3)
我不知道如何使用numpy
和opencv
来实现这一点,因为我使用的是ImageMagick(大多数Linux发行版都安装了,并且可以用于OSX和Windows),但是这个概念应该适用。
首先,我可能会选择旋转的Sobel滤波器来找到水平边缘 - 即方向滤波器。
convert chemistry.jpg -morphology Convolve Sobel:90 sobel.jpg
然后我可能会考虑添加Hough变换以找到水平边缘检测图像中的线条。所以,我的单线程在终端/ shell中看起来像这样:
convert chemistry.jpg -morphology Convolve Sobel:90 -hough-lines 5x5+30 level.jpg
如果我添加一些调试,你可以看到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
正如我在评论中所说,请考虑更好地照亮你的实验 - 使用不同颜色的灯,更多的漫射灯,不同的方向灯。此外,如果您的实验在一段时间内发生,您可以考虑查看图像之间的差异,以查看哪条线正在移动......
以下是原始图片顶部的线条: