3

自動化してマップ部分のみをキャプチャし、それを別のファイルに保存します。つまり、長方形の外側にあるものはすべて削除されます。Photoshop の魔法の杖を調べてエッジ ツールを改良しようとしましたが、自分のアプローチに欠けているものがあるかどうかはわかりません。画像ごとに寸法が異なるため、Crop または Trim が自動化されないように見えます。

注: 長方形の境界線はすべての画像で正確ではありません。つまり、各辺の境界線の幅が異なる場合があり、長方形の寸法も異なる場合があります。1000 以上のマップがあり、自動化によってタスクが高速化されます。

ご意見、ご提案をよろしくお願いいたします。[ここに画像の説明を入力][1]など。

参照マップ: http://www.google.com/imgres?imgurl=http%3A%2F%2Fwww.portal.gsi.gov.in%2Fimages%2FGSIimages%2FSTATUS_Map_AirborneSurveys_11-12.gif&imgreurl=http%3A%2F%2Fwww .portal.gsi.gov.in%2Fpls%2Fportal%2Furl%2Fpage%2FGSI_STATIC%2FGSI_STAT_SEARCH_AMSE%3FlinkId%3D1032&h=4018&w=2651&tbnid=Bgkcf16ZBBhB9M%3A&zoom=1&docid=azCZJ7k99sm84M&ei=WzFBVN7YArS1sQSr_oGAAg&tbm=isch&ved=0CB4QMygAMAA&iact=rc&uact=3&dur=9105&page=1&start =0&ndsp=26

4

2 に答える 2

1

更新された回答

わかりました、私はこれについていくつかの作業を行い、以下に提案したように多かれ少なかれ行う以下のスクリプトを使用してマップを自動的に抽出できます。

#!/bin/bash 
################################################################################
# File: extractMap
# Usage:
# extractMap survey.gif
# Result is in extracted/survey.gif
################################################################################
image="$1"
mkdir extracted 2> /dev/null

# Step1: Trim off border around edge of image
convert "$image" -shave 50x50 step1.gif

# Step 2: Squeeze image till 1 pixel wide x original height
convert step1.gif -scale 1x! -threshold 65533 step2.gif

# Step 3: Find longest black line
result=$(convert step2.gif txt: | awk -F"[,: ]*" '/black/&&!inblack{inblack++;start=$2}/white/&&inblack{inblack=0;l=$2-start;if(l>longest){longest=l;x=start;y=$2}}END{print x,y}')
read a b <<< $result

# Step 4: Crop top and bottom off
h=$(identify -format "%h" step1.gif)
c=$((h-b))
convert step1.gif -chop 0x$a -gravity south -chop 0x$c out.gif

# Step 5: Squeeze image till 1 pixel tall
convert out.gif -scale x1! -threshold 65533 step3.gif

# Step 6: Find longest black line
result=$(convert step3.gif txt: | awk -F"[,: ]*" '/black/&&!inblack{inblack++;start=$1}/white/&&inblack{inblack=0;l=$1-start;if(l>longest){longest=l;x=start;y=$1}}END{print x,y}')
read a b <<< $result

# Step 7: Crop left and right off
w=$(identify -format "%w" out.gif)
c=$((w-b))
convert out.gif -chop ${a}x0 -gravity east -chop ${c}x0 "extracted/$image"

上記のスクリプトを というファイルに保存し、extractMap次のスクリプトを (1 回だけ) 実行して実行可能にします。

chmod +x extractMap

このように調査の名前を渡すとextracted、元のファイル名が後に続くサブディレクトリにマップが抽出されます。

./extractMap survey.gif

主な手順は次のとおりです。

  1. 元の画像の周りの黒い枠を削除するには
  2. 次に、イメージ til1 を幅 1 ピクセル、元の高さでクイーズするには
  3. スクイーズされた画像で最も長い黒い線を見つけます (つまり、マップの垂直方向の端です)。
  4. その線に従って上下をトリミングします
  5. 画像を 1 ピクセルの高さまで縮小します
  6. 地図領域の水平方向の端である最長の黒い線を見つけます
  7. 地図の境界線の左右を切り取って出力ディレクトリに保存

ディレクトリ全体が画像でいっぱいの場合は、最初にそれらをバックアップしてから、次のように何千ものファイルのディレクトリ全体を処理できます。

for f in *.gif; do ./extractMap "$f"; done

元の回答

週末はコンピューターにアクセスできないので、大まかな方法​​を提案することしかできません...日曜日の夜に戻って、誰かがアイデアを開発したかどうかを確認します.

Windows、Linux、および OSX でコマンドライン経由で、または Perl、PHP、.NET、およびその他のバインディングで利用できる ImageMagick を使用します。

次に、このコマンドを使用して、画像を 1 ピクセル幅の背の高い画像にスクイーズします。

convert inputimage.jpg -resize 1x\! output.jpg

画像を見ると、左上の画像のタイトル ブロックに対応する短い実線、経度に対応する別の短い実線、マップの側面に対応する長い実線が表示されます。これは簡単に識別でき、マップの上部と下部を示します。

これで画像を1ピクセルの高さにスクイーズします

convert inputimage.jpg -resize x1\! output.jpg

マップの幅を見つけるためにもう一度実行します。

次に、マップを抽出します

convert inputimage.jpg -crop XxY+M+N output.jpg

ここで、X = マップの幅、Y = マップの高さ、M = マップの左上隅までの x オフセット、N = マップの左上隅までの y オフセット。

出力画像の名前を に変更するtxt:-と、ピクセルの色がテキストとしてリストされるため、簡単に解析できます。

もう少し考えてみると、最も長い垂直線を見つけた後、画像を 1 ピクセルの高さに縮小する前に、画像の上部と下部をトリミングすることをお勧めします。これは、ヘッダーが上部にあり、キーが下部にあることを意味します。マップの幅の決定を妨げません。

于 2014-10-17T16:59:26.817 に答える