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

在这里插入图片描述
图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  缩放图像

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像缩放可以使用OpenCV中的cv2.resize()函数来实现。该函数的参数包括原始图像(src)、目标图像大小(dsize)、水平方向缩放比例(fx)和垂直方向缩放比例(fy)。可以根据需要选择插值方式(interpolation)来进行图像缩放。\[1\] 下面是一个使用cv2.resize()函数对图像进行缩放的示例代码: ```python 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() ``` 这段代码将读取名为"lena.jpg"的图像,然后将其缩放为原始图像宽度的80%和高度的50%。最后,将原始图像和缩放后的图像显示出来。\[2\] 除了使用OpenCV的cv2.resize()函数外,还可以使用其他方法进行图像缩放。例如,可以通过遍历新创建的像素空间,根据原图像的坐标计算出对应的像素值,并将其赋值给新图像。这是一种基础且简单的方法。\[3\] #### 引用[.reference_title] - *1* *2* [图像缩放Image resize)](https://blog.csdn.net/weixin_51571728/article/details/124647005)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [图像尺寸调整 image resize C/C++](https://blog.csdn.net/weixin_50591344/article/details/126593159)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值