4

私の画像が単純な形状であるとしましょう-線、点、曲線、単純なオブジェクトのセット、画像間の距離を計算するにはどうすればよいですか-長さは重要ですが、全体の縮尺は重要ではありません、線/曲線の位置は重要です、角度は重要など

添付画像例:

私の比較オブジェクトは左上の立方体です。スコアはこの例のためだけに架空のものです。

  1. 円柱までの距離は80です(2本の線がありますが、上部の形状が異なります)
  2. 左下のキューブスコアは、スケールが異なるラインと完全に一致するため、100です。
  3. 右下の長方形スコアは90です。これは、上部に正確な一致線があり、側面に異なるスケール線があるためです。

解決策を考え始めるのに役立つアルゴリズム名または一般的なアプローチを探しています。

ご協力ありがとうございました。

ここに画像の説明を入力してください

4

3 に答える 3

2

ここにあなたが始めるための何かがあります。新しい問題に飛び込むとき、どこかで使用できるという理由だけで、多くの複雑なステップを試すことにあまり価値がありません。ですから、私の焦点は比較的単純なものを使用することにあります。それは、より多様な状況では失敗しますが、うまくいけば、その価値を理解し、問題をある程度理解できるでしょう。

このアプローチは、完全にコーナー検出に基づいています。この検出の2つの典型的な方法は、Harris検出器、または1994年の論文「GoodFeatures to Track」で説明されているShiとTomasiによる方法です。OpenCV、新しいMatlabにすぐに実装できるという理由だけで、2番目の方法を使用します。そしておそらく他の多くの場所。これらのパッケージへの実装により、コーナーの品質とコーナー間の最小距離に関して、パラメーターの調整が容易になります。では、すべてのコーナーポイントを正しく検出できるとしたら、これらのポイントに基づいて、ある形状が別の形状にどれだけ近いかをどのように測定しますか?画像のサイズは任意なので、ポイント座標を[0、1]の範囲に正規化するのが私の考えです。これにより、元の説明に従って望ましいスケーリングの問題が解決されます。ここで、範囲[0、1]。ここでは、最も単純なことを説明します。1つのポイントを検討します。p形から、形aの最も近い点は何bですか?この点pとの任意の点との間で絶対的に異なる最小値を持つものであると想定しbます。すべての値を合計すると、形状間のスコアが得られます。スコアが低いほど、形状が似ています(このアプローチによる)。

これが私が描いたいくつかの形です:

ここに画像の説明を入力してくださいここに画像の説明を入力してくださいここに画像の説明を入力してくださいここに画像の説明を入力してくださいここに画像の説明を入力してくださいここに画像の説明を入力してください

検出されたコーナーは次のとおりです。

ここに画像の説明を入力してくださいここに画像の説明を入力してくださいここに画像の説明を入力してくださいここに画像の説明を入力してくださいここに画像の説明を入力してくださいここに画像の説明を入力してください

この最後の画像セットではっきりとわかるように、この方法では長方形/正方形と円柱を簡単に混同します。これを処理するには、アプローチを他の記述子と組み合わせる必要があります。最初に、考えられる単純なものは、形状の面積とその境界ボックスの面積の比率です(長方形の場合は1、円柱の場合はそれより低くなります)。

上記の方法で、第1と第2の形状、第1と第3の形状、...の間の測定値は、それぞれ0.02358485、0.41350339、0.30128458 0.4980852、0.18031262です。2番目のキューブは、最初のキューブのサイズを変更したバージョンであり、ご覧のとおり、このメトリックでは非常によく似ています。最後の形状は、最初の立方体のサイズを変更したバージョンですが、アスペクト比を維持せず、メトリックによってはるかに大きな差が得られます。

これを実行するコードを試してみたい場合は、次のようになります(Pythonでは、OpenCV、numpyに依存します)。

import sys
import cv2 as cv
import numpy

inp = []
for fname in sys.argv[1:]:
    img_color = cv.imread(fname)
    img = cv.cvtColor(img_color, cv.COLOR_RGB2GRAY)
    inp.append((img_color, img))

ptsets = []

# Corner detection parameters.
params = (
        200,  # max number of corners
        0.01, # minimum quality level of corners
        10,   # minimum distance between corners
)
# Params for visual circle markers.
circle_radii = 3
circle_color = (255, 0, 0)
for i, (img_color, img) in enumerate(inp):
    height, width = img.shape
    cornerMap = cv.goodFeaturesToTrack(img, *params)
    corner = numpy.array([c[0] for c in cornerMap])

    for c in corner:
        cv.circle(img_color, tuple(c), circle_radii, circle_color, -1)

    # Just to visually check for correct corners.
    cv.imwrite('temp_%d.png' % i, img_color)

    # Convert corner coordinates to [0, 1]
    cornerUnity = (corner - corner.min()) / (corner.max() - corner.min())
    # You might want to use other descriptors here. XXX
    ptsets.append(cornerUnity)


def compare_ptsets(p):
    res = numpy.zeros(len(p))

    base = p[0]
    for i in xrange(1, len(p)):
        sum_min_diff = sum(numpy.abs(p[i] - value).min() for value in base)
        res[i] = sum_min_diff

    return res

res = compare_ptsets(ptsets)
print res
于 2012-12-20T19:18:50.807 に答える
1

従うべきプロセスは、検討する機能の深さと必要な精度によって異なります。

より正確なものが必要な場合は、具体的で実績のあるアプローチまたはアルゴリズムを提供できるこのような技術論文を検索してください。

編集:

Waltzアルゴリズム(AIの1つの方法)のアイデアを微調整することができます。これは私の考えです。元の画像を解釈し、そこからいくつかの制約を生成します。候補ごとに、それが満たす制約の数を調べます。より多くの制約を満たすものは、元の画像に最も類似しています。

于 2012-12-19T06:05:17.767 に答える
0

各図の重心を計算してみてください。図の各点を、質量が1に等しい粒子として扱います。

次に、各距離をとして計算しますsqrt((x1-x2)^2 + (y1-y2)^2)。ここで、(xi、yi)は図iの重心座標です。

于 2012-12-19T05:53:11.197 に答える