OpenCV-Python实战(8)——图像变换

一、缩放 cv2.resize()

python 复制代码
img = cv2.resize(src=*,dsize=*,fx=*,fy=*,interpolation=*)

**img:**目标图像。

**src:**原始图像。

dsize:(width,height)图像大小。

**fx、fy:**可选参数,水平/垂直方向缩放比例。

**interpolation:**可选参数,进行缩放操作使用哪种方法对图像进行删减或增补,常用方法如下:

|----------------|---|------------|
| 方法 | 值 | 解释 |
| INTER_NEAREST | 0 | 最近插值法 |
| INTER_LINEAR | 1 | 双线性插值法 |
| INTER_CUBIC | 2 | 双三次插值法 |
| INTER_AREA | 3 | |
| INTER_LENCZOS4 | 4 | Lencz的插值方法 |

python 复制代码
import cv2

lena = cv2.imread('Lena.png')

img1 = cv2.resize(src=lena,dsize=(int(lena.shape[0]/2),int(lena.shape[1]/2)))
img2 = cv2.resize(src=lena,dsize=None,fx=.5,fy=0.5)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)

cv2.waitKey(0)
cv2.destroyAllWindows()

二、翻转 cv2.flip()

python 复制代码
img = cv2.flip(src=*,flipCode=*)

**img:**目标图像。

**src:**原始图像。

**flipCode:**翻转方式:

|----------|-----------|
| flipCode | 解释 |
| 0 | 垂直翻转 |
| 1 | 水平翻转 |
| -1 | 垂直与水平同时翻转 |

python 复制代码
import cv2

lena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]

img1 = cv2.flip(src=lena,flipCode=0)
img2 = cv2.flip(src=lena,flipCode=1)
img3 = cv2.flip(src=lena,flipCode=-1)

cv2.imshow('lena',lena)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)

cv2.waitKey(0)
cv2.destroyAllWindows()

三、仿射

python 复制代码
img = cv2.warpAffine(src=*,M=*,dsize=*,flags=*,borderMode=*,borderValue=*)

**img:**目标图像。

**src:**原始图像。

M:3*2变换矩阵,不同变换矩阵的仿射效果不同。

dsize:(width,height)新图像大小。

**flags:**进行仿射操作的插值方法。

**borderMode:**边界像素,默认为:BORDER_CONSTANT。

**borderValue:**边界填充值,默认为0。

3.1 平移

表示图像向X轴方向平移 ,向Y轴方向平移

python 复制代码
import numpy as np

lena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]

x = 25
y = 25
M = np.float32([[1,0,x],[0,1,y]])
img = cv2.warpAffine(src=lena,M=M,dsize=lena.shape[:2])

cv2.imshow('lena',lena)
cv2.imshow('img',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

3.2 旋转 cv2.getRotationMatix2D()

python 复制代码
M = cv2.getRotationMatrix2D(center=*,angle=*,scale=*)

**center:**旋转的中心点坐标(width,height)。

**angle:**旋转角度,正值(逆时针);负值(顺时针)。

**scale:**缩放比。

python 复制代码
import cv2
import numpy as np

lena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]

w,h = lena.shape[:2]
M = cv2.getRotationMatrix2D(center=(w/2,h/2),angle=30,scale=1)
img = cv2.warpAffine(src=lena,M=M,dsize=lena.shape[:2])

cv2.imshow('lena',lena)
cv2.imshow('img',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

3.3 倾斜 cv2.getAffineTransform()

python 复制代码
M = cv2.getAffineTransform(src=*,dst=*)

**src:**原始图像的三个定位点坐标。(可以是图像的任意三个角坐标)

**dst:**倾斜图像对应的三个定位点坐标。

python 复制代码
import cv2
import numpy as np

lena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]

w,h = lena.shape[:2]
src = np.float32([[0,0],[w-1,0],[w-1,h-1]])
dst = np.float32([[30,0],[w+29,0],[w-1,h-1]])
M = cv2.getAffineTransform(src=src,dst=dst)
dsize = (w+50,h)
img = cv2.warpAffine(src=lena,M=M,dsize=dsize)

cv2.imshow('lena',lena)
cv2.imshow('img',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

3.4 透视

透视相比于倾斜,定义了四个基准点,可以进行非平行变换。

python 复制代码
M = cv2.getPerspectiveTransform(src=*,dst=*)
img = cv2.warpPerspective(src=*,M=*,dsize=*,flags=*,borderMode=*,borderValue=*)

**src:**原始图像的四个定位点坐标。(可以是图像的任意四个角坐标)

**dst:**倾斜图像对应的四个定位点坐标。

cv2.warpPerspective: 的参数基本与 cv2.warpAffine 相同,只不过这里的 M:4*2 变换矩阵

python 复制代码
import cv2
import numpy as np

lena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]

