溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何分析Python圖像處理中的幾何變換

發(fā)布時(shí)間:2022-02-05 08:48:54 來(lái)源:億速云 閱讀:178 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

今天就跟大家聊聊有關(guān)如何分析Python圖像處理中的幾何變換,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

一.圖像幾何變換

圖像幾何變換不改變圖像的像素值,在圖像平面上進(jìn)行像素變換。適當(dāng)?shù)膸缀巫儞Q可以最大程度地消除由于成像角度、透視關(guān)系乃至鏡頭自身原因所造成的幾何失真所產(chǎn)生的負(fù)面影響。幾何變換常常作為圖像處理應(yīng)用的預(yù)處理步驟,是圖像歸一化的核心工作之一[1]。

一個(gè)幾何變換需要兩部分運(yùn)算:

空間變換:包括平移、縮放、旋轉(zhuǎn)和正平行投影等,需要用它來(lái)表示輸出圖像與輸入圖像之間的像素映射關(guān)系。

灰度插值算法:按照這種變換關(guān)系進(jìn)行計(jì)算,輸出圖像的像素可能被映射到輸入圖像的非整數(shù)坐標(biāo)上[2]。

圖像幾何變換在變換過(guò)程中會(huì)建立一種原圖像像素與變換后圖像像素之間的映射關(guān)系,通過(guò)這種關(guān)系,能夠從一方的像素計(jì)算出另一方的像素的坐標(biāo)位置。通常將圖像坐標(biāo)映射到輸出的過(guò)程稱(chēng)作向前映射,反之,將輸出圖像映射到輸入的過(guò)程稱(chēng)作向后映射。向后映射在實(shí)踐中使用較多,原因是能夠避免使用向前映射中出現(xiàn)映射不完全和映射重疊的問(wèn)題。

圖6-1展示了圖像放大的示例,右邊圖中只有(0,0)、(0,2)、(2,0)、(2,2)四個(gè)坐標(biāo)根據(jù)映射關(guān)系在原圖像中找到了相對(duì)應(yīng)的像素,其余的12個(gè)坐標(biāo)沒(méi)有有效值[3]。

如何分析Python圖像處理中的幾何變換

對(duì)于數(shù)字圖像而言,像素的坐標(biāo)是離散型非負(fù)整數(shù),但是在進(jìn)行變換的過(guò)程中有可能產(chǎn)生浮點(diǎn)坐標(biāo)值。這在圖像處理中是一個(gè)無(wú)效的坐標(biāo)。為了解決這個(gè)問(wèn)題需要用到插值算法。常見(jiàn)算法如下:

  • 最近鄰插值

  • 雙線性插值

  • 雙立方插值

圖像變換是建立在矩陣運(yùn)算基礎(chǔ)上,通過(guò)矩陣運(yùn)算可以很快找到對(duì)應(yīng)關(guān)系。在這篇文章中,我們將介紹常見(jiàn)的圖像幾何變換,包括圖形平移、圖像縮放、圖像旋轉(zhuǎn)、圖像鏡像、圖像仿射、圖像透視等。

二.圖像平移

圖像平移是將圖像中的所有像素點(diǎn)按照給定的平移量進(jìn)行水平或垂直方向上的移動(dòng)。假設(shè)原始像素的位置坐標(biāo)為(x0,y0),經(jīng)過(guò)平移量(△x,△y)后,坐標(biāo)變?yōu)椋▁1, y1),如圖6-2所示[3-5]。

如何分析Python圖像處理中的幾何變換

用數(shù)學(xué)式子表示為公式(6-1)。

如何分析Python圖像處理中的幾何變換

用矩陣表示如公式(6-2)所示:

如何分析Python圖像處理中的幾何變換

式子中,矩陣稱(chēng)為平移變換矩陣或因子,△x和△y稱(chēng)為平移量。圖像平移首先定義平移矩陣M,再調(diào)用warpAffine()函數(shù)實(shí)現(xiàn)平移,核心函數(shù)如下:

M = np.float32([[1, 0, x], [0, 1, y]])

– M表示平移矩陣,其中x表示水平平移量,y表示垂直平移量

shifted = cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

– src表示原始圖像

– M表示平移矩陣

– dsize表示變換后的輸出圖像的尺寸大小

– dst為輸出圖像,其大小為dsize,類(lèi)型與src相同

