2013-06-18 26 views
4

我想要找到兩個圖像之間的一個或幾個差異的輪廓。查找圖像之間的差異輪廓

假設你有兩個相同的圖像。然後在隨機位置添加一個不透明的正方形和三角形。形狀可能不重疊。

我想獲得這些形狀的最外像素的座標,這些座標必須是「分組」 - >我想獲得兩組座標,每組形狀爲一組。

我試着比較每個像素,並採取最小和最大x和y值,這給了我一個形狀的邊界框。這有兩個問題:它給我的邊界框,而不是形狀的輪廓。只有在圖像中沒有多於一個形狀的情況下才有效。

我不能爲我的生活想辦法完成這件事。

我非常依賴於php,但可以與gd或imagick一起使用。我對gd略有偏好,但imagick更快更強大,所以也沒關係。

加分:最終結果應該是一個簡單的(儘可能簡單)每個形狀的多邊形。精確度的一些損失是可以的,事實上是鼓勵的。多邊形的線條不必完全遵循輪廓線,允許有一些偏差而偏向於較少的點。

編輯:
我的意思「輪廓」是這樣的:假設我有一個形象與畫上有一個矩形。我想找到的輪廓是構成矩形的四個點。這個正方形畫的圖像可以是任何圖像。它可能是一個白色的畫布或風景或肖像,你的名字。
而我現在意識到的是,點的順序很重要。我必須能夠重新繪製廣場,而不是以沙漏形狀結束。

編輯2:
我更近一步使用imagick。

convert img/modified.png img/original.png -compose ChangeMask -composite out.png 

此命令使用原件作爲修改版本的掩碼,並給我一個只有其形狀的圖像。也許有了這張圖片,我可以使用標準的邊緣檢測算法。
一個持續存在的問題:它只適用於圖像中只有一個形狀。但是,如果事實證明這是一個後果,那麼我猜這樣做會好的。

編輯3:
我現在能得到不太複雜形狀的輪廓。但是它會導致數百個點,這太多了。應該壓縮到大約20分。

的過程如下:

  • 我使用上面的ImageMagick命令這使我的圖像只形狀,圖像的其餘部分是TRANSPARANT
  • 在該圖像I從頂部開始(0,0)並向下看,找到一個不透明的像素。然後我看(1,0)等。當我到達結尾時,我開始在(寬度,0)並向左看非透明像素。通過這種方式,我可以遍歷圖像以「感受」輪廓。
+0

爲什麼不嘗試標準輪廓算法之一?例如,canny,gradient,laplasian ... –

+0

這些算法用於邊緣檢測,這不是我想要做的。您可以將其視爲查找兩幅圖像之間的差異。 –

+0

然後說出「輪廓」是什麼意思?如果這是等值線,則可以使用步進平方算法。 –

回答

0

Here是一個體面的幾個輪廓跟蹤算法的演練。就個人而言,我使用了Moore-neighborhood tracing算法(another link),並取得了良好的效果。我發現這是準確的,它保留了這個順序,所以你不會遇到沙漏問題。但是在我到達那一點之前,我經常需要做一些預處理(morphological filters或圖像減法(如您所發現的那樣))。

這兩個步驟後,你應該有一個點的集合。你有兩個選擇:

1)複雜:將它們收集到載體中。如果向量劇烈地改變斜率(或方向),你知道你有一個點。命令行工具如potrace可以執行此操作。 potrace的算法是here,非常好。在你的簡單矩形的例子中,這將起作用,但它也可以在一個更復雜的場景中工作,如一個圓圈(你將只有很多圓圈的向量)。

2)簡單:使用Moore-Neigborhood旅行發現的像素,並確定方向的變化。 (也就是說,如果三個像素形成一條直線,並且接下來的三個像素不是通過某個閾值x「內聯」的,那麼你就有一個角)。該算法適用於正方形,但對於更復雜的圖像(如八角形和圓形之間的角度三角洲更鈍)開始分解。

如果你的所有形狀都足夠簡單(方形等),你也可以考慮模板匹配(簡單形狀檢測)。在Aforge文檔中有一個很好的鏈接here