2013-03-15 53 views
4

我在一個項目中工作,我需要使用白色測量板來測量水位。目前我的方法是:如何檢測測量水位的白色測量板?

  1. 分割白色儀表板。
  2. 測量儀表板上的水位。

但我會卡在分割的儀表盤。我避免使用基於顏色的分割,因爲我需要它與光線變化不變,所以我使用形態學操作來檢測邊緣。我有這個圖片:

enter image description hereenter image description here

結果從形態學操作很有前途。白色儀表板上的邊緣比其他邊緣更清晰。但我仍然沒有任何想法來適當地分割董事會。你能提出一種算法來分割電路板嗎?或者請建議您是否有不同的測量水位的算法。

這裏是我的代碼:

#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 

int main() 
{ 
    cv::Mat src = cv::imread("image.jpg"); 
    if (!src.data) 
     return -1; 

    cv::Mat bw; 
    cv::cvtColor(src, bw, CV_BGR2GRAY); 
    cv::medianBlur(bw, bw, 3); 

    cv::Mat dilated, eroded; 
    cv::dilate(bw, dilated, cv::Mat()); 
    cv::erode(bw, eroded, cv::Mat()); 
    bw = dilated - eroded; 

    cv::imshow("src", src); 
    cv::imshow("bw", bw); 
    cv::waitKey(); 
    return 0; 
} 

我使用的是C++,但我願意在Matlab/Mathematica的其他實現。

+1

是您的相機在固定的位置?量表的圖像有多少? – DCS 2013-03-15 13:10:22

+0

@DCS是的,我們可以假設攝像機位於固定位置。也許圖像的顏色會有所不同,例如:早上,晚上等。 – flowfree 2013-03-15 13:26:17

+0

如果攝像機位於固定位置,您難道不能對測量板分割進行硬編碼嗎? – 2013-03-15 13:28:58

回答

0

如果相機的確是固定的,你可以使用這種類型的快速和骯髒的方法:

im= rgb2gray(imread('img.jpg')); 
imr=imrotate(im,1); 
a=imr(100:342,150); 
plot(a) 

enter image description here

極小值是在圖中顯示的是從10(左)1 (右)在指標的範圍內。您可以使用峯值檢測器來定位它們的位置並插入它們之間的水位。 所以,有看中的圖像處理沒有真正的需要...

+0

什麼是'imr'功能?你能指點我的文檔頁面嗎?我試圖谷歌它,但我找不到它。 – flowfree 2013-03-16 11:06:14

+0

'imr'是我給出'imrotate'輸出的名稱,參見http://www.mathworks.com/help/images/ref/imrotate.html – bla 2013-03-16 17:51:10

0

爲什麼要分割儀表板呢?你只是想在圖像中找到它,就是這樣。你不需要找到段的相對位置。 5總是將是4和6

之間正如你可能已經注意到,您可以通過尋找具有高對比度的區域發現儀表盤的大致位置。使用matchTemplate,你可以找到確切的位置。 (考慮到相機是固定的,您可以跳過第一步並直接撥打matchTemplate)。