– flag表示插值方法的組合和可選值

– borderValue表示像素外推法,當(dāng)borderMode = BORDER_TRANSPARENT時(shí),表示目標(biāo)圖像中的像素不會(huì)修改源圖像中的“異常值”。

– borderValue用于邊界不變的情況,默認(rèn)情況下為0

下面代碼是圖像平移的一個(gè)簡(jiǎn)單案例,它定義了圖像平移矩陣M,然后調(diào)用warpAffine()函數(shù)將原始圖像垂直向下平移了50個(gè)像素,水平向右平移了100個(gè)像素。

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2
import numpy as np

#讀取圖片
src = cv2.imread('scenery.png')

#圖像平移矩陣
M = np.float32([[1, 0, 100], [0, 1, 50]])

#獲取原始圖像列數(shù)和行數(shù)
rows, cols = src.shape[:2]

#圖像平移
result = cv2.warpAffine(src, M, (cols, rows)) 

#顯示圖像
cv2.imshow("original", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結(jié)果如圖6-3所示:

如何分析Python圖像處理中的幾何變換

下面一個(gè)案例是將圖像分別向下、向上、向右、向左平移,再調(diào)用matplotlib繪圖庫(kù)依次繪制的過(guò)程。

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt
 
#讀取圖片
img = cv2.imread('scenery.png')
image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#圖像平移
#垂直方向 向下平移100
M = np.float32([[1, 0, 0], [0, 1, 100]])
img1 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

#垂直方向 向上平移100
M = np.float32([[1, 0, 0], [0, 1, -100]])
img2 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

#水平方向 向右平移100
M = np.float32([[1, 0, 100], [0, 1, 0]])
img3 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

#水平方向 向左平移100
M = np.float32([[1, 0, -100], [0, 1, 0]])
img4 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

#循環(huán)顯示圖形
titles = [ 'Image1', 'Image2', 'Image3', 'Image4']  
images = [img1, img2, img3, img4]  
for i in range(4):  
   plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()

輸出結(jié)果如圖6-4所示,它從四個(gè)方向都進(jìn)行了平移,并且調(diào)用subplot()函數(shù)將四個(gè)子圖繪制在一起。

如何分析Python圖像處理中的幾何變換

三.圖像縮放

圖像縮放(image scaling)是指對(duì)數(shù)字圖像的大小進(jìn)行調(diào)整的過(guò)程。在Python中,圖像縮放主要調(diào)用resize()函數(shù)實(shí)現(xiàn),函數(shù)原型如下:

result = cv2.resize(src, dsize[, result[. fx[, fy[, interpolation]]]])

– src表示原始圖像

– dsize表示圖像縮放的大小

– result表示圖像結(jié)果

– fx表示圖像x軸方向縮放大小的倍數(shù)

– fy表示圖像y軸方向縮放大小的倍數(shù)

– interpolation表示變換方法。CV_INTER_NN表示最近鄰插值;CV_INTER_LINEAR表示雙線性插值(缺省使用);

CV_INTER_AREA表示使用像素關(guān)系重采樣,當(dāng)圖像縮小時(shí),該方法可以避免波紋出現(xiàn),當(dāng)圖像放大時(shí),類(lèi)似于CV_INTER_NN;

CV_INTER_CUBIC表示立方插值

常見(jiàn)的圖像縮放兩種方式如下所示,第一種方式是將原圖像設(shè)置為(160, 160)像素大小,第二種方式是將原始圖像縮小為0.5倍。

  • result = cv2.resize(src, (160,160))

  • result = cv2.resize(src, None, fx=0.5, fy=0.5)

設(shè)(x1, y1)是縮放后的坐標(biāo),(x0, y0)是縮放前的坐標(biāo),sx、sy為縮放因子,則圖像縮放的計(jì)算公式(6-3)所示:

如何分析Python圖像處理中的幾何變換

下面是Python實(shí)現(xiàn)圖像縮放的代碼,它將所讀取的風(fēng)景圖像進(jìn)行縮小。

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
 
#讀取圖片
src = cv2.imread('scenery.png')

#圖像縮放
result = cv2.resize(src, (200,100))
print(result.shape)

#顯示圖像
cv2.imshow("original", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結(jié)果如圖6-5所示,圖像縮小為(100, 200, 3)像素。注意,代碼中調(diào)用函數(shù) cv2.resize(src, (200,100)) 設(shè)置新圖像大小dsize的列數(shù)為200,行數(shù)為100。

如何分析Python圖像處理中的幾何變換

下面講解另一種圖像縮放變換的方法,通過(guò)原始圖像像素乘以縮放系數(shù)進(jìn)行圖像變換,代碼如下:

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
 
#讀取圖片
src = cv2.imread('scenery.png')
rows, cols = src.shape[:2]
print(rows, cols)

#圖像縮放 dsize(列,行)
result = cv2.resize(src, (int(cols*0.6), int(rows*1.2)))

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

獲取圖片“scenery.png”的元素像素值,其rows值為384,cols值為512,接著進(jìn)行寬度縮小0.6倍、高度放大1.2倍的處理,運(yùn)行前后對(duì)比效果如圖6-6所示。

如何分析Python圖像處理中的幾何變換

最后講解調(diào)用(fx,fy)參數(shù)設(shè)置縮放倍數(shù)的方法,對(duì)原始圖像進(jìn)行放大或縮小操作。下面代碼是fx和fy方向縮小至原始圖像0.3倍的操作。

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
 
#讀取圖片
src = cv2.imread('scenery.png')
rows, cols = src.shape[:2]
print(rows, cols)

#圖像縮放
result = cv2.resize(src, None, fx=0.3, fy=0.3)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出的結(jié)果如圖6-7所示,這是按比例0.3×0.3縮小的。

如何分析Python圖像處理中的幾何變換

四.圖像旋轉(zhuǎn)

圖像旋轉(zhuǎn)是指圖像以某一點(diǎn)為中心旋轉(zhuǎn)一定的角度,形成一幅新的圖像的過(guò)程。圖像旋轉(zhuǎn)變換會(huì)有一個(gè)旋轉(zhuǎn)中心,這個(gè)旋轉(zhuǎn)中心一般為圖像的中心,旋轉(zhuǎn)之后圖像的大小一般會(huì)發(fā)生改變。圖6-8表示原始圖像的坐標(biāo)(x0, y0)旋轉(zhuǎn)至(x1, y1)的過(guò)程。

如何分析Python圖像處理中的幾何變換

旋轉(zhuǎn)公式如(6-4)所示,其中(m,n)是旋轉(zhuǎn)中心,a是旋轉(zhuǎn)的角度,(left,top)是旋轉(zhuǎn)后圖像的左上角坐標(biāo)。

如何分析Python圖像處理中的幾何變換

圖像旋轉(zhuǎn)變換主要調(diào)用getRotationMatrix2D()函數(shù)和warpAffine()函數(shù)實(shí)現(xiàn),繞圖像的中心旋轉(zhuǎn),函數(shù)原型如下:

M = cv2.getRotationMatrix2D(center, angle, scale)

– center表示旋轉(zhuǎn)中心點(diǎn),通常設(shè)置為(cols/2, rows/2)

– angle表示旋轉(zhuǎn)角度,正值表示逆時(shí)針旋轉(zhuǎn),坐標(biāo)原點(diǎn)被定為左上角

– scale表示比例因子

rotated = cv2.warpAffine(src, M, (cols, rows))

– src表示原始圖像

– M表示旋轉(zhuǎn)參數(shù),即getRotationMatrix2D()函數(shù)定義的結(jié)果

– (cols, rows)表示原始圖像的寬度和高度

實(shí)現(xiàn)代碼如下所示:

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
 
#讀取圖片
src = cv2.imread('scenery.png')

#源圖像的高、寬 以及通道數(shù)
rows, cols, channel = src.shape

#繞圖像的中心旋轉(zhuǎn)
#函數(shù)參數(shù):旋轉(zhuǎn)中心 旋轉(zhuǎn)度數(shù) scale
M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)

#函數(shù)參數(shù):原始圖像 旋轉(zhuǎn)參數(shù) 元素圖像寬高
rotated = cv2.warpAffine(src, M, (cols, rows))  

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("rotated", rotated)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

顯示效果如圖6-9所示,繞圖像中心點(diǎn)逆時(shí)針旋轉(zhuǎn)30度。

如何分析Python圖像處理中的幾何變換

看完上述內(nèi)容,你們對(duì)如何分析Python圖像處理中的幾何變換有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI