使用OpenCV实现仿射变换—缩放功能


Posted in Python onAugust 29, 2019

前面介绍怎么样实现平移的功能,接着下来演示缩放功能。比如在一个文档里插入一个图片,发现这个图片占用太大的面积了,要把它缩小,才放得下,与文字的比例才合适。这样的需求,就需要使用仿射变换的缩放功能,而实现这个功能的方法,就是采用齐次坐标的变换功式:

使用OpenCV实现仿射变换—缩放功能

可看到最后一条公式,就是缩放公式,要实现二维图像的缩放,需要构造前面那个缩放矩阵,因此在OpenCV也是构造一个2X3的矩阵。不过,在缩放变换里,要考虑另外一个问题,比如图片放大之后,原来两点像素的距离变大了,在中间留下了空间,那么中间空白的像素点怎么样处理呢?其实图像处理要完成两个独立的算法计算,首先需要一个算法实现空间坐标变换,用它描述每个像素如何从初始位置移动到终止位置。其次需要一个插值算法完成输出图像的每个像素的颜色值。在放大或缩小里,就需要计算像素的颜色值了,就需要使用插值算法。不过插值算法也是五花百门的,最简单的方法就是向邻近元素借用它们的值,比如放大之后原来元素坐标为1和3了,留下坐标2的点为空,那么2的点就可以借用1或3点的颜色值,在opencv里就可以使用cv.INTER_NEAREST标志表示这个意思。有时候中间留下的点很多,如果全部取一个点的颜色值,就会在图形上出现一片相同的颜色值,让图片不好看。为了解决这个问题,向更好的插值算法推广,接着引入双线性插值(cv.INTER_LINEAR),这个插值算法使用了附近四个点的颜色值来计算,这样就不是单独考虑一个元素的值了,这样就比只取一个点的值好很多,因此也成为opencv里仿射函数里默认的值。如果要更好的插值,还有很多更高级的三次样条插值等等,不过计算量也上去了。

下面通过例子来演示缩放的操作:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
 
#图片的路径
imgname = "img1.jpg"
 
#读取图片
image = cv2.imread(imgname, cv2.IMREAD_COLOR)
 
#图片的高度和宽度
h,w = image.shape[:2]
 
#构造缩放的2X3的矩阵,然后调用warpAffine执行缩放
A1 = np.array([[0.5, 0, 0], [0, 0.5, 0]], np.float32)
d1 = cv2.warpAffine(image, A1, (w, h), borderValue = 125)
 
#显示操作之后的图片
cv2.imshow("d1",d1)
 
#显示图像
cv2.imshow("image", image)
 
#等待用户输入,然后删除所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

使用OpenCV实现仿射变换—缩放功能

左图是X轴和Y轴都缩小一半的图片,右边是原图。

在这个例子里与平移不一样的,就是矩阵的变化:

np.array([[0.5, 0, 0], [0, 0.5, 0]], np.float32)

就是矩阵对角线上的值发生了变化,如果要放大就是变为大于1的值。

总结

以上所述是小编给大家介绍的使用OpenCV实现仿射变换—缩放功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
Python生成器(Generator)详解
Apr 13 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
对Python字符串中的换行符和制表符介绍
May 03 Python
利用Python如何批量更新服务器文件
Jul 29 Python
pygame游戏之旅 添加碰撞效果的方法
Nov 20 Python
实例详解Python模块decimal
Jun 26 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
基于pytorch的lstm参数使用详解
Jan 14 Python
详解Pycharm与anaconda安装配置指南
Aug 25 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 21 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
Mar 22 Python
python实现两个文件夹的同步
Aug 29 #Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 #Python
python+rsync精确同步指定格式文件
Aug 29 #Python
django-rest-swagger对API接口注释的方法
Aug 29 #Python
Python3视频转字符动画的实例代码
Aug 29 #Python
scikit-learn线性回归,多元回归,多项式回归的实现
Aug 29 #Python
python中property属性的介绍及其应用详解
Aug 29 #Python
You might like
MyEclipse常用配置图文教程
2014/09/11 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
tp5框架使用cookie加密算法实现登录功能示例
2020/02/10 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
2019/07/19 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
Tensorflow加载预训练模型和保存模型的实例
2018/07/27 Python
对django 模型 unique together的示例讲解
2019/08/06 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
python Shapely使用指南详解
2020/02/18 Python
在python中求分布函数相关的包实例
2020/04/15 Python
python中tab键是什么意思
2020/06/18 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
HTML5的语法变化介绍
2013/08/13 HTML / CSS
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
计算机求职信
2013/12/01 职场文书
微博营销计划书
2014/01/10 职场文书
分公司负责人任命书
2014/06/04 职场文书
Js类的构建与继承案例详解
2021/09/15 Javascript