前言
圖像變換是指通過(guò)對(duì)圖像進(jìn)行縮放、平移、旋轉(zhuǎn)、仿射、透視等變換來(lái)改變圖像的形狀和大小。在本篇博客中,我們將詳細(xì)介紹OpenCV中的圖像變換函數(shù),并提供示例代碼以幫助讀者更好地理解這些函數(shù)的使用方法。
1. 縮放變換
縮放變換是指通過(guò)改變圖像的大小來(lái)改變圖像的形狀。在OpenCV中,可以使用resize函數(shù)實(shí)現(xiàn)縮放變換。該函數(shù)的原型如下:
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
其中,src表示原圖像,dst表示輸出圖像,dsize表示輸出圖像的大小,fx和fy表示在x和y方向上的縮放因子,interpolation表示縮放方法,常見(jiàn)的有以下5種:
- cv2.INTER_NEAREST 最近鄰插值法;
- cv2.INTER_LINEAR 雙線性插值法(默認(rèn))(推薦放大處理);
- cv2.INTER_AREA 基于局部像素點(diǎn)的重采樣(推薦縮小處理);
- cv2.INTER_CUBIC 基于4x4像素鄰域的3次插值法(推薦放大處理);
- cv2.INTER_LANCZOS4 基于8x8像素鄰域的lanczos插值;
下面是一個(gè)簡(jiǎn)單的示例代碼,展示如何使用resize函數(shù)進(jìn)行圖像縮放:
import cv2
# 加載圖像
img = cv2.imread('input.jpg')
# 縮放圖像
resized_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)
# 顯示縮放后的圖像
cv2.imshow('Resized Image', resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的示例代碼中,我們首先使用cv2.imread函數(shù)加載輸入圖像,然后使用cv2.resize函數(shù)將圖像縮小一半,最后使用cv2.imshow函數(shù)顯示縮放后的圖像。
2. 平移變換
**平移變換是指通過(guò)改變圖像的位置來(lái)改變圖像的形狀。**在OpenCV中,可以使用warpAffine函數(shù)實(shí)現(xiàn)平移變換。該函數(shù)的原型如下:
void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
其中,src表示原圖像,dst表示輸出圖像,M表示變換矩陣,dsize表示輸出圖像的大小,flags表示插值方法,borderMode表示邊界填充模式,borderValue表示填充顏色。
下面是一個(gè)簡(jiǎn)單的示例代碼,展示如何使用warpAffine函數(shù)進(jìn)行圖像平移:
import cv2
import numpy as np
# 加載圖像
img = cv2.imread('input.jpg')
# 定義平移矩陣
M = np.float32([[1, 0, 100], [0, 1, 50]])
# 平移圖像
translated_img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
# 顯示平移后的圖像
cv2.imshow('Translated Image', translated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的示例代碼中,我們首先使用cv2.imread函數(shù)加載輸入圖像,然后定義一個(gè)平移矩陣M,其中第一行表示在x方向上平移100個(gè)像素,第二行表示在y方向上平移50個(gè)像素。最后,我們使用cv2.warpAffine函數(shù)對(duì)圖像進(jìn)行平移,并使用cv2.imshow函數(shù)顯示平移后的圖像。
3. 旋轉(zhuǎn)變換
**旋轉(zhuǎn)變換是指通過(guò)改變圖像的方向來(lái)改變圖像的形狀。**在OpenCV中,可以使用getRotationMatrix2D和warpAffine函數(shù)實(shí)現(xiàn)旋轉(zhuǎn)變換。getRotationMatrix2D函數(shù)用于計(jì)算旋轉(zhuǎn)矩陣,warpAffine函數(shù)用于對(duì)圖像進(jìn)行旋轉(zhuǎn)變換。這兩個(gè)函數(shù)的原型如下:
Mat getRotationMatrix2D(Point2f center, double angle, double scale);
void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
其中,center表示旋轉(zhuǎn)中心,angle表示旋轉(zhuǎn)角度,scale表示縮放因子,src表示原圖像,dst表示輸出圖像,M表示變換矩陣,dsize表示輸出圖像的大小,flags表示插值方法,borderMode表示邊界填充模式,borderValue表示填充顏色。
下面是一個(gè)簡(jiǎn)單的示例代碼,展示如何使用getRotationMatrix2D和warpAffine函數(shù)進(jìn)行圖像旋轉(zhuǎn):
import cv2
import numpy as np
# 加載圖像
img = cv2.imread('input.jpg')
# 計(jì)算旋轉(zhuǎn)矩陣
center = (img.shape[1] / 2, img.shape[0] / 2)
angle = 45
scale = 1
M = cv2.getRotationMatrix2D(center, angle, scale)
# 旋轉(zhuǎn)圖像
rotated_img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
# 顯示旋轉(zhuǎn)后的圖像
cv2.imshow('Rotated Image', rotated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的示例代碼中,我們首先使用cv2.imread函數(shù)加載輸入圖像,然后使用cv2.getRotationMatrix2D函數(shù)計(jì)算旋轉(zhuǎn)矩陣M,其中center表示旋轉(zhuǎn)中心,angle表示旋轉(zhuǎn)角度,scale表示縮放因子。最后,我們使用cv2.warpAffine函數(shù)對(duì)圖像進(jìn)行旋轉(zhuǎn),并使用cv2.imshow函數(shù)顯示旋轉(zhuǎn)后的圖像。
4. 仿射變換
**仿射變換是指通過(guò)線性變換來(lái)改變圖像的形狀。**在OpenCV中,可以使用getAffineTransform和warpAffine函數(shù)實(shí)現(xiàn)仿射變換。getAffineTransform函數(shù)用于計(jì)算仿射變換矩陣,warpAffine函數(shù)用于對(duì)圖像進(jìn)行仿射變換。這兩個(gè)函數(shù)的原型如下:
Mat getAffineTransform(const Point2f src[], const Point2f dst[]);
void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar() )
其中,src表示原圖像中的三個(gè)點(diǎn),dst表示變換后的三個(gè)點(diǎn),M表示變換矩陣,dsize表示輸出圖像的大小,flags表示插值方法,borderMode表示邊界填充模式,borderValue表示填充顏色。
下面是一個(gè)簡(jiǎn)單的示例代碼,展示如何使用getAffineTransform和warpAffine函數(shù)進(jìn)行仿射變換:
import cv2
import numpy as np
# 加載圖像
img = cv2.imread('input.jpg')
# 定義原圖像中的三個(gè)點(diǎn)和變換后的三個(gè)點(diǎn)
src_points = np.float32([[50, 50], [200, 50], [50, 200]])
dst_points = np.float32([[10, 100], [200, 50], [100, 250]])
# 計(jì)算仿射變換矩陣
M = cv2.getAffineTransform(src_points, dst_points)
# 仿射變換圖像
affine_img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
# 顯示變換后的圖像
cv2.imshow('Affine Image', affine_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的示例代碼中,我們首先使用cv2.imread函數(shù)加載輸入圖像,然后定義原圖像中的三個(gè)點(diǎn)和變換后的三個(gè)點(diǎn),其中src_points表示原圖像中的三個(gè)點(diǎn)的坐標(biāo),dst_points表示變換后的三個(gè)點(diǎn)的坐標(biāo)。最后,我們使用cv2.getAffineTransform函數(shù)計(jì)算仿射變換矩陣M,并使用cv2.warpAffine函數(shù)對(duì)圖像進(jìn)行仿射變換,并使用cv2.imshow函數(shù)顯示變換后的圖像。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-731348.html
除了以上介紹的幾種變換,OpenCV中還提供了許多其他的圖像變換函數(shù),例如透視變換、極坐標(biāo)變換等等,后續(xù)給大家分享。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-731348.html
到了這里,關(guān)于【OpenCV】圖像變換(縮放、平移、旋轉(zhuǎn)、仿射)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!