在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 近邻的 Lanczos
插值方法cv2.INTER_LINEAR_EXACT位精确双线性插值cv2.INTER_MAX差值编码掩码cv2.WARP_FILL_OUTLIERS标志,填补目标图像中的所有像素。如果它们中的一些对应源图像中的奇异点(离群值),则将它们设置为零cv2.WARP_INVERSE_MAP标志,逆变换。例如,极坐标变换: 如果 flag 未被设置,则进行转换: dst(∅, 𝜌) = src(𝑥, 𝑦)
;如果 flag
被设置,则进行转换: dst(x, y) = src(∅, ρ)
当缩小图像时,使用 区域插值方式(
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 缩放图像
Original: https://blog.csdn.net/weixin_51571728/article/details/124647005
Author: 半濠春水
Title: 图像缩放(Image resize)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/633014/
转载文章受原作者版权保护。转载请注明原作者出处!