CV13 图像分辨率操作(图像金字塔与resize()函数)

简介: 其中,高斯核卷积运算就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值(券种不同)经过加权平均后得到。常见的 33与 55 高斯核(CV9 2D卷积与图像滤波)

1.图像金字塔的作用


通常,我们过去使用的是恒定大小的图像。但是在某些情况下,我们需要使用不同分辨率的(相同)图像。


例如,当在图像中搜索某些东西(例如人脸)时,我们不确定对象将以多大的尺寸显 示在图像中。在这种情况下,我们将需要创建一组具有不同分辨率的相同图像,并在所有图像中搜索对象。


这些具有不同分辨率的图像集称为“图像金字塔”(因为当它们堆叠在底部时,最高分辨 率的图像位于顶部,最低分辨率的图像位于顶部时,看起来像金字塔)。


2.高斯金字塔


2.1理论研究——分辨率缩小


高斯金字塔,首先将图像进行高斯核卷积,并删除原图中的所有偶数行和偶数列,最终缩小图像


其中,高斯核卷积运算就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值(券种不同)经过加权平均后得到。常见的 33与 55 高斯核(CV9 2D卷积与图像滤波)


高斯核卷积让临近中心的像素点具有更高的重要度,对周围像素计算加权平均值,如下图所示,其中心位置权重最高为 0.4。


f703f2a2a3b6910be2af7c545760b88e.png


进行向下采样之后,所得到的图像 Gi+1 具有 M/2 * N/2 个像素,只有原图的四分之一。通过对输入的原始图像不停迭代以上步骤就会得到整个金字塔。注意,由于每次向下取样会删除偶数行和列,所以它会不停地丢失图像的信息


9cfe1c160c6e5d58665a54376722c556.png


  • 将level0级别的图像转换为 level1,level2,level3,level4,图像分辨率不断降低的过程称为向下取样
  • 将level4级别的图像转换为 level3,level2,level1,leve0,图像分辨率不断增大的过程称为向上取样


2.2程序分析


import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('img.png')
#经过几次高斯金字塔后
dowm = cv2.pyrDown(img)
dowm1=cv2.pyrDown(dowm)
dowm2=cv2.pyrDown(dowm1)
cv2.imshow('dowm',dowm2)
cv2.waitKey(0)
cv2.destroyAllWindows()


上采样:就是图片放大,使用pryUp函数。上采样的步骤:先将图像在每个方向放大为原来的两倍,新增的行和列用0填充,再使用先前同样的内核与放大后的图像卷积,获得新增像素的近似值。


下采样:就是图片缩小,使用pyrDown函数。下采样步骤:先将图片进行高斯内核卷积,再将所有偶数列去除。


注意:上采样和下采样是不可逆的!


2.3效果图


0aeb9f9a256a6eec6b55491d1504afb6.png


我们把3次经高斯金字塔降分辨率的图打开看看


162f4ce87510a287ba4d5a6812d5d9a4.png


可见,随着pyrdowm不断降分辨率,图片变得十分模糊了


