2012-12-19 80 views
4

說我的圖像是簡單的形狀 - 線條,點,曲線和簡單物體的集合, 如何計算圖像之間的距離 - 所以長度很重要,但總比例不重要,位置線的\曲線是重要的,角度是重要等一組線條之間的距離

附帶圖像例如:

我的比較對象是在左上角的立方體,得分是虛構的只是本實施例中。

  1. 其在氣缸的距離爲80(有2條線,但頂部的幾何形狀是不同的)
  2. 左下立方體得分爲100,因爲它完全匹配線具有不同的規模。
  3. 右下方的矩形得分爲90,因爲它在頂部具有精確的匹配線,但在側面具有不同的比例線。

我找算法名稱或通用的方法,這將有助於我開始想爭取解決....

謝謝您的幫助。

enter image description here

+0

你忘了對你的問題的一個非常重要和關鍵的方面發表評論:這些形狀是如何獲得的?是否有人手動繪製它們?或者,也許,你有一組定義形狀的點嗎?如果前者,那麼你有一個很難的問題,只能通過猜測近似。 – mmgp

+0

我會通過邊緣和線條檢測或Hough變換得到圖像,原始圖像是簡單形狀的灰度等比例圓三角形等等,所以變換輸出應該(理論上)與原始輸入相匹配 – user648026

+0

好,但我' m好奇,看看你將如何處理任意使用霍夫線:)如果我有時間後,我會讚揚你的最新信息貢獻一些答案。 – mmgp

回答

2

這是讓你開始的東西。當跳入新問題時,我並沒有看到很多複雜的步驟,因爲它們可以在某個地方使用。所以我的重點是使用相對簡單的東西,這會在更多不同的情況下失敗,但希望你會看到它的價值,並對問題有所瞭解。

該方法完全基於角點檢測;這種檢測的兩種典型方法是哈里斯檢測器或由Shi和Tomasi在1994年的文章「良好特徵追蹤」中所描述的檢測方法。我將使用第二種檢測方法,這是因爲在OpenCV,較新的Matlab,並可能有很多其他地方。它在這些軟件包上的實現還允許更方便地調整參數,關於拐角質量和拐角之間的最小距離。所以,假設你可以正確地檢測所有的角點,你如何測量一個形狀與另一個形狀的接近程度?圖像具有任意大小,所以我的想法是將點座標標準化到範圍[0,1]。這解決了根據原始描述需要的縮放問題。現在我們必須比較[0,1]範圍內的點集。在這裏,我們走最簡單的事情:考慮形狀a形狀p一個點,形狀b最接近的點是什麼?我們假設這是一個最小的絕對差值在pb中的任意一點之間。如果我們總結所有的值,我們會得到形狀之間的得分。分數越低,形狀越相似(根據這種方法)。

下面是一些形狀,我畫:

enter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description here

這裏是檢測的角點:

enter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description here

正如你在這最後一組圖像中可以清楚地看到的那樣,該方法很容易將一個矩形/正方形與圓柱混淆。爲了處理這個問題,您需要將該方法與其他描述符結合使用。最初,您可能會考慮的一個簡單問題是形狀面積與邊界框面積之間的比率(這將使矩形爲1,圓柱體爲較低)。使用上述方法,這裏分別是第一和第二形狀,第一和第三形狀,......之間的測量值:0.02358485,0.41350339,0.30128458 0.4980852,0.18031262。第二個立方體是第一個立方體的縮放版本,正如您所看到的,它們與此度量標準非常相似。最後一個形狀是第一個立方體的調整大小版本,但沒有保持縱橫比,並且該度量標準給出了更高的差異。

如果你想執行這個代碼玩,這裏是(在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 
+0

謝謝你的詳細解答,任意曲線確實是我的問題。 你如何建議處理曲線? – user648026

+0

角點檢測也是一個很好的起點。檢測角落後,您可以輕鬆拆分線條。現在取決於這些曲線實際上是多麼隨心所欲。如果我自己解決了這個問題,並且在我自己的限制之下施加了一些限制,那麼我可能會使用樣條近似來描述兩個數字中線條的相似程度。 – mmgp

0

嘗試計算mass center每個人物。將質點的每個點視爲質量等於1的粒子。

然後計算每個距離爲sqrt((x1-x2)^2 + (y1-y2)^2),其中(xi,yi)是圖1的質心座標。

+0

你對這些距離做了什麼? – irrelephant

1

要遵循的過程取決於要考慮的功能的深度和要求的精度。

如果你想要更精確的東西,可以搜索一些技術文件,如this,它可以給出一個具體和成熟的方法或算法。

編輯:

華爾茲算法(在AI的一種方法)可以調整的想法。這只是我的想法。解釋原始圖像,從中產生一些限制。對於每個候選人,找出它滿足的約束數目。滿足更多約束條件的將與原始圖像最相似。