使用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中处理字符串之isalpha()方法的使用
May 18 Python
Python统计日志中每个IP出现次数的方法
Jul 06 Python
Python编程判断一个正整数是否为素数的方法
Apr 14 Python
python paramiko模块学习分享
Aug 23 Python
Python3实现的字典、列表和json对象互转功能示例
May 22 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
Jun 09 Python
Python英文文本分词(无空格)模块wordninja的使用实例
Feb 20 Python
详解python中list的使用
Mar 15 Python
python的turtle库使用详解
May 10 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
python读取xml文件方法解析
Aug 04 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
松下Panasonic RF-B65电路分析
2021/03/02 无线电
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
深入php函数file_get_contents超时处理的方法详解
2013/06/03 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
php导入导出excel实例
2013/10/25 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
php HTML无刷新提交表单
2016/04/05 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
使用Python对Access读写操作
2017/03/30 Python
python多线程共享变量的使用和效率方法
2019/07/16 Python
python 穷举指定长度的密码例子
2020/04/02 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
美国嘻哈首饰购物网站:Hip Hop Bling
2016/12/30 全球购物
我与祖国共奋进演讲稿
2014/09/13 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
学生退学证明
2015/06/23 职场文书
2016年社区党支部公开承诺书
2016/03/25 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
实现一个简单得数据响应系统
2021/11/11 Javascript
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android