使用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的Django框架测试驱动开发的教程
Apr 22 Python
python开发之函数定义实例分析
Nov 12 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
Feb 19 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
Python wxPython库Core组件BoxSizer用法示例
Sep 03 Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 Python
Tensorflow tf.tile()的用法实例分析
May 22 Python
keras中epoch,batch,loss,val_loss用法说明
Jul 02 Python
在vscode中启动conda虚拟环境的思路详解
Dec 25 Python
Pandas数据分析的一些常用小技巧
Feb 07 Python
Django给表单添加honeypot验证增加安全性
May 06 Python
opencv用VS2013调试时用Image Watch插件查看图片
Jul 26 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
也谈php网站在线人数统计
2008/04/09 PHP
基于PHP CURL用法的深入分析
2013/06/09 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
2015/05/25 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
如何将网页表格内容导入excel
2014/02/18 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
Vue中的v-for循环key属性注意事项小结
2018/08/12 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
解决python写的windows服务不能启动的问题
2014/04/15 Python
python在指定目录下查找gif文件的方法
2015/05/04 Python
python 中random模块的常用方法总结
2017/07/08 Python
在Python中使用gRPC的方法示例
2018/08/08 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
python程序变成软件的实操方法
2019/06/24 Python
python的移位操作实现详解
2019/08/21 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
python实现3D地图可视化
2020/03/25 Python
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
介绍一下MD5加密算法
2016/11/12 面试题
物流仓储计划书
2014/01/10 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
企业计划生育责任书
2015/05/09 职场文书