w,h = lena.shape[:2]
src = np.float32([[0,0],[w-1,0],[w-1,h-1],[0,h-1]])
dst = np.float32([[10,0],[w-11,0],[w-20,h-1],[20,h-1]])
M = cv2.getPerspectiveTransform(src=src,dst=dst)
img = cv2.warpPerspective(src=lena,M=M,dsize=lena.shape[:2])

cv2.imshow('lena',lena)
cv2.imshow('img',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

四、重映射 cv2.remap()

按照自定义方法执行映射,可以实现图像的翻转、扭曲、变形、或特定区域图片内容的改变。

python 复制代码
img = cv2.remap(src=*,map1=*,map2=*,interpolation=*,borderMode=*,borderValue=*)

**img:**目标图像。

**src:**原始图像。

**map1、map2:**用于存放 src 原始图像的 X 坐标、Y 坐标。

**interpolation:**标注插值方式,默认为:INRTER_LINEAR。

**borderMode:**边界像素,默认为:BORDER_CONSTANT。

**borderValue:**边界填充值,默认为0。

python 复制代码
import cv2
import numpy as np

lena = cv2.imread('Lena.png')[::2,::2,:]

w,h = lena.shape[:2]
mapx = np.zeros(lena.shape[:2],np.float32)
mapy = np.zeros(lena.shape[:2],np.float32)

# 复制
for r in range(h):
    for c in range(w):
        mapx[r,c] = c
        mapy[r,c] = r
img1 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)

# 垂直翻转
for r in range(h):
    for c in range(w):
        mapx[r,c] = c
        mapy[r,c] = h-1-r
img2 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)

# 水平翻转
for r in range(h):
    for c in range(w):
        mapx[r,c] = w-1-c
        mapy[r,c] = r
img3 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)

# 垂直和水平翻转
for r in range(h):
    for c in range(w):
        mapx[r,c] = w-1-c
        mapy[r,c] = h-1-r
img4 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)

cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.imshow('img4',img4)
cv2.waitKey(0)
cv2.destroyAllWindows()
python 复制代码
import cv2
import numpy as np

lena = cv2.imread('Lena.png')[::2,::2,:]

w,h = lena.shape[:2]
mapx = np.zeros(lena.shape[:2],np.float32)
mapy = np.zeros(lena.shape[:2],np.float32)

# 缩小
for r in range(h):
    for c in range(w):
        mapx[r,c] = 2*c
        mapy[r,c] = 2*r
img1 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)[:int(w/2),:int(h/2),:]

cv2.imshow('lena',lena)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

理解(mapx,mapy)这两个二维矩阵重叠所构成的坐标 (width,height),对掌握 cv2.remap() 函数非常重要。

相关推荐
大模型真好玩13 分钟前
LangGraph智能体开发设计模式(三)——LangGraph多智能体设计模式:主管架构与分层架构
人工智能·langchain·agent
皇族崛起33 分钟前
【视觉多模态】- 3D建模尝试 I (广场3D建模,失败)
数据库·人工智能·3d·性能优化
Loo国昌40 分钟前
RAG 第一阶段:前沿技术剖析与环境搭建
人工智能·后端·语言模型·架构
ZKNOW甄知科技1 小时前
2025 甄知科技年度报告
运维·人工智能·低代码·ci/cd·自动化·数据库架构·敏捷流程
Keep_Trying_Go1 小时前
基于无监督backbone无需训练的类别无关目标统计CountingDINO算法详解
人工智能·python·算法·多模态·目标统计
爱思德学术1 小时前
中国计算机学会(CCF)推荐学术会议-C(软件工程/系统软件/程序设计语言):IEEE COMPSAC 2026
人工智能·区块链·软件工程
拖拖7651 小时前
打破固定输出的边界:深入解读 Pointer Networks (Ptr-Nets)
人工智能
weixin_433179331 小时前
python - for循环,字符串,元组基础
开发语言·python
^哪来的&永远~1 小时前
Python 轻量级 UI:EEG 与 fNIRS 预处理图形界面
python·可视化·功能连接·eeg·mne·fnirs·eeglab
AI大佬的小弟2 小时前
Python基础(11):Python中函数参数的进阶模式详解
python·lambda函数·函数的参数解释·函数的参数进阶·位置参数·关键词参数·匿名函数与普通函数