カード画像の大量のコレクションと、特定のカードの写真が 1 枚あります。コレクションのどの画像が自分の画像に最も似ているかを見つけるには、どのツールを使用できますか?
コレクションのサンプルは次のとおりです。
これが私が見つけようとしているものです:
新方式!
次の ImageMagick コマンド、またはおそらくそのバリエーションは、より多くの画像を選択して見ると、カードの上部にある文言を抽出するようです
convert aggressiveurge.jpg -crop 80%x10%+10%+10% crop.png
これは、画像の上部 10% と幅の 80% (左上隅の 10% から開始) を取り、crop.png
次のように格納します。
そして、tessseract
次のようにOCRを介してそれを実行すると:
tesseract crop.png agg
agg.txt
次を含むという名前のファイルを取得します。
E‘ Aggressive Urge \L® E
grep
互いに隣接する大文字と小文字のみを探して、クリーンアップするために実行できます。
grep -Eo "\<[A-Za-z]+\>" agg.txt
取得するため
Aggressive Urge
:-)
いくつかの写真を投稿していただきありがとうございます。
Perceptual Hashing
Neal Krawetz 博士によって発見されたアルゴリズムをコーディングしました。画像をカードと比較すると、次のような類似度の測定値が得られます。
Card vs. Abundance 79%
Card vs. Aggressive 83%
Card vs. Demystify 85%
そのため、画像タイプの理想的な識別器ではありませんが、ある程度は機能します。ユースケースに合わせて調整するために、いじってみるとよいでしょう。
コレクション内の各画像のハッシュを一度に 1 つずつ計算し、各画像のハッシュを一度だけ保存します。次に、新しいカードを取得したら、そのハッシュを計算し、保存されているものと比較します。
#!/bin/bash
################################################################################
# Similarity
# Mark Setchell
#
# Calculate percentage similarity of two images using Perceptual Hashing
# See article by Dr Neal Krawetz entitled "Looks Like It" - www.hackerfactor.com
#
# Method:
# 1) Resize image to black and white 8x8 pixel square regardless
# 2) Calculate mean brightness of those 64 pixels
# 3) For each pixel, store "1" if pixel>mean else store "0" if less than mean
# 4) Convert resulting 64bit string of 1's and 0's, 16 hex digit "Perceptual Hash"
#
# If finding difference between Perceptual Hashes, simply total up number of bits
# that differ between the two strings - this is the Hamming distance.
#
# Requires ImageMagick - www.imagemagick.org
#
# Usage:
#
# Similarity image|imageHash [image|imageHash]
# If you pass one image filename, it will tell you the Perceptual hash as a 16
# character hex string that you may want to store in an alternate stream or as
# an attribute or tag in filesystems that support such things. Do this in order
# to just calculate the hash once for each image.
#
# If you pass in two images, or two hashes, or an image and a hash, it will try
# to compare them and give a percentage similarity between them.
################################################################################
function PerceptualHash(){
TEMP="tmp$$.png"
# Force image to 8x8 pixels and greyscale
convert "$1" -colorspace gray -quality 80 -resize 8x8! PNG8:"$TEMP"
# Calculate mean brightness and correct to range 0..255
MEAN=$(convert "$TEMP" -format "%[fx:int(mean*255)]" info:)
# Now extract all 64 pixels and build string containing "1" where pixel > mean else "0"
hash=""
for i in {0..7}; do
for j in {0..7}; do
pixel=$(convert "${TEMP}"[1x1+${i}+${j}] -colorspace gray text: | grep -Eo "\(\d+," | tr -d '(,' )
bit="0"
[ $pixel -gt $MEAN ] && bit="1"
hash="$hash$bit"
done
done
hex=$(echo "obase=16;ibase=2;$hash" | bc)
printf "%016s\n" $hex
#rm "$TEMP" > /dev/null 2>&1
}
function HammingDistance(){
# Convert input hex strings to upper case like bc requires
STR1=$(tr '[a-z]' '[A-Z]' <<< $1)
STR2=$(tr '[a-z]' '[A-Z]' <<< $2)
# Convert hex to binary and zero left pad to 64 binary digits
STR1=$(printf "%064s" $(echo "obase=2;ibase=16;$STR1" | bc))
STR2=$(printf "%064s" $(echo "obase=2;ibase=16;$STR2" | bc))
# Calculate Hamming distance between two strings, each differing bit adds 1
hamming=0
for i in {0..63};do
a=${STR1:i:1}
b=${STR2:i:1}
[ $a != $b ] && ((hamming++))
done
# Hamming distance is in range 0..64 and small means more similar
# We want percentage similarity, so we do a little maths
similarity=$((100-(hamming*100/64)))
echo $similarity
}
function Usage(){
echo "Usage: Similarity image|imageHash [image|imageHash]" >&2
exit 1
}
################################################################################
# Main
################################################################################
if [ $# -eq 1 ]; then
# Expecting a single image file for which to generate hash
if [ ! -f "$1" ]; then
echo "ERROR: File $1 does not exist" >&2
exit 1
fi
PerceptualHash "$1"
exit 0
fi
if [ $# -eq 2 ]; then
# Expecting 2 things, i.e. 2 image files, 2 hashes or one of each
if [ -f "$1" ]; then
hash1=$(PerceptualHash "$1")
else
hash1=$1
fi
if [ -f "$2" ]; then
hash2=$(PerceptualHash "$2")
else
hash2=$2
fi
HammingDistance $hash1 $hash2
exit 0
fi
Usage
次のように、各画像とカードの正規化された相互相関も試しました。
#!/bin/bash
size="300x400!"
convert card.png -colorspace RGB -normalize -resize $size card.jpg
for i in *.jpg
do
cc=$(convert $i -colorspace RGB -normalize -resize $size JPG:- | \
compare - card.jpg -metric NCC null: 2>&1)
echo "$cc:$i"
done | sort -n
そして、私はこの出力を得ました(一致品質でソートされています):
0.453999:abundance.jpg
0.550696:aggressive.jpg
0.629794:demystify.jpg
これは、このカードが と最もよく相関していることを示していますdemystify.jpg
。
すべての画像を同じサイズにサイズ変更し、コントラストを正規化して、簡単に比較できるようにし、コントラストの違いによる影響を最小限に抑えたことに注意してください。それらを小さくすると、相関に必要な時間も短縮されます。
私があなたを正しく理解しているなら、それらを写真として比較する必要があります. ここには、非常に単純ですが効果的な解決策が 1 つあります。それはSikuliと呼ばれます。
コレクションのどの画像が自分の画像に最も似ているかを見つけるには、どのツールを使用できますか?
このツールは画像処理で非常にうまく機能し、カード (画像) が既にパターンとして定義したものに似ているかどうかを見つけるだけでなく、部分的な画像コンテンツ (いわゆる四角形) も検索できます。
デフォルトでは、Python を介してその機能を拡張できます。パーセンテージで similarity_pattern を受け入れるように ImageObject を設定できます。そうすることで、探しているものを正確に見つけることができます。
また、このツールのもう 1 つの大きな利点は、基本を 1 日で学習できることです。
お役に立てれば。