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 Flip()
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()

Affine 변환
dst=cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
src: 입력 이미지.
M: 2×3 2행 3열 변환 행렬.
dsize: 출력 이미지의 크기입니다.
dst: 선택사항, 출력 이미지, dsize로 지정된 크기, 유형은 src와 동일합니다.
플래그: 선택 사항, 보간 방법
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)

중심: 회전 중심 위치
각도: 회전 각도
스케일: 스케일링 비율, 스케일링을 사용하지 않는 경우 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() , 입력 매개변수는 변환 전후의 두 세트의 좌표점이며, 각 좌표점 세트에는 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와 동일합니다.
플래그: 선택 사항, 보간 방법
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))

Affine 변환은 이미지의 이동, 회전 및 수정을 실현할 수 있습니다; affine 변환에 의한 회전은 이미지 손실과 검은 가장자리를 발생시킵니다. Rotate()는 다른 각도에서의 회전을 지원하지 않습니다.

추천

출처blog.csdn.net/aqiangdeba/article/details/129764909