新しいフレームに合わせて芸術的なイメージを選択しようとしています。特定のアスペクト比に対する近接性に基づいてこれらの画像を位置合わせし、次にfehのようなものを近接性の降順で見ることができます。
素晴らしい一行のUnix式がありますか?それ以外の場合は、数十行のPythonで問題を解決できます。
答え1
NNのImageMagickアノテーションを手がかりとして使用すると、-format
出力の一部として任意の計算を実行できることがわかりました。したがって、可能な1つの方法は次のとおりです。
identify -format "%[fx:round(100000*abs((4/3)-(w/h)))]:%M\n" *.jpg | \
sort -n -k1 -t:
あなたが欲しいものをする必要があります。 4/3は定数であり、所望のアスペクト比である。もちろん、前の出力の出力であることがわかりますidentify
(「この画像に最も近い」一致)。
これを説明するために、必要なアスペクト比と実際のアスペクト比との間の明らかな違いを見てみましょう。次に、大きな数を掛けて丸めます。乗算と丸めは、整列が有理数ではなく整数のみを処理するために発生します。
編集する
sort
整数だけでなく有理数も実際に計算できることがわかりました。これはSingle Unix仕様(v4)にも指定されています。したがって、次の回避策を使用することができます。
identify -format "%[fx:abs((4/3)-(w/h))]:%M\n" *.jpg | \
sort -n -k1 -t:
答え2
まあ、最も簡単な方法は、次を使用することです。イメージマジシャン。 Debian ベースのシステムでは、Linux ディストリビューションリポジトリにある必要があり、以下を実行します。
sudo apt-get install imagemagick
ImageMagick ファミリのプログラムの 1 つは、identify
入力イメージファイルリストの特性を印刷することです。これを組み合わせると、サイズでsort
ソートされた画像のリストが表示されます(pngを任意の拡張子に変更できます。
identify *png | sort -gk 3
本当に必要ならアスペクト比単にサイズの代わりに、次のようにしてみてください。
簡単な選択、画像名にスペースがないと仮定:
identify *png *jpg *gif | \ gawk '{split($3,sizes,"x"); print $1,sizes[1]/sizes[2]}' | \ sed 's/\[.\]//' | sort -gk 3
gawkコマンドは、3番目のフィールド(LxH形式の画像サイズ)を配列「サイズ」に分割し、最初のフィールド(画像名)と画像の長さを高さで割った結果を出力します。この
sed
コマンドは出力を美しくするだけで、sort
画像サイズの比率に基づいて結果をソートします。状況をより複雑にするために、ファイル名のスペースを処理できます。
find . \( -iname "*png" -o -iname "*jpg" -o -iname "*gif" \) -exec identify {} \; |\ perl -ne '/(.+?)\s+[A-Z]{3}\s+(\d+)x(\d+)/; print "$1 ", $2/$3, "\n"' | \ sort -gk 2
ここ
find
で目的のファイルを識別し、コマンドを実行してから、identify
小さなPERLスクリプトを介して出力をパイプします。正規表現は、[A-Z]{3}
画像形式でなければならない3つの大文字()を探します。これを見つけると、画像名とサイズを簡単に識別できます。入力ファイル名にスペースが含まれるとフィールド番号が混乱する可能性があるため、ここではgawkを使用しません。最後に、スクリプトは画像名と長さ/高さの分割結果を数値として出力します
sort
。
利用可能なアスペクト比を検索するだけでは不十分な場合、必要なアスペクト比の画像が1つ以上ある場合は、grepを使用して最も近い割合の画像を抽出します。
identify *png *jpg *gif | \
gawk '{split($3,sizes,"x"); print $1,sizes[1]/sizes[2]}' |\
sed 's/\[.\]//' | sort -gk 3 | grep -C 10 GOOD_IMAGE.jpg
答え3
各アスペクト比の参照との差を計算できます。 DeRobertの答えのように見えますが、もっと簡単です。
ref=4/3
identify -format "%[fx:abs(w/h - $ref)] %M\n" *.jpg | sort -n -k1
答え4
私の一般的な推論は、「近接性」という言葉を聞くたびに2乗誤差距離測定を使用することです。もちろん絶対値を使用でき、速度が速くなります。スクリプトは、次のパラメーターをパラメーターとして使用します。理想的なアスペクト比、現在のディレクトリ内のすべての* .jpgファイルを処理し、理想的な比率を超えた昇順で出力をソートします。
head
ImageMagick によって挿入された末尾の行末文字を削除します。
スクリプトには、出力フィールド区切り文字を予期しない文字に設定し、差分二乗を計算し、差異ファイル名のペアを印刷するgawkコマンドが含まれています。ソートを実行し、不要な情報を削除します(アスペクト比の差の2乗)cut
。
#!/bin/sh
if [ x"$1" = "x" ] ; then
echo "Usage: $0 TargetAspectRatio" >&2
exit 2
fi
ASPECT_CMD="BEGIN{OFS=\"|\";}\
{\
print (\$1-$1)^2, \$2;\
}"
identify -format "%[fx:w/h]:%M\n" *.jpg | head -n-1 | gawk -F":" "$ASPECT_CMD" | sort -k1 -t"|" | cut -f2 -d"|"