参考资料:OpenCV计算机视觉学习(7)——图像金字塔(高斯金字塔,拉普拉斯金字塔,图像缩放resize函数


2.4拉普拉斯金字塔


拉普拉斯金字塔由高斯金字塔形成。没有专用功能。拉普拉斯金字塔图像仅像边缘图像。它的大多数元素为零。它们用于图像压缩。拉普拉斯金字塔的层由高斯金字塔的层与高斯金字塔的高层的扩展版本之间的差形成


import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('p2 (4).png')
dowm = cv2.pyrDown(img)
dowm_up = cv2.pyrUp(dowm)
l_1 = img-dowm_up
cv2.imshow('l_1',l_1)
cv2.waitKey(0)
cv2.destroyAllWindows()

dfd26a1d80184cd8ac8e4079390afc96.png


3.图像缩放—resize()函数


3.1resize()函数介绍


cv2.resize()函数是opencv中专门来调整图片的大小,改变图片尺寸,相比于金字塔,其效果更好


import cv2
import numpy as np
img = cv2.imread('MyPic.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img2 = cv2.resize(gray,(120,120),interpolation=cv2.INTER_LANCZOS4)
print(img.shape,gray.shape,img2.shape)
cv2.imshow('result',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()


输出结果:(290, 290, 3) (290, 290) (120, 120)


cv2.resize()函数


功能:对图像大小(分辨率)的操作


输入参数:

1.图像名(gray)

2.预缩放的分辨率(120,120),输出的尺寸格式为(宽,高)

3.interpolation:这个是指定插值的方式,图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式


3.2interpolation


interpolation有以下几种:


  • INTER_NEAREST - 最邻近插值
  • INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法
  • INTER_AREA - 区域插值(使用像素区域关系进行重采样)
  • INTER_CUBIC - 三次样条插值 (超过4x4像素邻域内的双立方插值)
  • INTER_LANCZOS4 - Lanczos插值(超过8x8像素邻域内的Lanczos插值)


对于插值方法,正常情况下使用默认的双线性插值法就够了。不过这里还是有建议的:若要缩小图像,一般情形下最好用 CV_INTER_AREA 来插值,而若要放大图像,一般情况下最好用 CV_INTER_CUBIC (效率不高,慢,不推荐使用)或 CV_INTER_LINEAR (效率较高,速度较快,推荐使用)


几种常用方法的效率为:


最邻近插值>双线性插值>双立方插值>Lanczos插值


但是效率和效果是反比的,所以根据自己的情况酌情使用


4940841bcd8b93696d6c25f47cd1ec08.png

相关文章
|
Ubuntu 开发工具
Ubuntu更换阿里云软件源
Ubuntu更换阿里云软件源
142887 0
|
4月前
|
机器学习/深度学习 前端开发 数据可视化
Kimi K2 开源发布:擅长代码与 Agentic 任务!
今天,月之暗面正式发布 Kimi K2 模型,并同步开源。Kimi K2 是一款具备更强代码能力、更擅长通用 Agent 任务的 MoE 架构基础模型,总参数 1T,激活参数 32B。
999 0
|
计算机视觉 开发者 Python
OpenCV合并图像中加权和与覆盖的讲解与实战(附Python源码)
OpenCV合并图像中加权和与覆盖的讲解与实战(附Python源码)
568 0
|
Windows
zlib、libzip、 libzippp 库编译(windows + cmake + vs2013)
"libzipp" 这库是基于 "libzip" 之上封装的,而 "libzip" 又是基于 "zlib"库封装的,所以要编译 "libzipp" 库就要先编译其他两个库。下载准备:"zlib-1.2.
4094 0
|
11月前
|
人工智能 文字识别 并行计算
行业实践 | 基于Qwen2-VL实现医疗表单结构化输出
本项目针对不同医院检查报告单样式差异大、手机拍摄质量差等问题,传统OCR识别效果不佳的情况,探索并选定了Qwen2-vl系列视觉语言模型。通过微调和优化,模型在识别准确率上显著提升,能够精准识别并结构化输出报告单信息,支持整张报告单及特定项目的识别。系统采用FastAPI封装接口,Gradio构建展示界面,具备高效、灵活的应用特性。未来该方案可扩展至多种文本识别场景,助力行业数字化转型。
935 20
|
消息中间件 缓存 监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
springboot的热部署、配置的宽松绑定和校验、任务、邮件、监控、springboot整合JdbcTemplate,h2等sql技术、整合redis,mongodb,es等nosql技术、整合redis,Memcached,jetcache,j2cache等缓存技术、整合ActiveMQ,RabbitMQ,RocketMQ,Kafka等消息的中间件的入门、整合缓存/任务/邮件/监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
|
11月前
|
安全 编译器 C++
constexpr、const和 #define 的比较
本文比较了 `constexpr`、`const` 和 `#define` 在 C++ 中定义常量和函数的优缺点。`constexpr` 用于编译期求值,提供更高的性能和类型安全性;`const` 保证变量在运行期间不可修改,增强代码可靠性;`#define` 用于宏定义,适用于简单的常量和跨平台兼容性。选择时应根据具体需求和代码上下文决定。
|
机器学习/深度学习 数据采集 数据可视化
R语言在数据科学中的应用实例:探索与预测分析
【8月更文挑战第31天】通过上述实例,我们展示了R语言在数据科学中的强大应用。从数据准备、探索、预处理到建模与预测,R语言提供了完整的解决方案和丰富的工具集。当然,数据科学远不止于此,随着技术的不断发展和业务需求的不断变化,我们需要不断学习和探索新的方法和工具,以更好地应对挑战,挖掘数据的潜在价值。 未来,随着大数据和人工智能技术的普及,R语言在数据科学领域的应用将更加广泛和深入。我们期待看到更多创新的应用实例,为各行各业的发展注入新的动力。
|
Shell Linux 开发工具
Anaconda安装后报错 -bash: conda: command not found 如何处理
【6月更文挑战第17天】Anaconda安装后报错 -bash: conda: command not found 如何处理
973 4
|
API 开发工具 计算机视觉
华视 CVR-100UC 身份证读取 Python 二次开发(包含SDK下载地址)
华视 CVR-100UC 身份证读取 Python 二次开发(包含SDK下载地址)