Wykrywanie pustych plików obrazów

8

Używam scanimageze skanerem dokumentów (Canon DR-2510C), który obsługuje skanowanie dwustronne. Niestety, sterownik SANE nie obsługuje wykrywania pustych stron, więc przy mieszanych stronach (jednostronnych / dwustronnych) puste strony trafiają do wyniku skanowania.

Chciałbym automatycznie pozbyć się tych pustych stron podczas przetwarzania wyników skanowania, więc szukam narzędzia wiersza polecenia, które może wykryć, czy plik TIFF czy PNM składa się głównie z białych pikseli).

Jakieś pomysły?


Oto rozwiązanie, które wymyśliłem na podstawie odpowiedzi Lesmany:

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
Thilo-Alexander Ginkel
źródło
Powiązane pytanie na temat DSP.SE: Szybkie wykrywanie pustych stron
maxschlepzig

Odpowiedzi:

0

Możesz użyć narzędzia do porównywania ImageMagick , aby porównać zeskanowane obrazy z „główną” pustą stroną. Ponieważ mój ImageMagick-fu jest dość ograniczony, nie mogę podać żadnego przykładowego polecenia. Będziesz musiał RTFM :

Drugi link ma nawet sekcję zatytułowaną „Pusty faks”, która wyjaśnia, jak wykryć puste strony faksu. Niestety ta sekcja wydaje się niedokończona. Mamy nadzieję, że dostępne informacje wystarczą, aby zacząć.

lesmana
źródło
5

Użyj funkcji identyfikacji interfejsu ImageMagik CLI, jak podano tutaj:

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

Z poleceniem:

$ identify -format "%#" source.png

Jeśli liczba kolorów wynosi 1, masz pustą stronę.

Możesz także użyć polecenia:

identify -verbose source.png

Standardowe odchylenie, pochylenie i kurtoza wynoszą 0 dla pustego obrazu.

amarprabhu
źródło
1
%#zwraca obliczoną wartość skrótu dla obrazu, powinna być %kimho.
Nicolai
1

Nieznacznie ulepszona wersja kodu w pytaniu:

#!/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

Zmiany:

  • Przekaż obrazy, aby sprawdzić jako argumenty zamiast czytać ze stałej lokalizacji
  • Status postępu
  • Jeśli kod nie wykrywa poprawnie pliku, możesz dać mu podpowiedź (utwórz pusty plik z nazwą obrazu i kropką z przodu, tj. W celu ochrony a.pnm, użyj touch .a.pnm)
  • Naprawiono błąd, gdy na wejściu nie było czarnych pikseli
Aaron Digulla
źródło
1

Moją sztuczką jest skanowanie obrazów do bezstratnie skompresowanego formatu (tiff + kompresja). W ten sposób puste strony mają znacznie mniejszy rozmiar pliku i mogę je wykryć find, przenieść do innego katalogu, szybko sprawdzić za pomocą przeglądarki, a następnie się ich pozbyć.

dwery
źródło
0

Za pomocą ImageMagick możesz wykonać głośne przycinanie , np .:

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

Strona nie jest pusta, jeśli konwersja drukuje coś takiego:

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

(przykładowym wejściem jest obraz liniowy zeskanowany w formacie 600 dpi DIN A4)

Jest pusta, jeśli wysokość / szerokość po przycięciu jest podejrzanie mała, np .:

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

W przeciwieństwie do progowej metody histogramu, daje to mniej fałszywych trafień, gdy masz strony zawierające tylko słowo lub wiersz tekstu. Dzięki histogramowi progowemu takie strony mogłyby zostać błędnie wykryte jako puste.

Patrząc na rozmiar pliku skompresowanego obrazu, tj. Jako przybliżenie entropii, uzyskuje się te same fałszywe wyniki dodatnie.

Z drugiej strony dokumenty z perforacją, ale poza tym puste, prawdopodobnie nie są wykrywane jako puste tylko z głośnym przycięciem. Jeśli ci na tym zależy, warto powiedzieć ImageMagick, by najpierw bezwarunkowo przycięło trochę miejsca na marginesie. Na przykład, jeśli obraz został zeskanowany z rozdzielczością 600 dpi i chcesz zignorować wokół siebie 1 calowy margines:

convert i1.png -shave 600x0 -virtual-pixel White -blur 0x15 -fuzz 15% -trim info:
maxschlepzig
źródło
0

%k należy użyć dla formatu, ponieważ zwraca:

OBLICZONY: liczba unikalnych kolorów

Stosowanie:

identify -format "%k" image.tif

Źródło: https://imagemagick.org/script/escape.php

Nicolai
źródło