图像缩放(Image resize)

在OpenCV中提供函数 cv2.resize()实现对图像的缩放,该函数的具体形式如下:
dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]] )

参数解析:
dst:输出的目标图像,其类型与 src相同,大小为 dsize(当该值非零时),或者可以通过 src.size()fxfy 计算得到。
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“或者”参数 fxfy“二者 之一来指定,具体如下:

①通过参数 dsize 指定
如果指定了参数 dsize 的值,无论是否指定了参数 fxfy 的值,都由参数 dsize 来决定目标图像的大小。
此时需要注意的是 dsize 内第 1 个参数对应缩放后图像的宽度( width,即列数 cols,与参数 fx 相关),第 2 个参数对应缩放后图像的高度( height,即行数 rows,与参数 fy 相关)。指定参数 dsize 的值时, x 方向的缩放大小(参数 fx)为: (double)dsize.width/src.colsy 方向的缩放大小(参数 fy)为: (double)dsize.height/src.rows

②通过参数 fxfy指定
如果参数 dsize 的值是 None,那么目标图像的大小通过参数 fxfy 来决定。此时,目标图像的大小为 dsize=Size(round(fx*src.cols),round(fy*src.rows))
函数 cv2.size()可以实现对原始图像的缩放功能,需要注意的是在开始运算前,操作前的目标图像 dst 的大小、类型与最终得到的目标图像 dst 是没有任何关系的。目标图像 dst 的最终大小和类型是通过 srcdsizefxfy 指定的。如果想让原始图像调整为和目标图像一样大,则必须通过上述属性指定。

程序示例一

使用函数 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)

图像缩放(Image resize)
图1 原始图像

图像缩放(Image resize)
图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)

图像缩放(Image resize)
图3 原始图像
图像缩放(Image resize)
图4 缩放图像

Original: https://blog.csdn.net/weixin_51571728/article/details/124647005
Author: 半濠春水
Title: 图像缩放(Image resize)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/633014/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球