opencv 幾何学的空間変換:resize()、transpose()、flip()、warpAffine()、rotate()、warpPerspective()

1. スケーリング Resize() は
resize()画像サイズを縮小または拡大できます
dst=cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
src: ソース画像;
dsize: スケーリング後のターゲット画像のサイズ 0 に設定すると、ターゲット画像はソース画像のサイズに fx を乗じることによって取得されますと fy; dsize が優先 fx と fy よりレベルが高い dsize が設定されている場合、それ以降の fx と fy の設定は無効; fx と
fy: dsize が設定されていない場合、fx と fy が幅の倍率として使用されますと高さをそれぞれ;
補間: 補間方法、デフォルト 双線形補間を使用 cv2.INTER_LINEAR;

img_ret1 = cv2.resize(img1,(800,800))
img_ret2 = cv2.resize(img1,None,fx=0.5,fy=0.3)

2. Transpose transpose()
transpose() は、ピクセル添字の x 軸と y 軸の座標の交換を実現できます: dst(i,j)=src(j,i)
dst = cv2.transpose(src[, dst])

img_ret1 = cv2.transpose(img1)
#图像显示效果看,图像以对角线为轴,进行了翻转

3. Flip フリップ()
フリップ() 関数は画像の水平反転、垂直反転、双方向反転を実現できます
dst=cv2.flip(src, flipCode[, dst])
src: ソース画像、
flipCode: 反転モード、0 は水平軸反転 (上下反転)、0 より大きいことを意味します垂直軸反転(左右反転)、0 未満の場合は双方向反転を行います。

```bash
img_ret1 = cv2.flip(img1,0)#水平轴翻转(上下翻转)
img_ret2 = cv2.flip(img1,1)#垂直轴翻转(左右翻转)
img_ret3 = cv2.flip(img1,-1)#双向翻转```
#matplotlib显示 ,需进行通道调换
fig,ax = plt.subplots(2,2)
ax[0,0].set_title('原图')
ax[0,0].imshow(cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)) #matplotlib显示图像为rgb格式
ax[0,1].set_title('上下翻转')
ax[0,1].imshow(cv2.cvtColor(img_ret1,cv2.COLOR_BGR2RGB))
ax[1,0].set_title('左右翻转')
ax[1,0].imshow(cv2.cvtColor(img_ret2,cv2.COLOR_BGR2RGB))
ax[1,1].set_title('双向翻转') 
ax[1,1].imshow(cv2.cvtColor(img_ret3,cv2.COLOR_BGR2RGB))
ax[0,0].axis('off');ax[0,1].axis('off');ax[1,0].axis('off');ax[1,1].axis('off')#关闭坐标轴显示
plt.show() 

4.アフィン変換warpAffine()

アフィン変換
dst=cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
ソース: 入力画像。
M:2×3 2行3列の変換行列。
dsize: 出力画像のサイズ。
dst: オプション、出力イメージ、サイズは dsize で指定、タイプは src と同じです。
flags: オプション、補間方法
borderMode: オプション、境界ピクセル モード
borderValue: オプション、境界塗りつぶし値、デフォルトは 0

4.1 変換
画像は、演算子 M=[[1,0,X],[0,1,Y]] を手動で指定することでシフトできます。ここで、X は画像の x 方向 (右) に移動するピクセル値を表します。 Y は y 方向 (下方向) に移動する画像のピクセル値を表します。

import matplotlib.pyplot as plt
import numpy as np
import cv2

plt.rc('font',family='Youyuan',size='9')
plt.rc('axes',unicode_minus='False')

img = cv2.imread('..\\messi5.jpg')
rows,cols,_ = img.shape

M = np.float32([[1,0,100],[0,1,50]])   #右移100-下移50
img_ret1 = cv2.warpAffine(img,M,(cols,rows))
M = np.float32([[1,0,-100],[0,1,-50]]) #左移100-上移50
img_ret2 = cv2.warpAffine(img,M,(cols,rows))
M = np.float32([[1,0,-100],[0,1,50]])  #左移100-下移50
img_ret3 = cv2.warpAffine(img,M,(cols,rows))

fig,ax = plt.subplots(2,2)
ax[0,0].set_title('原图   by VX:桔子code')
ax[0,0].imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)) #matplotlib显示图像为rgb格式
ax[0,1].set_title('右移100-下移50')
ax[0,1].imshow(cv2.cvtColor(img_ret1,cv2.COLOR_BGR2RGB))
ax[1,0].set_title('左移100-上移50')
ax[1,0].imshow(cv2.cvtColor(img_ret2,cv2.COLOR_BGR2RGB))
ax[1,1].set_title('左移100-下移50') 
ax[1,1].imshow(cv2.cvtColor(img_ret3,cv2.COLOR_BGR2RGB))
#ax[0,0].axis('off');ax[0,1].axis('off');ax[1,0].axis('off');ax[1,1].axis('off')#关闭坐标轴显示
plt.show() 

