python学opencv|读取图像(三十一)缩放图像的三种方法

【1】引言

前序学习进程中,我们至少掌握了两种方法,可以实现对图像实现缩放。

第一种方法是调用cv2.resize()函数实现,相关学习链接为:

python学opencv|读取图像(三)放大和缩小图像_python opencv 读取图片缩放-CSDN博客

第二种方法是在cv2.getRotationMatrix2D()函数旋转缩放图像时,顺带实现了图像缩放:

python学opencv|读取图像(二十八)使用cv2.getRotationMatrix2D()函数旋转缩放图像-CSDN博客

实际上,对于第二种方法,如果我们只设置旋转角度=0,其实就是只对图像进行放大和缩小。为验证这个猜想,我们可以做测试。

【2】前两种方法代码测试

【2.1】cv2.getRotationMatrix2D()函数缩放

首先我们给出完整代码:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块# 读取图片
src = cv.imread('src.png')
rows=len(src) #读取图像行数
cols=len(src[0]) #读取图像列数
center=(rows/2,cols/2) #旋转中心
#M=np.float32([[1,0,50],#[0,1,200]]) #M矩阵,x=50,y=200
M=cv.getRotationMatrix2D(center,0,0.8) #旋转并缩放图像
dst=cv.warpAffine(src,M,(cols,rows)) #输出图像
cv.imshow('src-pingyi', dst)  # 在屏幕展示绘制圆形的效果
cv.imwrite('src-suofang.png', dst)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

其中对于函数的设置,把旋转角度设定为0,缩放倍数为0.8:

M=cv.getRotationMatrix2D(center,0,0.8) #旋转并缩放图像

使用的原始图像为:

图1 src.png

缩放后的图像为:

图2  缩小0.8倍后的图像

如果我们把缩放倍数放大到1.5倍:

M=cv.getRotationMatrix2D(center,0,1.5) #旋转并缩放图像

代码运行后的图像为:

图3 放大1.5倍后的图像

其实对比图1、图2和图3,会发现图3对原始图像进行了裁切,这种放大效果和cv2.resize()函数相比不一样,cv2.resize()函数本身不会裁切。

【2.2】cv2.resize()函数缩放

为了实现对比cv2.resize()函数放大效果的对比,调用该函数来放大图像,给出完整代码如下:

