2009-12-06 60 views
2

我不知道這是否應該在數學論壇或編程論壇上發佈,但我會在兩篇文章中發佈它,並查看我的位置。試圖僅使用圖像推導2D變換矩陣

我有兩個計算機圖像......其中一個是「原始」圖像(一個大的TIF文件)。另一個是原始圖像的轉換版本......它被旋轉,剪切並翻譯成軟件程序。我需要對變換後的圖像做一些工作,但我需要原始圖像中每個像素的(x-y)座標來完成我的計算。

我知道圖像是旋轉和剪切的3x3變換矩陣。如果我有矩陣,我可以從第一個(或反之亦然)自己推導出第二個圖像。我不知道旋轉,剪切或翻譯的確切程度,所以我不能從一組已知的變換中推導出矩陣。我所做的是每個圖像中的一組對應點(角點等)以及它們對應的(x,y)座標。所以這是我的困境:

使用一組相應的變換點((x,y) - >(x',y'),它們中的三個或更多)可以導出用於轉動的變換矩陣一個圖像到另一個?如果我可以導出矩陣,我可以求出所有像素的原始座標(全部1,800萬像素),並完成我需要做的計算。

任何人都可以幫忙嗎?我對線性代數很熟悉......只是不夠熟悉,沒有一個完整的頭部劃痕就可以推導出來。任何感謝!

  • 邁克
+0

這個問題一直讓我着迷。請看看[這裏](http://stackoverflow.com/questions/8959657/order-sequence-of-matrix-transformations-in-2d)和[這裏](http://stackoverflow.com/questions/8834070 /矩陣座標變換順序)。如果我只能將你的答案翻譯成簡單的編程。 – 2012-01-22 07:46:42

回答

3

不確定是否需要說明書自動 ...

手冊

如果您指定的長方形的四個角的變換後的座標,那麼你就可以推導出變換方程:

alt text http://www.praeclarum.org/so/wellner.png

(皮埃爾Wellner的Interacting with Paper on the DigitalDesk和更多細節在他的Thesis

現在你只需要求解方程的係數灰。

有四個點對,兩組四個同時線性方程可以快速通過高斯消元法求解,找到C 1-8的值。

最後,您可以將這些方程轉換爲您需要的3x3矩陣。上面的公式足夠強大,可以進行非線性變換,並且可以將其簡化爲3x3仿射剪切矩陣。

但我會堅持使用nonliner方程(上面),因爲他們可以處理透視失真

自動

相同的方法,但可以使用邊緣檢測器與一個行檢測算法comboined找到一組4個肥胖型線妝容的矩形。

如果你的圖像矩形真正站出來(在一個黑暗的背景whiteish圖像),那麼你可以使用角點檢測可以從像OpenCV's Feature Detection庫(見cvCornerHarris)。

您可以將這些線相交以找到四個角並使用轉換方程。

+0

我應該讓邁克爲自己說話,但我覺得絕望不足以理解你的解釋。我想我們中的很多人只是熟悉數學。 – 2009-12-06 19:15:19

+0

哦。高斯消除法在諸如「數值算法」等書籍中有很好的記載。但是我想強調一下,這比3x3仿射變換要好得多,因爲它可以處理透視失真(非線性非仿射變換)。如果有興趣,我可以擴展我的答案。 – 2009-12-06 19:19:11

+0

評論範圍。我想補充一點,我已經在生產項目中使用了這種精確的方法,效果非常好。我道歉,如果我沒有公正地做,但不要讓我的描述使你遠離這種強大的技術。請閱讀鏈接的材料。 – 2009-12-06 19:22:03

1

我想你應該提供的清單開始,說 點(6個未知數)與X/Y改造前後的座標。

然後有人比我更聰明的將它彈入一組線性方程組,然後將它饋送給(比方說)Wolfram Alpha進行求解。

Java的文檔爲AffineTransform頂部顯示矩陣需要如何設置:

[ x'] [ m00 m01 m02 ] [ x ] [ m00x + m01y + m02 ] 
[ y'] = [ m10 m11 m12 ] [ y ] = [ m10x + m11y + m12 ] 
[ 1 ] [ 0 0 1 ] [ 1 ] [   1   ] 

除去大部分絨毛葉:

[ x'] [ m00x + m01y + m02 ] 
[ y'] = [ m10x + m11y + m12 ] 

然後你只需設置一組6 x 2像這樣的公式:

m00x + m01y + m02 - x' = 0 
m10x + m11y + m12 - y' = 0 

(重複2個其他x/y before/afte r對)

並將它們扔在方程求解器中。

+0

這是對我的答案的簡化,您只需簡單地刪除c3和c7的術語。但是,拼寫實際的線性代數的工作很好。你的「方程求解器」是我的「消除高斯」。 – 2009-12-06 19:25:17

+0

謝謝!我很高興看到我接近。我想我30年前做過我的最後一個GE;從那以後,我一直很樂意讓程序去做。很高興看到邁克被親們照顧。 – 2009-12-06 19:51:58

1

您只需要3個點來定義3x3變換矩陣。如果你有點(0,0),(0,1)和(1,0)並通過矩陣[abcdef 0 0 1]進行變換,你將得到(c,f),(b,e)和(a,d)。

+0

哦...我們有6個未知數,但每對點有兩個方程...所以3對將給我們6個方程。聰明! – 2009-12-06 19:13:41