web-dev-qa-db-ja.com

空白の画像ファイルの検出

デュプレックススキャンをサポートするドキュメントスキャナー(Canon DR-2510C)でscanimageを使用しています。残念ながら、そのSANEドライバーは空白ページの検出をサポートしていないため、混合ページ(片面/両面)では、空白ページがスキャン結果になります。

スキャン出力を後処理するときにこれらの空白ページを自動的に削除したいので、TIFFまたはPNMファイルがほとんど白いピクセルで構成されているかどうかを検出できるコマンドラインツールを探しています。

何か案は?


これは、lesmanaの回答に基づいて私が思いついた解決策です。

for i in "${DEST_DIR}/out"*.pnm; do
  histogram=`convert "${i}" -threshold 50% -format %c histogram:info:-`
  white=`echo "${histogram}" | grep "white" | sed -n 's/^ *\(.*\):.*$/\1/p'`
  black=`echo "${histogram}" | grep "black" | sed -n 's/^ *\(.*\):.*$/\1/p'`
  blank=`echo "scale=4; ${black}/${white} < 0.005" | bc`
  if [ ${blank} -eq "1" ]; then
    echo "${i} seems to be blank - removing it..."
    rm "${i}"
  fi
done

ImageMagick 比較ツールを使用して、スキャンした画像を「マスター」の空白ページと比較できます。私のImageMagick-fuは非常に限られているので、コマンドの例を示すことはできません。 [〜#〜] rtfm [〜#〜]

2番目のリンクには、空白のファックスページを検出する方法を説明する「空白のファックス」というタイトルのセクションもあります。悲しいことに、そのセクションは未完成のようです。うまくいけば、利用可能な情報はあなたが始めるのに十分です。

0
lesmana

ここに示すように、ImageMagik CLIのidentify機能を使用します。

http://www.imagemagick.org/script/identify.php

コマンド付き:

$ identify -format "%#" source.png

色数が1の場合、空白のページがあります。

次のコマンドを使用することもできます。

identify -verbose source.png

空白の画像の場合、標準偏差、スキュー、尖度は0になります。

5
amarprabhu

質問のコードのわずかに改善されたバージョン:

#!/bin/bash

mkdir -p "blanks"

for i in "$@"; do
    echo "${i}"
    if [[ -e $(dirname "$i")/.$(basename "$i") ]]; then
        echo "   protected."
        continue
    fi

    histogram=$(convert "${i}" -threshold 50% -format %c histogram:info:-)
    #echo $histogram
    white=$(echo "${histogram}" | grep "white" | cut -d: -f1)
    black=$(echo "${histogram}" | grep "black" | cut -d: -f1)
    if [[ -z "$black" ]]; then
        black=0
    fi

    blank=$(echo "scale=4; ${black}/${white} < 0.005" | bc)
    #echo $white $black $blank
    if [ "${blank}" -eq "1" ]; then
        echo "${i} seems to be blank - removing it..."
        mv "${i}" "blanks/${i}"
    fi
done

変更点:

  • 固定された場所から読み取る代わりに、引数としてチェックする画像を渡します
  • 経過報告
  • コードがファイルを正しく検出しない場合は、ヒントを与えることができます(画像の名前と前にドットを付けて空のファイルを作成します。つまり、a.pnmを保護するには、touch .a.pnmを使用します)
  • 入力に黒いピクセルがない場合のエラーを修正しました
1
Aaron Digulla

私の秘訣は、画像を可逆圧縮形式(tiff +圧縮)にスキャンすることです。このように、空白のページのファイルサイズははるかに小さく、findで検出し、別のディレクトリに移動し、ビューアですばやく確認してから取り除くことができます。

1
dwery

Noisy trim with ImageMagick を実行できます。例:

convert image-0001.png -virtual-pixel White -blur 0x15 -fuzz 15% -trim info:

Convertが次のようなものを出力する場合、ページは空ではありません。

image-0001.png PNG 4565x6129 4960x7016+279+816 8-bit Gray 0.000u 0:00.000

(入力例は600 dpi DIN A4スキャンされた線画画像)

トリミング後の高さ/幅が疑わしいほど小さい場合は空です。例:

image-0001.png PNG 2505x40 4960x7016+0+6976 8-bit Gray 0.000u 0:00.000

しきい値ヒストグラム法とは対照的に、これにより、単語または1行のテキストのみを含むページがある場合の誤検知が少なくなります。しきい値ヒストグラムを使用すると、そのようなページが誤って空として検出される可能性があります。

圧縮された画像のファイルサイズを見ると、つまりエントロピーの概算として、同じ誤検知が発生します。

反対に、ミシン目はあるが空のドキュメントは、ノイズの多いトリムだけでは空として検出されない可能性があります。これらを気にする場合は、最初にマージンスペースを無条件にトリミングするようにImageMagickに指示するのが理にかなっているかもしれません。たとえば、画像が600 dpiでスキャンされ、周囲の1インチの余白を無視したい場合:

convert i1.png -shave 600x0 -virtual-pixel White -blur 0x15 -fuzz 15% -trim info:
0
maxschlepzig

%kは、次のようにフォーマットに使用する必要があります。

計算:ユニークな色の数

使用法:

identify -format "%k" image.tif

ソース: https://imagemagick.org/script/escape.php

0
Nicolai