Przycinanie zewnętrznej pustej przestrzeni za pomocą ImageMagick nie działa na zeskanowanych dokumentach


4

Biorąc pod uwagę obraz, który zawiera pewną rzeczywistą zawartość i zwykle niechcianą biel lub czerń lub przezroczystość wokół niego, chciałbym przyciąć lub przyciąć zewnętrzne części za pomocą ImageMagick.

Poniższy obraz został narysowany cyfrowo na komputerze (w kodzie HTML <canvas>):

canvas.png

Próbowałem następującego polecenia ImageMagick:

$ convert canvas.png -trim +repage canvas_trimmed.png

I działało idealnie:

canvas_trimmed.png

Właśnie tego chcę. Ale teraz chcę, aby działało to również ze skanowanymi dokumentami, które nie są tak „doskonałe” jak obrazy generowane komputerowo, tj. Mają więcej odcieni „białego” i „czarnego” oraz brak przejrzystości, która byłaby łatwiejsza do wykrycia. Czasami mają nawet czarne paski wokół białego tła papieru, ponieważ obszar skanera jest większy niż papier:

scan.jpg

W przypadku tego obrazu wypróbowałem następujące polecenia w podanej kolejności, każda próbowała być bardziej agresywna, ale żadna nie przyniosła żadnych rezultatów - nie widać żadnej różnicy między obrazem oryginalnym a obrazem „przyciętym”, tj. Przycinanie lub kadrowanie w ogóle nie działa:

$ convert scan.jpg -trim +repage scan_trimmed.jpg
$ convert scan.jpg -fuzz 10% -trim +repage scan_trimmed.jpg
$ convert scan.jpg -fuzz 60% -trim +repage scan_trimmed.jpg
$ convert scan.jpg -fuzz 60% -bordercolor white -border 1x1 -trim +repage scan_trimmed.jpg
$ convert scan.jpg -fuzz 60% -bordercolor black -border 1x1 -trim +repage scan_trimmed.jpg

Co ja tu robię źle? W jaki sposób można zmodyfikować polecenie ImageMagick, które niezawodnie przycina obrazy generowane komputerowo, tak samo jak niezawodnie przycina zeskanowane dokumenty o powyższym stylu?


Jeśli spojrzysz na zeskanowany obraz, na bokach wyraźnie widać białe obszary. Oznacza to, że ImageMagick nadal ma zawartość, której nie może przyciąć, ponieważ obraz nadal ma treść. Nie znam łatwego rozwiązania.
JakeGould

Po co komplikować? Użyj funkcji automatycznego przycinania w sterowniku skanera i gotowe. Niektóre sterowniki skanera oferują również usuwanie ciemnych krawędzi, jak pokazano na zeskanowanym przykładzie. Być może ImageMagick oferuje również usuwanie tak ciemnych krawędzi.
user291737

@ user291737 Dzięki! Chciałbym, żeby to było możliwe, ale nie jest. Łatwo jest wyobrazić sobie niektóre przypadki użycia, w których nie jest to możliwe: Twój skaner może nie obsługiwać tej funkcji, możesz przetwarzać dane dla kogoś innego (kto używał swojego skanera, do którego nie masz dostępu) itp.
caw

1
Co powiesz na potencjalne testowanie z -shave i sprawdź, czy możesz po prostu ogolić krawędzie, a następnie użyć logiki, której używasz? Daj mi znać, jeśli to pomoże, ale spójrz na oba te linki, gdy masz szansę
Pimp Juice IT

Spójrz na autotrim i multicrop Fred's ImageMagick Scripts . Zobacz ten powiązany artykuł .
harrymc

Odpowiedzi:


4

Możesz użyć opcji -shave i po prostu ogolić krawędzie, a następnie użyć logiki, której używasz później, aby odpowiednio przetworzyć.

Uwaga: Ilość, którą się golisz (np. Argument po „-shave” 40x40lub 10x10itp.) Jest ważna, więc upewnij się, że dokładnie ją przetestowałeś, aby upewnić się, że to ustawienie działa uniwersalnie w twoim środowisku dla twoich zdjęć.

Przykładowa logika

@ECHO ON

SET Convert="C:\Program Files\ImageMagick\Convert.exe"
%convert% C:\Folder\Circle.jpg -shave 40x40 C:\Folder\ShavedCircle.jpg
<The rest of your logic against C:\Folder\ShavedCircle.jpg now>

Przed

wprowadź opis zdjęcia tutaj

Po

wprowadź opis zdjęcia tutaj


Dalsze zasoby

  • Golenie, usuwanie krawędzi z obrazu

    Odwrotnością operatorów „-border” lub „-frame” jest „ -shave ”, który, jeśli otrzyma te same argumenty, usunie przestrzeń dodaną przez te polecenia.

    Główną rzeczą, o której należy pamiętać o tych trzech operatorach, jest to, że dodają i usuwają przestrzeń po przeciwnych stronach obrazu, a nie tylko po jednej stronie lub po bokach.

    Jeśli chcesz usunąć tylko jedną krawędź obrazu, musisz zamiast tego użyć operatora „-chop”. (Zobacz przykłady Chop poniżej).

    Tak jak poprzednio, wszystkie operatory „-border”, „-frame” i „ -shave ” wpływają tylko na rzeczywisty obraz na wirtualnym obszarze roboczym, a nie na samym wirtualnym obszarze roboczym.

    źródło


