使用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实现简单的TCP代理服务器
Oct 08 Python
python求pi的方法
Oct 08 Python
零基础写python爬虫之使用Scrapy框架编写爬虫
Nov 07 Python
Python json模块使用实例
Apr 11 Python
Python实现简单拆分PDF文件的方法
Jul 30 Python
简单实现python爬虫功能
Dec 31 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
Python单元测试工具doctest和unittest使用解析
Sep 02 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 Python
如何基于Python按行合并两个txt
Nov 03 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
Mar 03 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
html中select语句读取mysql表中内容
2006/10/09 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
培养自己的php编码规范
2015/09/28 PHP
PHP控制前台弹出对话框的实现方法
2016/08/21 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
2013/10/17 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
一文快速详解前端框架 Vue 最强大的功能
2019/05/21 Javascript
Python中变量交换的例子
2014/08/25 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
python 文件操作删除某行的实例
2017/09/04 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
python 对象和json互相转换方法
2018/03/22 Python
Python SVM(支持向量机)实现方法完整示例
2018/06/19 Python
python3实现的zip格式压缩文件夹操作示例
2019/08/17 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
聊聊python中的循环遍历
2020/09/07 Python
指针和引用有什么区别
2013/01/13 面试题
教师现实表现材料
2014/02/14 职场文书
甜品店创业计划书
2014/09/21 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
Go语言读取txt文档的操作方法
2022/01/22 Golang
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL