使用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基础教程之循环介绍
Aug 29 Python
Python IDE PyCharm的基本快捷键和配置简介
Nov 04 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 Python
Python 类与元类的深度挖掘 I【经验】
May 06 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
python批量获取html内body内容的实例
Jan 02 Python
简单了解python中的与或非运算
Sep 18 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 Python
Python 字典中的所有方法及用法
Jun 10 Python
PyCharm中配置PySide2的图文教程
Jun 18 Python
python实现ROA算子边缘检测算法
Apr 05 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
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
2013/11/17 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
Node.js中的事件驱动编程详解
2014/08/16 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
理解javascript正则表达式
2016/03/08 Javascript
JS产生随机数的几个用法详解
2016/06/22 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
2017/09/22 jQuery
vuejs router history 配置到iis的方法
2018/09/20 Javascript
详解基于webpack&gettext的前端多语言方案
2019/01/29 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
Vue+Java 通过websocket实现服务器与客户端双向通信操作
2020/09/22 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
python爬虫中get和post方法介绍以及cookie作用
2018/02/08 Python
python删除不需要的python文件方法
2018/04/24 Python
在python image 中实现安装中文字体
2020/05/16 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
浅谈Python __init__.py的作用
2020/10/28 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
MYSQL支持事务吗
2013/08/09 面试题
计算机学生求职信范文
2014/01/30 职场文书
2014单位领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
python状态机transitions库详解
2021/06/02 Python
angular异步验证器防抖实例详解
2022/03/31 Javascript