Dzięki za to! Cóż, -shaveopcja działa dobrze, przynajmniej tak się wydaje. Nie znałem tej opcji (jakoś zawsze ją przeoczyłem) i jest to bardzo pomocne dla krawędzi. Używając czegoś podobnego -shave 90x90do przykładowego obrazu, wszystkie krawędzie zniknęły. Ale krawędzie nigdy nie były jedynym problemem. Nawet po całkowitym ich usunięciu, a nawet przy łagodnych ustawieniach, takich jak -fuzz 80%górna biała część jest usuwana tylko, jeśli w ogóle. Wygląda na to, że w białych obszarach generowanych przez skaner występuje „brud”, który uniemożliwia -trimdziałanie. Być może jednak nie ma lepszego rozwiązania.
caw

Nie jestem jeszcze do końca pewien, ponieważ nie naprawił problemu ani nie odpowiedział na pełne pytanie, ale tylko rozwiązał jego część. W każdym razie nagrodziłem już nagrodę (+100).
caw

To właściwie obraz z pytania, z którym pracuję: i.stack.imgur.com/yVhlM.jpg Próbowałem wszystkich poleceń i opcji z tym obrazem. Nie działa dla mnie
caw

Dzięki jeszcze raz! W połączeniu z drugą odpowiedzią to naprawdę działa idealnie.
caw

2

Usuń drobiny brudu lub szumy z obrazów za pomocą ImageMagick

Poniżej znajduje się to, czego użyłem, aby pozbyć się drobinek brudu w pliku obrazu z obrazu w twoim pytaniu, ale poszedłem dalej i użyłem golenia z 90x90pierwszym, co, jak potwierdziłeś, pomogło rozwiązać problem z innego rozwiązania, które zapewniłem przyznana nagroda.

Przykładowa logika

@ECHO ON

SET Convert="C:\Program Files\ImageMagick\Convert.exe"
%convert% C:\Folder\Circle.jpg -shave 90x90 C:\Folder\ShavedCircle.jpg
%convert% C:\Folder\ShavedCircle.jpg -write MPR:source ^
  -morphology close rectangle:3x4 ^
  -morphology erode square    MPR:source -compose Lighten -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
C:\Folder\cleaned.jpg

Przed

wprowadź opis zdjęcia tutaj

Po

wprowadź opis zdjęcia tutaj


Ze względu na charakter szumu wszystkie plamki czarnego szumu są oddzielone co najmniej 1 pikselem od liter.

Jednym dobrym podejściem do usunięcia tego szumu byłoby poszerzenie obrazu, tak aby pozostała przynajmniej jedna część „zarodka” każdej litery, a następnie erozja tych nasion przy użyciu oryginalnego obrazu jako maski; w efekcie wypełnienie zalewowe dla każdej litery.

W ten sposób kształt liter i innych dużych obiektów blob zostaje doskonale zachowany, a mniejsze obiekty blob znikają.

Największym rozszerzeniem, które wciąż pozostawia część każdego kształtu litery, wydaje się być prostokąt 3 x 4 dla przykładowych danych; być może użyj czegoś mniejszego, aby być po bezpiecznej stronie.

To polecenie najpierw rozszerza prostokąt 3x4, kończy, a następnie eroduje, aż litery znów będą w całości

Kod

convert cleanup.tif -write MPR:source ^
  -morphology close rectangle:3x4 ^
  -morphology erode square    MPR:source -compose Lighten -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  -morphology erode square    MPR:source -composite ^
  cleaned.png

źródło


Dalsze zasoby


Wykonanie tej czynności przed drugim poleceniem ( -trim) powoduje wyczyszczenie i przycięcie obrazu zgodnie z potrzebami. Wielkie dzięki!
caw

1

To, co ostatecznie zapewniło doskonałe wyniki, przynajmniej dla mojego konkretnego przykładu pokazanego w pierwotnym pytaniu ( scan.jpg), to następujące dwuetapowe rozwiązanie:

convert \
    scan.jpg \
    -write MPR:source \
    -morphology close rectangle:3x4 \
    -clip-mask MPR:source \
    -morphology erode:8 square \
    +clip-mask \
    scan_intermediate.jpg

convert scan_intermediate.jpg -shave 40x40 -fuzz 10% -trim +repage scan_final.jpg

To rozwiązanie składa się z trzech części:

  1. Polecenie z mojego pierwotnego pytania
  2. Usuwanie szumów pokazane w tej odpowiedzi
  3. -shaveOperator zaproponował w tej odpowiedzi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.