2017-02-27 66 views
2

我有這樣的灰度圖像:如何檢測opencv(C++)中的異常如果閾值不夠好?

enter image description here 我想檢測這種圖像的異常。在第一幅圖像(左上角)上,我想檢測三個點,在第二個(右上角)上有一個小圓點和一個「霧區」(右下角),最後一個在圖像中間的某處也是一個小點。

正常的靜態tresholding對我來說沒有問題,大津的方法總是最好的選擇。有沒有更好,更強大或更智能的方法來檢測這種異常?在Matlab中,我使用了類似Frangi Filtering(特徵值過濾)的東西。任何人都可以建議好的處理算法來解決像這樣的表面上的異常檢測問題嗎?

編輯:添加另一個圖像具有顯着的異常:

enter image description here

使用@Tapio的頂帽過濾和對比度adjustement。 由於@Tapio爲我們提供了一個很好的主意,就像我在開始時問的那樣,如何增加表面上的異常對比度,我向你們提供了一些結果。我曾經和這樣的形象: enter image description here

這裏是我的代碼,我如何使用高頂禮帽過濾和對比adjustement:

kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3), Point(0, 0)); 
morphologyEx(inputImage, imgFiltered, MORPH_TOPHAT, kernel, Point(0, 0), 3); 
imgAdjusted = imgFiltered * 7.2; 

其結果是在這裏:

enter image description here

有仍然質疑如何從最後的圖像中分割出異常?所以如果有人有想法如何解決它,只要把它! :) ??

+1

計算灰度圖像的平均值。高於平均值某個百分比的像素可以被聲明爲異常值 –

+2

@JeruLuke:這是一個「模式識別介紹」級別的答案,但對大津方法和特徵值過濾的參考告訴我,我們並沒有在看那個。 – MSalters

+0

您能否提供更多關於我應該關注的技巧以及如何進行模式識別?我是否也應該考慮一些「機器學習」的東西? – jok23

回答

3

你應該看看底帽過濾。它被定義爲原始圖像和圖像形態閉合的差異,並且它使得您正在尋找的小細節更加明顯。

first image pair

second image pair

third image pair

我調整對比度,使兩個圖像可見。查看強度時,異常情況更加明顯,並且更容易分解。

讓我們來看看第一個圖像:

segmentation accuracy needed

直方圖值並不代表現實由於我使用的可視化工具結垢造成的。但是相對距離呢。所以現在的閾值範圍要大得多,目標從一個窗口變成了一個穀倉門。

全球閾值(強度> 15):

After global thresholding

大津的方法處理不好在這裏。它將所有小細節分割到前景。

由形態開去除噪聲後:

After morphological opening

我還假設黑點是你感興趣的異常通過設置閾值您加入更多的表面細節。例如,第三張圖片對我來說沒有任何特別有趣的特徵,但這是您要判斷的。就像m3h0w說的那樣,知道如果你的眼睛很難判斷它對電腦來說可能是不可能的,這是一個很好的啓發。

+0

這就是你@Tapio的一些特殊工作。你能給我提供一些C++代碼嗎?你是如何解決tophat過濾和第一幅圖像的對比度調整的?我試過高帽過濾,它工作正常,但我看不到結果和你一樣好。 – jok23

+1

@Tapio,這是偉大的工作。帶有閾值的直方圖可視化是否覆蓋了您創建的某個東西,或者是某種原型工具? – m3h0w

+0

@Tapio我加了一個我的結果,因爲你建議使用高帽和調整。您能否向我們提供您對該結果的評論,並向我們提供一些額外的建議以改進它們? – jok23

2

@ skoda23,我會嘗試用模糊部分的微調參數進行反銳化遮罩,以便高頻得到強調和徹底測試,以便在此過程中不會丟失重要信息。請記住,期望電腦做超人類工作通常不是個好主意。如果一個人懷疑異常在哪裏,電腦將不得不這樣做。因此,首先對圖像進行預處理非常重要,這樣異常對於人眼而言是顯而易見的。模糊掩蔽(或加法)的替代方法可能是CLAHE。但是,請記住仔細調整它 - 它可能會過多地影響電路板的質感,並干擾您的工作。

基本閾值或Otsu的替代方法將是AdaptiveThreshold()這可能是一個好主意,因爲您想要查找的不同區域之間的亮度值存在差異。

我的第二個猜測將首先使用固定值thresholding爲最黑暗的點,然後嘗試索貝爾,或坎尼。應該存在一個最佳的鄰居,其中董事會的質地不會發光和異常會發光。您也可以在邊緣檢測之前嘗試模糊(如果您使用閾值檢測到小缺陷)。

再次說明:對於此任務的每一步都要進行大量實驗,因爲對參數進行微調對於最終成功至關重要。我建議與the trackbar交朋友,以加快這個過程。祝你好運!

+0

我同意所有的說法。但我仍然無法通過軌道條找到正確的參數。我試圖解決像@MSalters所說的真實世界是「模擬」的問題。我在帖子中添加了一個額外的圖像。請快速查看。你能推薦我嗎?這裏最好的過濾應該是什麼。我目前正在嘗試使用自適應閾值,但無法很好地調整它:/ – jok23

+1

@ skoda23如果您向我們提供顯示哪些異常要檢測哪些異常以及哪些異常正常並且應該是省略 – m3h0w

+0

我同意並添加了帶有明顯異常的圖像。 – jok23

2

你基本上是在處理現實是模擬的不幸事實。閾值是將模擬量程變爲離散(二進制)量程的一種方法。 任何閾值將做到這一點。那麼,對於一個「足夠好」的門檻,你究竟意味着什麼?

讓我們停下來想一下。我看到很多異常情況 - 一種很薄的灰色蠕蟲。顯然,你忽略了它們。我正在應用不同的門檻,然後你是。這可能是合理的,但是您正在應用我沒有的領域知識。

我懷疑這些灰蟲會拋棄你的固定值閾值。這並不是說固定閾值的概念是不好的。您可以使用它找到一些工件並排除這些工件。有些黑暗的斑塊會被遺漏,但可以通過用鄰域的中值替換每個像素,使用比這些蠕蟲的寬度更大的鄰域大小來展現。在黑暗的地方,這種做法很少,但是它抹去了小小的局部變化。

我不假裝這兩種類型的異常是唯一的兩種,但這實際上是一個應用領域的問題,而不是技術。例如。你看起來沒有任何製品(反射),至少在這3個樣品中沒有。