4.2 回転
回転には、最初にメソッドによってgetRotationMatrix2D()構築されたwarpAffine()演算子 Mが必要です。getRotationMatrix2D()インターフェイス形式は次のとおりです。

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

center: 回転中心位置
angle: 回転角度
scale: スケーリング率、スケーリングしない場合は 1

import matplotlib.pyplot as plt
import numpy as np
import cv2
plt.rc('font',family='Youyuan',size='9')
plt.rc('axes',unicode_minus='False')

img = cv2.imread('mess.jpg')
rows,cols,_ = img.shape

#以图像中心旋转
M = cv2.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1)#逆时针90度
img_ret1 = cv2.warpAffine(img,M,(cols,rows))
M = cv2.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),-90,1)#顺时针90度
img_ret2 = cv2.warpAffine(img,M,(cols,rows))
M = cv2.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),-180,1)#顺时针180度
img_ret3 = cv2.warpAffine(img,M,(cols,rows))

#显示图像
fig,ax = plt.subplots(2,2)
ax[0,0].set_title('VX:桔子code   原图')
ax[0,0].imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)) #matplotlib显示图像为rgb格式
ax[0,1].set_title('逆时针90度')
ax[0,1].imshow(cv2.cvtColor(img_ret1,cv2.COLOR_BGR2RGB))
ax[1,0].set_title('顺时针90度')
ax[1,0].imshow(cv2.cvtColor(img_ret2,cv2.COLOR_BGR2RGB))
ax[1,1].set_title('顺时针180度') 
ax[1,1].imshow(cv2.cvtColor(img_ret3,cv2.COLOR_BGR2RGB))
ax[0,0].axis('off');ax[0,1].axis('off');ax[1,0].axis('off');ax[1,1].axis('off')#关闭坐标轴显示
plt.show() 

4.3 M オペレータを構築するための修正getAffineTransform()
getAffineTransform()。入力パラメータは変換前後の 2 セットの座標点であり、各座標点セットには 3 つの位置パラメータが含まれます。

5.回転rotate()

cv2.rotate(src, rotateCode[, dst]) -> dstここで、src はソース画像です。rotateCode は 3 つのパラメータを選択できます:
cv2.ROTATE_90_CLOCKWISE 時計回りに 90 度回転します
。 cv2.ROTATE_180 180 度回転します。時計回りと反時計回りの区別はありません。効果は同じです。
cv2.ROTATE_90_COUNTERCLOCKWISE 反時計回りに 90 度回転します。これは時計回りに 270 度に相当します

img_ret1 = cv2.rotate(img,cv2.ROTATE_90_CLOCKWISE)
img_ret2 = cv2.rotate(img,cv2.ROTATE_180)
img_ret3 = cv2.rotate(img,cv2.ROTATE_90_COUNTERCLOCKWISE)

6. 遠近変換 warpPerspective()

透視変換では、カーネルを構築するために 4 つの点を見つける必要があります。cv2.warpPerspective(src,M,dsize[,dst[,flags[,borderMode[,borderValue]]]])->dst
src: 入力画像。
M: 3×3 3行3列の変換行列。
dsize: 出力画像のサイズ。
dst: オプション、出力イメージ、サイズは dsize で指定され、データ型は src と同じです。
flags: オプション、補間メソッド
borderMode: オプション、境界ピクセル モード
borderValue: オプション、境界塗りつぶし値、デフォルトは 0。

pts1 = np.float32([[192,40],[610,122],[216,363],[465,415]])
pts2 = np.float32([[0,0],[300,0],[0,350],[300,350]])
kernel = cv2.getPerspectiveTransform(pts1,pts2) #该函数构建kernel
img_pers = cv2.warpPerspective(img_src,kernel,(300,350))

アフィン変換は、画像の平行移動、回転、補正を実現できます。アフィン変換による回転は、画像の損失と黒エッジを引き起こします。rotate() メソッドは、この問題を解決できます。rotate() は、実際には、transpose と flip3 Rotation を 1 つの角度でカプセル化することによって実装されます。回転()は他の角度での回転をサポートしません。

おすすめ

転載: blog.csdn.net/aqiangdeba/article/details/129764909