2010-02-17 162 views
5

我實現了一些自適應二值化方法,它們使用一個小窗口,並在每個像素處計算閾值。有這些方法問題: 如果我們選擇的窗口尺寸太小,我們會得到這樣的效果(我想原因是因爲窗口尺寸小的) alt text http://i.piccy.info/i4/3d/bc/773b7df74ff7dadfd11c09372b7e.jpeg自適應閾值二值化的不良影響

在左上角有一個原始圖像,右上角 - 全局閾值結果。左下角 - 將圖像分成若干部分的示例(但我正在談論分析圖像像素小的周圍,例如大小爲10X10的窗口)。 所以你可以在右下圖中看到這些算法的結果,我們得到了一個黑色區域,但它必須是白色的。 有誰知道如何改進算法來解決這個問題?

回答

2

在這方面有很多研究正在進行,但不幸的是我沒有很好的聯繫。

一個想法,可能工作,但我沒有測試,是試圖估計光照變化,然後在閾值之前刪除(這是一個比「二值化」更好的術語)。 然後問題從適應閾值移動到找到一個好照明模型。

如果你知道光源的任何事情,那麼你當然可以從中建立一個模型。

否則,一個可能工作的快速入侵方法是將非常重的低通濾波器應用於圖像(模糊它),然後將其用作照明模型。然後在原始和模糊版本之間創建一個差異圖像,並設置閾值。

編輯:經過快速測試,看起來我的「快速入侵」並不是真的可以工作。考慮這件事後,我並不很驚訝要麼:)

I = someImage 
Ib = blur(I, 'a lot!') 
Idiff = I - Idiff 
It = threshold(Idiff, 'some global threshold') 

EDIT 2 了另一個可能取決於如何生成你的圖像工作的想法。 嘗試從圖像中的前幾行估計照明模型:

  1. 取前N行的圖像
  2. 在創建的平均行從N收集行。你知道有一行作爲你的背景模型。
  3. 對於圖像中的每一行減去背景模型行(平均行)。
  4. 閾值結果圖像。

不幸的是,我在家裏沒有任何好的工具來測試這個。

+0

請您詳細解釋一下! 什麼是「在閾值之前刪除」的意思? 如何移除? 接下來還有一件事: 模糊很多,並採取差異,然後與全局閾值進行閾值處理 - 它會對良好圖像產生什麼效果?我的意思是自適應閾值方法後不會損壞的圖像? – maximus 2010-02-18 12:47:52

+0

查看更新:我不認爲我的方法可以工作。我認爲你不得不採取一些更高級的方法。 – 2010-02-18 13:58:51

+0

無論如何,謝謝你的回答! 希望在這裏會有更多的答案! – maximus 2010-02-19 14:30:58

2

看起來你正在做自適應閾值錯誤。您的圖像看起來好像將圖像分成小塊,計算每個塊的閾值並將該閾值應用於整個塊。這將解釋「盒子」工件。通常,自適應閾值處理意味着分別爲每個像素尋找閾值,並在像素周圍以單獨的窗口爲中心。

另一個建議是爲你的照明建立一個全局模型:在你的樣本圖像中,我敢肯定你可以使用最小二乘法將一個平面(在X/Y /亮度空間中)貼到圖像上,然後將像素分爲更亮(前景)和比該平面(背景)更暗的像素。然後,您可以使用這些平面之間的平均值再次將單獨的平面擬合到背景和前景像素,然後迭代地改進分割。這在實踐中的效果如何取決於您的閃電可以用線性模型進行建模。

如果您試圖分割的實際對象是「更薄」(您在評論中對條形碼有所說明),則可以嘗試簡單的打開/關閉操作來獲取照明模型。 (即關閉圖像以去除前景像素,然後使用[閉合圖像+ X]作爲閾值)。或者,您可以嘗試使用均值偏移濾波來使前景和背景像素達到相同的亮度。 (就個人而言,我會先嚐試一個)

1

你有非常不均勻的照明和相當大的物體(因此,沒有通用的簡單方法來提取背景和糾正不均勻性)。這基本上意味着你根本不能使用全局閾值,你需要自適應閾值。

你想嘗試Niblack二值化。 Matlab代碼在這裏可用 http://www.uio.no/studier/emner/matnat/ifi/INF3300/h06/undervisningsmateriale/week-36-2006-solution.pdf(第4頁)。 有兩個參數需要手動調整:窗口大小(上面代碼中的N)和權重。

1

嘗試使用此過程應用本地自適應閾值:

  1. 卷積,平均或中值濾波器
  2. 將圖像從卷積一個
  3. 閾減去原始圖像的差分圖像

局部自適應閾值方法爲每個像素選擇單獨的閾值。

我正在廣泛使用這種方法,它的圖像具有非均勻的背景。