【第10節(jié)】圖像幾何變換
目標(biāo)
學(xué)習(xí)對(duì)圖像進(jìn)行各種幾個(gè)變換,例如移動(dòng)、旋轉(zhuǎn)、仿射變換等。
將要學(xué)到的函數(shù)有:CV2.getPerspectiveTransform。
變換
????????OpenCV提供了兩個(gè)變換函數(shù), CV2.warpAffine和CV2.warpPerspective,使用這兩個(gè)函數(shù)你可以實(shí)現(xiàn)所有類(lèi)型的變換。CV2.warpAffine 接收的參數(shù)是2 x 3的變換矩陣,而CV2.warpPerspective接收的參數(shù)是3 x 3的變換矩.陣。
1、擴(kuò)展縮放
????????擴(kuò)展縮放只是改變圖像的尺寸大小。OpenCV提供的函數(shù)CV2.resize()可以實(shí)現(xiàn)這個(gè)功能。圖像的尺寸可以自己手動(dòng)設(shè)置,你也可以指定縮放因子。我們可以選擇使用不同的插值方法。在縮放時(shí)我們推薦使用CV2.INTER_ AREA,在擴(kuò)展時(shí)我們推薦使用v2.INTER_ CUBIC (慢)和v2.INTER LINEAR。默認(rèn)情況下所有改變圖像尺寸大小的操作使用的插值方法都是CV2.INTER_ LINEAR。你可以使用下面任意一種方法改變圖像的尺寸:
顯示效果如下:

2、圖像平移
平移就是將對(duì)象換一個(gè)位置。如果你要沿(x, y )方向移動(dòng),移動(dòng)的距離是(tx,ty ),你可以以下面的方式構(gòu)建移動(dòng)矩陣:

????????你可以使用Numpy數(shù)組構(gòu)建這個(gè)矩陣( 數(shù)據(jù)類(lèi)型是np.f1loat32),然后把它傳給函數(shù)CV2.warpAffine()。 看看下面這個(gè)例子吧,它被移動(dòng)了( 100,50 )個(gè)像素。
顯示效果:

3、圖片旋轉(zhuǎn)
????對(duì)一個(gè)圖片旋轉(zhuǎn)角度θ,需要使用下面形式的旋轉(zhuǎn)矩陣。

????????OpenCV允許你在任意地方進(jìn)行旋轉(zhuǎn),但是旋轉(zhuǎn)矩陣的形式應(yīng)修改為:

其中:
? ????????????? ????
????????????????????
????????為了構(gòu)建這個(gè)旋轉(zhuǎn)矩陣,OpenCV提供了一個(gè)函數(shù);CV2.getRotationMatrix2D。下面的例子是在不縮放的情況下將圖像旋轉(zhuǎn)90度。
顯示結(jié)果如下:

4、仿射變換
????????在仿射變換中,原圖中所有的平行線(xiàn)在結(jié)果圖像中同樣平行。為了創(chuàng)建這個(gè)矩陣我們需要從原圖像中找到三個(gè)點(diǎn)以及他們?cè)谳敵鰣D像中的位置。然后CV2.getAfneTransform會(huì)創(chuàng)建一個(gè)2x3的矩陣,最后這個(gè)矩陣會(huì)被傳給函數(shù)CV2.warpAffine。
????????來(lái)看看下面的例子,以及我選擇的點(diǎn)(被標(biāo)記為紅色的點(diǎn))
顯示效果:


5、透視變換
????????對(duì)于視角變換,我們需要一個(gè)3x3變換矩陣。在變換前后直線(xiàn)還是直線(xiàn)。要構(gòu)建這個(gè)變換矩陣,你需要在輸入圖像上找4個(gè)點(diǎn),以及他們?cè)谳敵鰣D像.上對(duì)應(yīng)的位置。這四個(gè)點(diǎn)中的任意三個(gè)都不能共線(xiàn)。這個(gè)變換矩陣可以有函數(shù)CV2.getPerspectiveTransform()構(gòu)建。然后把這個(gè)矩陣傳給函數(shù)CV2.warpPerspective。
代碼如下:
顯示效果如下:

