cv2 resize 与reshape的区别

简介: cv2 resize 与reshape的区别

简单来理解的话

size表示尺寸

shape代表形状

那么resize表示重绘大小,reshape表示重绘形状

既然重绘大小,那么size就会变化,其像素数量就会发生变化;

重绘形状,则是像素数量不变,只改变其外形。

那么通过,代码简单看一下吧

img=cv2.imread('lena.png')#256,256,3
###Resize
img_Resize=cv2.resize(img,(500,500))
#resize是作用于单个通道的,因此,缩放时,根据原图像的通道进行操作。
###Reshape
img_Reshape=img.reshape(128,512,3)
#img.reshape((128,512,3))
#img.reshape([128,512,3])
#img.reshape(128,384)
#总之是保证数量与原数量相同,怎么排列不关心。

这里需要注意的是,reshape是直接针对img进行操作,而resize,需要通过cv2的库进行操作,如果直接img.resize的话,则会报错,如果添加了refcheck和order参数,那么也得不到正确的图像结果。(从目前我的了解应该是不可以,有知道的大神可以说一下哦)

如果想直接使用img.resize,其实是可以调用PIL库的,PIL中提供的resize方法可以以不同的插值方法进行处理

Image.resize(size, resample=0)

其中:

resample表示改变图像过程用的插值方法。0:双线性插值。1:最邻近插值。2:双三次插值法。3:面积插值法。


仔细研究过resize方法过后,发现resize可以不同的方式进行缩放,同时,支持不同的插值方法,

除了上述通过(width,height)直接指定缩放大小外,还可以通过fx  fy来设置其缩放倍数,此时size可置为0,如下

# x方向放大2倍;y方向放大2倍
cv2.resize(img,None,fx=2,fy=2)

同时,可以通过Interpolation参数来指定其插值方式,该参数为cv2的枚举值,取值范围为0-7(8中),除常用的最邻近插值(INTER_NEAREST)、双线性插值(INTER_LINEAR)外,还有INTER_CUBIC  (三次样条插值)、INTER_AREA  (区域插值)等。

方法 效果
 INTER_NEAREST(最近邻插值) 由于是以最近的点作为新的插入点,因此边缘不会出现缓慢的渐慢过度区域,这也导致放大的图像容易出现锯齿的现象
 INTER_CUBIC  (三次样条插值) 可以有效避免出现锯齿的现象
INTER_LINEAR(线性插值) 可以有效避免出现锯齿的现象
 INTER_AREA  (区域插值) 共分三种情况,图像放大时类似于双线性插值,图像缩小(x轴、y轴同时缩小)又分两种情况,此情况下可以避免波纹出现。因此对图像进行缩小时,为了避免出现波纹现象,推荐采用区域插值方法。

而且,官方文档给出了如下定义:

To shrink an image, it will generally look best with #INTER_AREA interpolation, whereas to enlarge an image, it will generally look best with #INTER_CUBIC (slow) or #INTER_LINEAR (faster but still looks OK).

   如果要缩小图像,通常推荐使用INTER_AREA插值效果最好,而要放大图像,通常使用INTER_CUBIC(速度较慢,但效果最好),或者使用INTER_LINEAR(速度较快,效果还可以)。


结论:

速度比较:INTER_NEAREST(最近邻插值)>INTER_LINEAR(线性插值)>INTER_CUBIC(三次样条插值)>INTER_AREA  (区域插值)

OpenCV推荐:如果要缩小图像,为了避免出现波纹现象,通常推荐使用#INTER_AREA插值效果最好,而要放大图像,通常使用INTER_CUBIC(速度较慢,但效果最好),或者使用INTER_LINEAR(速度较快,效果还可以)。至于最近邻插值INTER_NEAREST,一般不推荐使用。


最后,贴出方法的官方定义,以及Interpolation的解释。

 

有需要的,源地址自取:

resize方法定义

Interpolation定义

相关文章
|
自然语言处理 区块链 Python
传统的序列模型CRF与HMM区别
传统的序列模型CRF与HMM区别
|
机器学习/深度学习 PyTorch TensorFlow
TensorRT 模型加速——输入、输出、部署流程
本文首先简要介绍 Tensor RT 的输入、输出以及部署流程,了解 Tensor RT 在部署模型中起到的作用。然后介绍 Tensor RT 模型导入流程,针对不同的深度学习框架,使用不同的方法导入模型。
2518 1
|
计算机视觉
OpenCV-计算二维矢量幅值cv::magnitude
OpenCV-计算二维矢量幅值cv::magnitude
453 0
|
2月前
|
数据采集 运维 DataWorks
DataWorks 千万级任务调度与全链路集成开发治理赋能智能驾驶技术突破
智能驾驶数据预处理面临数据孤岛、任务爆炸与开发运维一体化三大挑战。DataWorks提供一站式的解决方案,支持千万级任务调度、多源数据集成及全链路数据开发,助力智能驾驶模型数据处理与模型训练高效落地。
|
3月前
|
存储 Linux 内存技术
linux系统查看硬盘序列号
本文介绍在Linux系统中查看硬盘信息的三种方法:1) 使用`hdparm`工具,通过`sudo hdparm -i /dev/sda`获取硬盘序列号和型号;2) 使用`smartctl`工具,不仅可查序列号和型号,还能了解硬盘健康状态;3) 使用`lshw`命令显示存储设备拓扑信息。此外,提供通用技巧如用`lsblk`确认磁盘标识,及注意事项,例如管理员权限和云主机可能隐藏物理序列号等。
|
10月前
|
前端开发 API UED
React 图片轮播 Carousel:从入门到进阶
本文介绍了在 React 中实现图片轮播(Carousel)的方法,从基础安装和配置 `react-slick` 开始,逐步讲解了常见问题如图片路径、性能优化、自定义样式和交互处理,以及高级话题如动态数据加载和响应式设计。通过详细示例,帮助开发者避免易错点,提升轮播图的用户体验。
244 3
Markdown使用HTML语法实现复杂表格
Markdown使用HTML语法实现复杂表格
437 1
|
安全 Python
在Python中,什么是线程安全的数据结构?
在Python中,什么是线程安全的数据结构?
567 2
|
算法 前端开发 JavaScript
< 每日算法:一文带你认识 “ 双指针算法 ” >
`双指针`并非指的是一种具体的公式或者范式。而是一种运算思路,用于节省逻辑运算时间的`逻辑思路`!双指针算法通常用于`优化时间复杂度`!
167 1
< 每日算法:一文带你认识 “ 双指针算法 ” >
|
机器学习/深度学习 人工智能 异构计算
阿里等发布基于3D的人物图片转视频模型Champ
【4月更文挑战第21天】阿里联合南京大学、复旦大学发布创新模型Champ,实现3D人物图片转视频的突破。Champ运用SMPL模型与潜在扩散框架,提升形状对齐和运动引导能力,生成高质量人物动画,尤其擅长捕捉姿势和形状变化。模型通过细节处理增强面部表情和手指动作等细节,但面部和手部建模仍有提升空间。研究团队已进行效率优化,推动实际应用。[项目地址](https://fudan-generative-vision.github.io/champ/#/) | [论文地址](https://arxiv.org/abs/2403.14781)
281 1