在OpenCV中提供函数
cv2.resize()
实现对图像的缩放,该函数的具体形式如下:dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]] )
参数解析:dst
:输出的目标图像,其类型与src
相同,大小为dsize
(当该值非零时),或者可以通过src.size()
、fx
、fy
计算得到。src
:需要进行缩放的原始图像。dsize
:输出图像的大小。x
: 水平方向的缩放比例。y
: 垂直方向的缩放比例。interpolation
:插值方式,具体形式如下表。
插值是指图像在进行几何处理时,给无法直接通过映射得到的值的像素点赋值。
比如:将原始图像放大为原来的2倍,必然会多出一些无法被直接映射值得像素点,对于这些像素点,插值方式决定了如何确定它们的值。
还有反向映射
可能会把目标图像中的像素点值映射到原始图像中的非整数值对应的位置
上,当然原始图像内是不可能存在这样的非整数位置的,即目标图像上的该像素点不能对应到原始图像的某个具体位置上,此时也要对这些像素点进行插值处理,以完成映射。
类型 | 说明 |
cv2.INTER_NEAREST | 最临近插值 |
cv2.INTER_LINEAR | 双线性插值(默认方式) |
cv2.INTER_CUBIC | 三次样条插值。首先对源图像附近的 4×4 近邻区域进行三次样条拟合,然后将目标像素对应的三次样条值作为目标图像对应像素点的值 |
cv2.INTER_AREA | 区域插值,根据当前像素点周边区域的像素实现当前像素点的采样。该方法类似最临近插值方式 |
cv2.INTER_LANCZOS4 | 一种使用 8×8 近邻的 |
cv2.INTER_LINEAR_EXACT | 位精确双线性插值 |
cv2.INTER_MAX | 差值编码掩码 |
cv2.WARP_FILL_OUTLIERS | 标志,填补目标图像中的所有像素。如果它们中的一些对应源图像中的奇异点(离群值),则将它们设置为零 |
cv2.WARP_INVERSE_MAP | 标志,逆变换。例如,极坐标变换: 如果 flag 未被设置,则进行转换: |
当缩小图像时,使用区域插值方式(
INTER_AREA
)能够得到最好的效果;
当放大图像时,使用三次样条插值(INTER_CUBIC
)方式和双线性插值(INTER_LINEAR
)方式都能够取得较好的效果。三次样条插值方式速度较慢,双线性插值方式速度相对较快且效果并不逊色。
在cv2.resize()
函数中,目标图像的大小可以通过“参数dsize
”或者“参数fx
和fy
”二者 之一来指定,具体如下:
①通过参数dsize
指定
如果指定了参数dsize
的值,无论是否指定了参数fx
和fy
的值,都由参数dsize
来决定目标图像的大小。
此时需要注意的是dsize
内第 1 个参数对应缩放后图像的宽度(width
,即列数cols
,与参数fx
相关),第 2 个参数对应缩放后图像的高度(height
,即行数rows
,与参数fy
相关)。指定参数dsize
的值时,x
方向的缩放大小(参数fx
)为:(double)dsize.width/src.cols
;y
方向的缩放大小(参数fy
)为:(double)dsize.height/src.rows
。
②通过参数fx
和fy
指定
如果参数dsize
的值是None
,那么目标图像的大小通过参数fx
和fy
来决定。此时,目标图像的大小为dsize=Size(round(fx*src.cols),round(fy*src.rows))
函数cv2.size()
可以实现对原始图像的缩放功能,需要注意的是在开始运算前,操作前的目标图像dst
的大小、类型与最终得到的目标图像dst
是没有任何关系的。目标图像 dst 的最终大小和类型是通过src
、dsize
、fx
、fy
指定的。如果想让原始图像调整为和目标图像一样大,则必须通过上述属性指定。程序示例一
使用函数
cv2.resize()
对图像进行一个简单的缩放。
import cv2
lena=cv2.imread("./lena.jpg")
height, width = lena.shape[:2] # 获取图像的高度和宽度
size=(int(width*0.8),int(height*0.5)) #更改尺寸
rst=cv2.resize(lena,size)
print("lena.shape=",lena.shape)
print("rst.shape=",rst.shape)
cv2.imshow("原始图像", lena)
cv2.imshow("缩放图像", rst)
cv2.waitKey()
cv2.destroyAllWindows()
程序运行结果如下,可以看出列数变为原来的0.8倍,为512 × 0.8=409.6;行数变为原来的0.5倍,为512 × 0.5=256。
lena.shape= (512, 512, 3)
rst.shape= (256, 409, 3)
图1 原始图像
图2 缩放图像
程序示例二
控制函数
cv2.resize()
的fx
参数、fy
参数对图像进行一个简单的缩放。
import cv2
lena=cv2.imread("./lena.jpg")
rst=cv2.resize(lena,None,fx=2,fy=0.5)
print("lena.shape=",lena.shape)
print("rst.shape=",rst.shape)
cv2.imshow("原始图像", lena)
cv2.imshow("缩放图像", rst)
cv2.waitKey()
cv2.destroyAllWindows()
从程序运行结果可以看出,fx进行的是水平方向上的缩放,将列数变为原来的2倍,得到512×2=1024;fy进行的是垂直方向上的缩放,将列数变为原来的0.5倍,得到512×0.5=256。
lena.shape= (512, 512, 3)
rst.shape= (256, 1024, 3)
图3 原始图像
图4 缩放图像