本示例使用的OpenCV版本是:4.1.1
运行Python的编辑器:Jupyter notebook
示例目的
使用OpneCV的cv2.resize()
函数对图片进行放大与缩小。
实现代码
1,加载图片
从文件中加载图像,并输出该图片的大小(高度和宽度)
import cv2 # 加载OpenCV
import matplotlib.pyplot as plt # 加载Matplotlib.pyplot存进plt
img = cv2.imread("cook.jpeg") # 读取/加载 图片
print('original image shape:', img.shape) #输出图片的高度,宽度,色彩通道数量
执行上面的代码,会看到大概如下输出,数字分别代表着高度,宽度,色彩通道数量
original image shape: (147, 342, 3)
在本教程,我们只关心高度和宽度。
2,把图像缩小1倍
使用 cv.resize()
我们可以指定宽度和高度进行缩放,例如,我把宽度和高度都除以2,则可以把图片缩小1倍。
# 获取图片高度,宽度,色彩通道数量
height, width, channel = img.shape
# 使用cv.resize对图像进行缩放
resized_img = cv2.resize(img, (width//2, height//2))
# 输出缩小后的图像高度,宽度,色彩通道数量
print('resized to image shape:', resized_img.shape)
这时可以看到,高度是73,宽度是171,正好是原图的缩小2倍,小数部分向下取整。
resized to image shape: (73, 171, 3)
3,把图像放大一倍
使用同样的方法,我也可以把图像放大2倍。例如,我把宽度和高度都乘以2。
# 使用cv.resize对图像进行缩放
resized_img = cv2.resize(img, (width*2, height*2))
# 输出缩放后的图像高度,宽度,色彩通道数量
print('resized to image shape:', resized_img.shape)
这时可以看到,高度是294,宽度是684,正好是原图的放大2倍。
resized to image shape: (294, 684, 3)
4,通过因数进行原图比例的缩放
通过原图的比例因数进行缩放
# 定义缩放因素,w_mult宽度因数,h_mult高度因数
w_mult, h_mult = 0.25, 0.5
# 使用因数进行缩放的示例
resized_img = cv2.resize(img, (0, 0), resized_img, h_mult, w_mult)
# 输出缩放后的图像高度,宽度,色彩通道数量
print('resized to image shape:', resized_img.shape)
```python
可以看到如下输出:
> resized to image shape: (74, 86, 3)
### 5,指定使用最临近插值方式进行缩放
我们使用cv2.INTER_NEAREST定义了缩放的方式为最临近插值方式。
> 最临近插值,通常被用于图像缩放中,进行缩放图像的方法叫做最临近插值算法,这是一种最基本、最简单的图像缩放算法。效果并不好,放大后的图像有很严重的马赛克,缩小后的图像有很严重的失真;效果不好的根源就是其简单的最临近插值方法引入了严重的图像失真。
```python
w_mult, h_mult = 0.25, 0.5
resized_img = cv2.resize(img, (0, 0), resized_img, w_mult, h_mult, cv2.INTER_NEAREST)
print('half sized image shape:', resized_img.shape)
可以看到如下输出:
resized to image shape: (74, 86, 3)
程序说明
OpenCV还提供了多样的缩放方法
本示例主要使用了cv.cvtColor()
函数进行色彩空间的转换,该函数有两个参数,两个可选参数。而在显示图片方面如果使用cv.imshow()
窗口显示的方式,图片的颜色会正常些,使用plt.imshow()
在Jupyter notebook显示的颜色则可能需要一些转换或设置才能达到想要的颜色。
cv.resize()语法
dst = cv.resize( src, dsize[, dst[, fx[, fy[, interpolation]]]] )
- 第一个参数
src
,输入的图像, - 第二个参数
dsize
,输出图像的尺寸; 如果等于零,则计算如下:
𝚍𝚜𝚒𝚣𝚎 = 𝚂𝚒𝚣𝚎(𝚛𝚘𝚞𝚗𝚍(𝚏𝚡𝚜𝚛𝚌.𝚌𝚘𝚕𝚜) 𝚛𝚘𝚞𝚗𝚍(𝚏𝚢𝚜𝚛𝚌.𝚛𝚘𝚠𝚜)) - (可选)第三个参数
dst
,输出的图像 - (可选)第四个参数
fx
,水平轴的比例因子,如果为0时,计算为(𝚍𝚘𝚞𝚋𝚕𝚎)𝚍𝚜𝚒𝚣𝚎.𝚠𝚒𝚍𝚝𝚑/𝚜𝚛𝚌.𝚌𝚘𝚕𝚜 - (可选)第四个参数
fy
,垂直轴的比例因子,如果为0时,计算为(𝚍𝚘𝚞𝚋𝚕𝚎)𝚍𝚜𝚒𝚣𝚎.𝚑𝚎𝚒𝚐𝚑𝚝/𝚜𝚛𝚌.𝚛𝚘𝚠𝚜 - (可选)第四个参数
interpolation
,可以指定插值方法,详细查看 https://docs.opencv.org/4.1.1/da/d54/group__imgproc__transform.html#ga5bb5a1fea74ea38e1a5445ca803ff121
cv.resize()
详细用法请参考:https://docs.opencv.org/4.1.1/da/d54/group__imgproc__transform.html#ga47a974309e9102f5f08231edc7e7529d