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() 函数非常重要。

相关推荐
猫头虎44 分钟前
OpenClaw下载安装配置|Windows安装流程|macOS 安装流程|Telegram 集成使用|飞书集成使用|常见坑和注意事项保姆级教程
人工智能·windows·macos·开源·aigc·飞书·ai编程
TEC_INO44 分钟前
Linux38:AT函数
人工智能·opencv·计算机视觉
做cv的小昊1 小时前
大语言模型系统:【CMU 11-868】课程学习笔记02——GPU编程基础1(GPU Programming Basics 1)
人工智能·笔记·学习·语言模型·llm·transformer·agent
一方热衷.5 小时前
YOLO26-Seg ONNXruntime C++/python推理
开发语言·c++·python
YMWM_6 小时前
如何将包路径添加到conda环境lerobot的python路径中呢?
人工智能·python·conda
星辰_mya6 小时前
关于ai——纯笔记
人工智能
智算菩萨6 小时前
GPT-5.4原生操控电脑揭秘:从Playwright脚本到屏幕截图识别,手把手搭建你的第一个自动化智能体
人工智能·gpt·ai·chatgpt·自动化
田里的水稻6 小时前
ubuntu22.04_openclaw_ROS2
人工智能·python·机器人
一碗白开水一6 小时前
【工具相关】OpenClaw 配置使用飞书:打造智能飞书助手全流程指南(亲测有效,放心享用)
人工智能·深度学习·算法·飞书
小程故事多_807 小时前
Vibe Coding的致命隐患,你必须知道的技术债务和扩展性危机
大数据·人工智能·aigc