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

相关推荐
AI新兵35 分钟前
AI大事记10:从对抗到创造——生成对抗网络 (GANs)
人工智能·神经网络·生成对抗网络
却道天凉_好个秋40 分钟前
深度学习(十五):Dropout
人工智能·深度学习·dropout
你好~每一天1 小时前
2025 中小企业 AI 转型:核心岗技能 “怎么证、怎么用”?
人工智能·百度·数据挖掘·数据分析·职业·转行
浔川python社1 小时前
《网络爬虫技术规范与应用指南系列》(xc—5)完
爬虫·python
MongoVIP2 小时前
Scrapy爬虫实战:正则高效解析豆瓣电影
python·scrapy
李小白662 小时前
Python文件操作
开发语言·python
飞哥数智坊2 小时前
3B参数差点干翻32B模型,Qwen3 Next 是如何做到的?
人工智能
人工智能技术派2 小时前
Whisper推理源码解读
人工智能·语言模型·whisper·语音识别
weixin_525936333 小时前
金融大数据处理与分析
hadoop·python·hdfs·金融·数据分析·spark·matplotlib
编码追梦人3 小时前
AI 重塑行业格局:从金融风控到智能制造的深度实践
人工智能·制造