内部に実際のコンテンツがあり、通常はその周りに不要な白または黒または透明度がある画像を前提として、ImageMagickを使用して外部パーツをトリミングまたはトリミングしたいと思います。
次の画像は、コンピューター上でデジタル的に描画されています(HTML <canvas>
):
次のImageMagickコマンドは私が試したものです:
$ convert canvas.png -trim +repage canvas_trimmed.png
そしてそれは完璧に機能しました:
だからこれはまさに私が欲しいものです。しかし今、私はこれをスキャンされたドキュメントでも機能させたいと思っています。スキャンされたドキュメントは、コンピューターで生成された画像ほど「完璧」ではありません。つまり、「白」と「黒」の色合いが多く、透明度がなく、検出が容易です。スキャナーの領域が紙よりも大きいため、紙の白い背景の周りに黒いバーが表示されることもあります。
この画像を使用して、次のコマンドを指定された順序で試しました。それぞれがより積極的にしようとしましたが、結果は得られませんでした。元の画像と「トリミングされた」画像、つまりトリミングやトリミングの違いはわかりません。まったく機能しません:
$ 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
私はここで何が間違っているのですか?コンピューターで生成された画像を確実にトリミングするImageMagickコマンドを変更して、上記のスタイルのスキャンされたドキュメントを同じように確実にトリミングするにはどうすればよいですか?
-shave を使用し、単純に shave エッジをオフにして、後で使用するロジックを使用してそれに応じて処理することができます。
注:あなたが 剃る オフの量(例:「-shave」の後の引数
40x40
または10x10
など)は重要なので、この設定が画像の環境で普遍的に機能することを確認するために、徹底的にテストしてください。
ロジックの例
@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>
剃り、画像からエッジを削除します
「-border」または「-frame」演算子の逆は「 -shave 」であり、同じ引数を指定すると、これらのコマンドによって追加されたスペースが削除されます。
これらの3つの演算子について覚えておくべき主なことは、片側だけでなく、隣接する側ではなく、画像の反対側のスペースを追加および削除することです。
画像のエッジを1つだけ削除する場合は、代わりに「-chop」演算子を使用する必要があります。 (以下のチョップの例を参照してください)。
以前と同様に、すべての演算子「-border」、「-frame」、および「 -shave 」は、仮想キャンバス自体ではなく、仮想キャンバス上の実際の画像にのみ影響します。
以下は、あなたの質問の画像から画像ファイルの汚れの斑点を取り除くために使用したものですが、先に進んで、最初に90x90
で shave を使用しました。確認済みは、授与された報奨金に提供した他の解決策から問題を解決するのに役立ちました。
ロジックの例
@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
リンギングノイズの性質上、すべてのブラックノイズの斑点は文字から少なくとも1ピクセル離れています。
このノイズを除去するための1つの良いアプローチは、各文字の少なくとも1つの「シード」部分が残るように画像を拡張し、元の画像をマスクとして使用しながらこれらのシードを侵食することです。事実上、各文字の塗りつぶし。
このようにして、文字やその他の大きなブロブの形状が完全に保持され、小さなブロブが消えます。
各文字の形状の一部をまだ残している最大の拡張は、サンプルデータの3x4の長方形のようです。安全のために、おそらくもっと小さいものを使用してください。
このコマンドは、最初にその3x4の長方形を拡張し、最後に文字がすべて再び完全になるまで侵食します
コード
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
少なくとも元の質問(scan.jpg
)、次の2段階の解決策でした:
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
このソリューションは、次の3つの部分で構成されています。