import cv2  # 引入CV模块# 读取图片
image = cv2.imread('src.png')# 定义放大因子
scale_factor = 1.5# 放大图片,使用立方插值
scaled_image = cv2.resize(image, None, fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_CUBIC)  # INTER_CUBIC插值# 保存结果
cv2.imwrite('scaled_image-001-INTER_CUBIC m15.png', scaled_image)# 显示结果
cv2.imshow('Scaled Image15 ', scaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码运行后的输出效果为:

图4 图片放大1.5倍但没有任何裁切

由图4可见,图片放大了1.5倍,但没有任何裁切。

【3】第三种方法

在前序学习进程中,我们成功实现了对图像的倾斜拉伸,相关链接为:

python学opencv|读取图像(二十九)使用cv2.getAffineTransform()函数倾斜拉伸图像-CSDN博客

文章中已经说明,倾斜拉伸是通过控制图像的顶点实现的。首次启发,我们把图像的顶点按照固定比例缩小和放大,这样就能实现图像的缩放。为此,展开代码测试。

这里使用的原始图像为:

图5

【3.1】缩小

首先给出完整代码:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块# 读取图片
src = cv.imread('srcm.png')#设置点
rows=len(src) #读取图像行数
cols=len(src[0]) #读取图像列数
p1=np.zeros((3,2),np.float32) #32位浮点型全0矩阵
p1[0]=[0,0] #第一点
p1[1]=[cols-1,0] #第二点
p1[2]=[0,rows-1] #第三点
p2=np.zeros((3,2),np.float32) #32位浮点型全0矩阵
p2[0]=[0,0] #新的第一点
p2[1]=[0.8*(cols-1),0] #新的第二点
p2[2]=[0,0.8*(rows-1)] #新的第三点#center=(rows/2,cols/2) #旋转中心
#M=np.float32([[1,0,50],#[0,1,200]]) #M矩阵,x=50,y=200
M=cv.getAffineTransform(p1,p2)
#M=cv.getRotationMatrix2D(center,60,0.8) #旋转并缩放图像
dst=cv.warpAffine(src,M,(cols,rows)) #输出图像
cv.imshow('srcm-qxls', dst)  # 在屏幕展示绘制圆形的效果
cv.imwrite('srcm-qxls-8.png', dst)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

在这里,对新的点设置了0.8倍的缩小因子:

p1=np.zeros((3,2),np.float32) #32位浮点型全0矩阵
p1[0]=[0,0] #第一点
p1[1]=[cols-1,0] #第二点
p1[2]=[0,rows-1] #第三点
p2=np.zeros((3,2),np.float32) #32位浮点型全0矩阵
p2[0]=[0,0] #新的第一点
p2[1]=[0.8*(cols-1),0] #新的第二点
p2[2]=[0,0.8*(rows-1)] #新的第三点

代码运行后的输出效果为:

图6 缩小0.8倍

由图6可见,图像成功缩小为原来的0.8倍。

【3.2】放大

修改缩放因子,把图像放大1.5倍:

p1=np.zeros((3,2),np.float32) #32位浮点型全0矩阵
p1[0]=[0,0] #第一点
p1[1]=[cols-1,0] #第二点
p1[2]=[0,rows-1] #第三点
p2=np.zeros((3,2),np.float32) #32位浮点型全0矩阵
p2[0]=[0,0] #新的第一点
p2[1]=[1.5*(cols-1),0] #新的第二点
p2[2]=[0,1.5*(rows-1)] #新的第三点

此时,会惊喜地发现一个猫猫头:

图7 放大1.5倍

显然,cv2.getAffineTransform()函数在放大图像的时候,也会对图像进行裁切。

【4】效果对比

结合上面的使用效果,会发现:

使用cv2.getRotationMatrix2D()函数、cv2.resize()函数和cv2.getAffineTransform函数均可以实现图像缩放;

在图像缩小效果上,三个函数差不多,只是cv2.getRotationMatrix2D()函数和cv2.getAffineTransform函数会保留原本画布的大小,会看到一些纯色的背景;

在图像放大效果上,三个函数不一样,cv2.getRotationMatrix2D()函数和cv2.getAffineTransform函数会会裁切图像依然会保留原有画布的大小,图像超出画布大小的部分会被裁切,而cv2.resize()函数不会裁切图像,会等比例放大图像的所有部分。

图8 三种图像缩放效果对比

【5】总结

掌握了python+opencv实现图像缩放的三种方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows中,git bash 使用conda命令

1、首先在Anaconda的安装路径如/Anaconda3/Scripts下,打开git bash窗口,然后输入下面的命令。 ./conda init bash 运行之后,会在用户目录下面生成.bash_profile文件,文件内容如下: # >>> conda initialize…

封装红黑树实现map和set

本博客需要红黑树和搜索树二叉树的一些知识以及熟悉map和set的相关函数和迭代器,如果读者还不熟悉可以看这三篇博客:红黑树、二叉搜索树、map、set的使用 红黑树的封装 STL30源码分析 如果想到封装,大家应该会直接把RBtree复制两份&#x…

关于使用FastGPT 摸索的QA

近期在通过fastGPT,创建一些基于特定业务场景的、相对复杂的Agent智能体应用。 工作流在AI模型的基础上,可以定义业务逻辑,满足输出对话之外的需求。 在最近3个月来的摸索和实践中,一些基于经验的小问题点(自己也常常…

LeetCode 热题 100_二叉树的最近公共祖先(48_236_中等_C++)(二叉树;深度优先搜索)

LeetCode 热题 100_二叉树的最近公共祖先(48_236) 题目描述:输入输出样例:题解:解题思路:思路一(深度优先搜索): 代码实现代码实现(思路一(深度优…

HTTP/HTTPS ②-Cookie || Session || HTTP报头

这里是Themberfue 上篇文章介绍了HTTP报头的首行信息 本篇我们将更进一步讲解HTTP报头键值对的含义~~~ ❤️❤️❤️❤️ 报头Header ✨再上一篇的学习中,我们了解了HTTP的报头主要是通过键值对的结构存储和表达信息的;我们已经了解了首行的HTTP方法和UR…

PyCharm+RobotFramework框架实现UDS自动化测试——(二)RobotFramework环境配置

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者,时光不负有心人。 文章目录 1.环境准配2.Pycharm中相关配置2.1. 安装Hyper RobotFramework Support 3.脚本执行环境3.1 执行单条的配置3.2 执行全部用例配置 4.工程运行4.1 单条用例运行4.…

git 转移文件夹

打开终端或命令行界面:首先,确保你的电脑上安装了 Git,并打开终端或命令行界面。 导航到你的仓库目录:使用 cd 命令来切换到包含你想要移动文件夹的仓库的目录。 cd /path/to/your/repository使用 git mv 命令移动文件夹&#x…

Android原生开发同一局域网内利用socket通信进行数据传输

1、数据接收端代码如下,注意:socket 接收信息需要异步运行: // port 端口号自定义一个值,比如 8888,但需和发送端使用的端口号保持一致 ServerSocket serverSocket new ServerSocket(port); while (true) {//这里为了…

腾讯云AI代码助手编程挑战赛-算法小助手

作品简介 一个可以帮助学习计算机各种算法的AI小助手,提升工作效率。 技术架构 使用Html语言完成图形化页面的样式,使用JavaScript语言来操作对应的逻辑代码。 实现过程 1、创建一个界面 2、获取数据 3、添加按钮与功能 4、程序优化调试 开发环境…

使用 IntelliJ IDEA 创建简单的 Java Web 项目

以下是使用 IntelliJ IDEA 创建几个简单的 Java Web 项目的步骤,每个项目实现基本的登录、注册和查看列表功能,依赖 Servlet/JSP 和基本的 Java Web 开发。 前置准备 确保安装了 IntelliJ IDEA Ultimate(社区版不支持 Web 应用)。…

抓包工具之mitmproxy

一、mitmproxy简介 mitmproxy介绍 mitmproxy又名中间人攻击代理,是一个抓包工具,类似于WireShark、Filddler,并且它支持抓取HTTP和HTTPS协议的数据包,只不过它是一个控制台的形式操作。另外,它还有两个非常有用的组件…

Flutter项目开发模版,开箱即用(Plus版本)

前言 当前案例 Flutter SDK版本:3.22.2 本文,是由这两篇文章 结合产出,所以非常建议大家,先看完这两篇: Flutter项目开发模版: 主要内容:MVVM设计模式及内存泄漏处理,涉及Model、…

rk3568 , buildroot , qt ,使用sqlite, 动态库, 静态库

问题说明: 客户反馈 ,buildroot 系统 ,使用qt 使用sqlite ,有报错,无法使用sqlite. 测试情况说明: 我自己测试,发现, buildroot 自己默认就是 使能了 sqlite 的。 是否解决说明&…

嵌入式系统 tensorflow

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 探索嵌入式系统中的 TensorFlow:机遇与挑战一、TensorFlow 适配嵌入式的优势二、面临的硬件瓶颈三、软件优化策略四、实…

投机解码论文阅读:Falcon

题目:Falcon: Faster and Parallel Inference of Large Language Models through Enhanced Semi-Autoregressive Drafting and Custom-Designed Decoding Tree 地址:https://arxiv.org/pdf/2412.12639 一看它的架构图,可以发现它是基于EAGLE…

鸿蒙UI(ArkUI-方舟UI框架)

参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-layout-development-overview-V13 ArkUI简介 ArkUI(方舟UI框架)为应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能&#xff…

《探索 PC 端的开源神经网络多模态模型宝藏》

《探索 PC 端的开源神经网络多模态模型宝藏》 一、多模态模型:开启智能交互新纪元二、主流 PC 端开源多模态模型大赏1. Obsidian:轻量级多模态先锋2. GLM-Edge 系列:移动端与 PC 端的全能选手3. Minicpm-llama3-v2.6:紧凑高效的多…

二次雷达的详细介绍及代码示例

一、二次雷达的工作原理 二次雷达,又称空管雷达信标系统(Air Traffic Control Radar Beacon System,ATCRBS),是一种无线电电子测位和辨认系统。它由地面询问雷达和飞机上的应答雷达(又称雷达信标&#xff0…

Clojure语言的多线程编程

Clojure语言的多线程编程 在现代软件开发中,多线程编程是一项重要的技能。它使程序能够在同一时间执行多个任务,充分利用多核处理器的性能。在众多编程语言中,Clojure作为一门函数式编程语言,提供了强大的并发支持。本文将深入探…

人工智能-数据分析及特征提取思路

1、概况 基于学生行为数据预测是否涉黄、涉黑等。 2.数据分析 数据分析的意义包括得到数据得直觉、发掘潜在的结构、提取重要的变量、删除异常值、检验潜在的假设和建立初步的模型。 2.1数据质量分析 2.1.1数据值分析 查看数据类型: 首先明确各字段的数据类型…