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

相关推荐
LgZhu(Yanker)2 小时前
27、企业维修保养(M&R)全流程管理:从预防性维护到智能运维的进阶之路
大数据·运维·人工智能·erp·设备·维修·保养
ModelWhale3 小时前
“大模型”技术专栏 | 和鲸 AI Infra 架构总监朱天琦:大模型微调与蒸馏技术的全景分析与实践指南(上)
人工智能·大模型·大语言模型
麦兜*4 小时前
Spring Boot集成方案 + Elasticsearch向量检索,语义搜索核弹
java·spring boot·python·spring·elasticsearch·spring cloud·系统架构
仪器科学与传感技术博士4 小时前
python:讲懂决策树,为理解随机森林算法做准备,以示例带学习,通俗易懂,容易理解和掌握
python·算法·决策树
歪歪1004 小时前
HTML 如何转 Markdown
开发语言·chrome·python·程序人生·html
lxmyzzs4 小时前
【图像算法 - 08】基于 YOLO11 的抽烟检测系统(包含环境搭建 + 数据集处理 + 模型训练 + 效果对比 + 调参技巧)
人工智能·yolo·目标检测·计算机视觉
霖005 小时前
ZYNQ实现FFT信号处理项目
人工智能·经验分享·神经网络·机器学习·fpga开发·信号处理
王者鳜錸5 小时前
PYTHON从入门到实践-18Django模版渲染
开发语言·python·django
GIS数据转换器5 小时前
AI 技术在智慧城市建设中的融合应用
大数据·人工智能·机器学习·计算机视觉·系统架构·智慧城市
竹子_235 小时前
《零基础入门AI:传统机器学习进阶(从拟合概念到K-Means算法)》
人工智能·算法·机器学习