5

因此,我經常在非智能佳能多功能上運行巨大的雙面掃描作業,這使我留下了一個巨大的JPEG文件夾。我瘋了考慮使用PIL分析圖像文件夾來檢測空白頁的掃描並將其標記爲刪除嗎?使用PIL檢測空白頁的掃描

留下的文件夾爬行和標記部分出來,我想這將是這個樣子:

  • 檢查如果圖像是灰度,因爲這是假定不確定的。
  • 如果是這樣,檢測陰影的主要範圍(背景顏色)。
  • 如果不是,檢測陰影的主要範圍,限制爲淺灰色。
  • 確定整個圖像由所述陰影組成的百分比。
  • 嘗試找到充分檢測具有類型或書寫或圖像的頁面的閾值。
  • 也許一次測試圖像的碎片以提高閾值的準確性。

我知道這是一種邊緣情況,但任何有PIL經驗的人都可以借用一些指示嗎?

回答

2

的幾個非PIL-具體建議考慮:

印刷或書寫材料的

掃描將有很多高對比度尖銳邊緣;像中值濾波器(以減少噪聲),然後進行某種簡單的邊緣檢測,可能會很好地區分真實內容和空白頁面。

一次測試片段很有用,不僅因爲它可能會提高您的準確性,還因爲它可能會幫助您在很多頁面上儘早放棄。推測大多數掃描是而不是空白,所以你應該從一個簡單的檢查開始,通常將非空白頁面標識爲非空白;只有當它說這個頁面可能是空白的時候,你需要仔細看看。

在照明或頁面本身不均勻的情況下,您可能需要從image = image-filter(image)開始,其中filter可以進行非常寬泛的平滑處理。這將減少識別占主導地位的色調的需要,以及當主頁色調在整個頁面上不太統一時的應對。

+0

+1好的建議。我認爲,即使是一個簡單的圖像熵計算也可能是一個足夠好的辨別頁面「空虛」的辨別器。 http://brainacle.com/calculating-image-entropy-with-python-how-and-why.html – Paul 2011-03-25 06:49:57

+0

偉大的一點,保羅。我每天都用直方圖工作,但從來沒有考慮過計算熵。 – 2011-03-26 02:46:51

4

就像第一次嘗試一樣,按照文件大小對圖像文件夾進行排序。如果來自一個文件的所有掃描具有相同的分辨率,則空白頁面肯定會導致比非空白文件更小的文件。

我不知道你有多少頁正在掃描,但如果數量足夠低,這可能是一個簡單的快速修復。

11

以下是替代解決方案,使用mahotasmilk

  1. 首先創建兩個目錄:positives/negatives/您將在其中手動挑選幾個示例。
  2. 我會假設數據的其餘部分是在積極的unlabeled/目錄中的所有圖像
  3. 計算功能和底片
  4. 學習分類
  5. 使用分類上未標記的圖像

在下面的代碼我用jug給你在多個處理器上運行它的可能性,但如果你刪除所有,其中提到TaskGenerator

行代碼也可以210
from glob import glob 
import mahotas 
import mahotas.features 
import milk 
from jug import TaskGenerator 


@TaskGenerator 
def features_for(imname): 
    img = mahotas.imread(imname) 
    return mahotas.features.haralick(img).mean(0) 

@TaskGenerator 
def learn_model(features, labels): 
    learner = milk.defaultclassifier() 
    return learner.train(features, labels) 

@TaskGenerator 
def classify(model, features): 
    return model.apply(features) 

positives = glob('positives/*.jpg') 
negatives = glob('negatives/*.jpg') 
unlabeled = glob('unlabeled/*.jpg') 


features = map(features_for, negatives + positives) 
labels = [0] * len(negatives) + [1] * len(positives) 

model = learn_model(features, labels) 

labeled = [classify(model, features_for(u)) for u in unlabeled] 

它使用紋理特徵,這可能是不夠好,但你可以在mahotas.features其他功能發揮,如果你想(或嘗試mahotas.surf,而是變得更加複雜)。一般來說,我發現很難用你正在尋找的那種硬閾值進行分類,除非掃描受到很好的控制。

+1

您寫的令人印象深刻的圖書館! – 2011-03-31 21:44:06

+0

爲nit-pick道歉,但是,可變特徵被作爲函數使用兩次,接下來作爲列表使用。然後稱爲功能。功能列表不應該與特徵_學習功能類似,並且應用於學習者模型而不會取消與原始功能的關聯?這是我能夠應用該片段的唯一方法。感謝各地的精彩圖書館。他們工作很棒!謝謝。 – TelsaBoil 2011-05-08 16:32:16

+0

謝謝。我修復了代碼。 – luispedro 2011-05-09 15:17:26