使用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 相关文章推荐
Python获取任意xml节点值的方法
May 05 Python
python文件操作之目录遍历实例分析
May 20 Python
动感网页相册 python编写简单文件夹内图片浏览工具
Aug 17 Python
Python复制Word内容并使用格式设字体与大小实例代码
Jan 22 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
python解析json串与正则匹配对比方法
Dec 20 Python
Python实现的列表排序、反转操作示例
Mar 13 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
Aug 05 Python
python网络爬虫实现发送短信验证码的方法
Feb 25 Python
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
May 28 Python
python中的装饰器该如何使用
Jun 18 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
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
9个JavaScript评级/投票插件
2010/01/18 Javascript
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
webpack实现热加载自动刷新的方法
2017/07/30 Javascript
js实现图片放大展示效果
2017/08/30 Javascript
JS抛物线动画实例制作
2018/02/24 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
javascript合并两个数组最简单的实现方法
2019/09/14 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
[02:54]DOTA2英雄基础教程 暗影牧师戴泽
2013/12/05 DOTA
Python基础之函数用法实例详解
2014/09/10 Python
Python中endswith()函数的基本使用
2015/04/07 Python
在Python的web框架中中编写日志列表的教程
2015/04/30 Python
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
Django Highcharts制作图表
2016/08/27 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
python读取和保存图片5种方法对比
2018/09/12 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
浅析Python 多行匹配模式
2020/07/24 Python
BeautifulSoup中find和find_all的使用详解
2020/12/07 Python
阿里云:Aliyun.com
2017/02/15 全球购物
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
房地产财务部员工岗位职责
2014/03/12 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
java实现web实时消息推送的七种方案
2022/07/23 Java/Android