2015-10-20 65 views
1

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.

我需要知道如何找到這個階段水位。 我應該嘗試機器學習,還是有其他選項或算法可用?

我採取了找出邊緣檢測圖像中的水平線的方法。如果水平線越過某個閾值,我可以將其視爲水平。但結果不一致。

我想知道是否有其他方法可以與白皮書一起參考?

+3

如何關於向我們展示幾幅樣本圖片?和你當前的代碼。 –

+0

我不清楚你想要測量什麼。我不是化學家,但我可以在圖片左側看到一個倒轉的梨形玻璃物,它看起來有兩個水位,右邊是一個高大的狹窄的,直邊的,可能是玻璃的東西。在它裏面似乎也有兩個水位......你想要哪四項? –

+0

對不起,我應該只保留裁剪圖像。那麼我只是想找出倒置的梨形玻璃的液位。正如你可以看到其中2個水位,上面的是實際的水位。這是肉眼難題本身的複雜性,很難弄清哪一個是水位。這只是我拍攝的示例圖像,我希望我的算法能夠識別任何透明物體中的液位,並給出深色,恆定的背景。 – DarshanJoshi

回答

3

我不知道你會怎麼做,numpyopencv,因爲我使用ImageMagick(它安裝在大多數Linux發行版上,可用於OSX和Windows),但這個概念應該適用。

首先,我可能會去索貝爾濾波器旋轉找到水平邊緣 - 即方向濾波器。

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

enter image description here

然後我可能會看看添加一個Hough變換找到水平邊緣檢測圖像中的線條。所以,我的一行看起來像這樣在終端/殼:

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 "[email protected]" 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

+1

非常感謝。讓我試試opencv中的相同步驟。我想這應該工作。顯然,我只是在今天開始使用Sobel過濾器。 – DarshanJoshi