python学opencv|读取图像(三)放大和缩小图像

【1】引言

前序已经学习了常规的图像读取操作和图像保存技巧,相关文章链接为:

python学opencv|读取图像-CSDN博客

python学opencv|读取图像(二)保存彩色图像-CSDN博客

今天我们更近一步,学习放大和缩小图像的技巧,力求掌握cv.resize()函数的用法。

【2】opencv官方教程

点击系下述链接,可以直达官网教程:

OpenCV: Geometric Image Transformations

在官网有很多函数,今天主要学习下述内容:

++图1++

其实这里讲的比较简单,综合起来就是:

resize(src, dst, dst.size(), fx, fy, interpolation)

src,输入图像,必须有,这是修改大小的初始条件;

dst,输出图像,如果不为0,大小和dsize一致,否则就,通过输入计算fx和fy;输出图像和输入图像的类型一致;

dsize,输出图像的大小,如果=0或者none,就用fx和fy来修改图像;

fx,水平方向放大因子;

fy,竖直方向放大因子;

interpolation,插值方法。

【3】代码测试

在上述基础上,输入以下代码做测试:

python 复制代码
import cv2 #引入CV模块

# 读取图片
image = cv2.imread('opencv-picture-001.png')

# 定义放大因子
scale_factor = 2

# 放大图片,使用立方插值
scaled_image = cv2.resize(image, None, fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_CUBIC) #INTER_CUBIC插值

# 保存结果
cv2.imwrite('scaled_image-22-INTER_CUBIC.png', scaled_image)

# 显示结果
cv2.imshow('Scaled Image', scaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里,使用的原图像为opencv-picture-001.png:

++图2++

用了两倍的放大因子:scale_factor=2

使用的插值方法为:cv2.INTER_CUBIC

运行后的输出图像为:

++图3++

上传网站后好像图2和图3没有区别,我们看一下它们的大小:

++图4++

可见图3相对于图2确实是分别率扩大了两倍。

【4】插值方法测试

在上述测试案例上,我们获得的放大图像在上传CSDN网站后依然清晰。

实际上改变图像大小有多种插值方法,相关链接为:

OpenCV: Geometric Image Transformations

我们主要研究一下前面三种:

++图5++

更新插值和保存图像代码为:

复制代码
# 放大图片,使用不同插值方法
scaled_image = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) #INTER_CUBIC插值
scaled_image1= cv2.resize(image, None, fx=0.2, fy=2.2, interpolation=cv2.INTER_NEAREST)
scaled_image2= cv2.resize(image, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR )
# 保存结果
cv2.imwrite('scaled_image-22-INTER_CUBIC.png', scaled_image)
cv2.imwrite('scaled_image-22-INTER_NEAREST.png', scaled_image1)
cv2.imwrite('scaled_image-22-INTER_LINEAR.png', scaled_image2)

获得的cv2.INTER_NEAREST和cv2.INTER_LINEAR插值图像为:

++图6++cv2.INTER_NEAREST

图6是使用NEAREST插值方法,横向缩小为原来的0.2倍,竖向扩大为原来的2.2倍后的效果。

++图7++ cv2.INTER_LINEAR

图7是使用 LINEAR插值方法,横向和竖向均缩小为原来的0.5倍后的图像。

之后我们继续修改,使图像的放大因子保持一致:

复制代码
scaled_image = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) #INTER_CUBIC插值
scaled_image1= cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_NEAREST)
scaled_image2= cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR )
# 保存结果
cv2.imwrite('scaled_image-220-INTER_CUBIC.png', scaled_image)
cv2.imwrite('scaled_image-220-INTER_NEAREST.png', scaled_image1)
cv2.imwrite('scaled_image-220-INTER_LINEAR.png', scaled_image2)

此时获得的图像为:

图8 从上到下CUBIC-NEAREST-LINEAR

相对来说,CUBIC插值法获得的图像清晰度最好。

此时的完整代码为:

python 复制代码
import cv2 #引入CV模块

# 读取图片
image = cv2.imread('opencv-picture-001.png')

# 定义放大因子
scale_factor = 2

# 放大图片,使用不同插值方法
scaled_image = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) #INTER_CUBIC插值
scaled_image1= cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_NEAREST)
scaled_image2= cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR )
# 保存结果
cv2.imwrite('scaled_image-220-INTER_CUBIC.png', scaled_image)
cv2.imwrite('scaled_image-220-INTER_NEAREST.png', scaled_image1)
cv2.imwrite('scaled_image-220-INTER_LINEAR.png', scaled_image2)
# 或者显示结果
cv2.imshow('Scaled Image', scaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

【5】总结

探索了使用python+opencv放大和缩小图像的方法。

经过对比不同的插值方法,发现CUBIC插值法获得的图像清晰度最好。

相关推荐
czzxxxxxx几秒前
创客匠人AI智能体:知识付费从“重人力”走向“自动化”的拐点
大数据·人工智能
依然范特东5 分钟前
强化学习笔记2--bellman equation
人工智能·笔记
IPdodo_9 分钟前
Codex 总是 Reconnecting?从 401 到响应流中断的排查方法
python·requests
张申傲9 分钟前
拆解 harness9(9):Observability 可观测性
人工智能·aigc·agent·deepseek·harness
ZKNOW甄知科技13 分钟前
燕千云深度集成飞书:以AI之力,开启无感IT运维体验
大数据·运维·网络·数据库·人工智能·低代码·集成学习
京和动物医院·总院17 分钟前
2026年未央区宠物医院:如何挑选最适合您爱宠的健康守护者
大数据·人工智能·python
液态不合群18 分钟前
AI×低代码工作流:破解制造业数字化流程异构困局
人工智能·低代码
武子康19 分钟前
Copilot Code Review 从固定 Reviewer 演进为可编程 Runtime,仓库控制面、Setup 供应链、Runner 资源和 MCP 工具同时被纳入审查决策
人工智能·github·aigc
吠品19 分钟前
五子棋AI对战功能实现与多难度策略设计
人工智能
刘小八20 分钟前
RAG 文档切分不是越细越好:选择 Chunk Size 与 Overlap
人工智能·python·语言模型