使用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查看多台服务器进程的脚本分享
Jun 11 Python
pygame学习笔记(4):声音控制
Apr 15 Python
python中常用检测字符串相关函数汇总
Apr 15 Python
在Python的Django框架中显示对象子集的方法
Jul 21 Python
win10下tensorflow和matplotlib安装教程
Sep 19 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 Python
python绘制规则网络图形实例
Dec 09 Python
python中p-value的实现方式
Dec 16 Python
tensorflow指定GPU与动态分配GPU memory设置
Feb 03 Python
python实现同一局域网下传输图片
Mar 20 Python
Python sublime安装及配置过程详解
Jun 29 Python
OpenCV-Python实现轮廓拟合
Jun 08 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&java(三)
2006/10/09 PHP
详解:――如何将图片储存在数据库里
2006/12/05 PHP
数据库查询记录php 多行多列显示
2009/08/15 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
利用PHP如何写APP接口详解
2016/08/23 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
理解 JavaScript Scoping & Hoisting(二)
2015/11/18 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
使用JavaScript实现alert的实例代码
2017/07/06 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
使用 UniApp 实现小程序的微信登录功能
2020/06/09 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
Python实现队列的方法
2015/05/26 Python
python判断字符串是否是json格式方法分享
2017/11/07 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
简单了解python协程的相关知识
2019/08/31 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
奥地利手表、香水、化妆品和珠宝购物网站:Brasty.at
2021/01/17 全球购物
银行毕业实习自我鉴定
2013/09/19 职场文书
党支部书记先进事迹
2014/01/17 职场文书
初三开学计划书
2014/04/27 职场文书
计算机求职信
2014/07/02 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
golang 实现Location跳转方式
2021/05/02 Golang
Python find()、rfind()方法及作用
2022/12/24 Python