使用OpenCV实现仿射变换—缩放功能

yipeiwu_com6年前Python基础

前面介绍怎么样实现平移的功能,接着下来演示缩放功能。比如在一个文档里插入一个图片,发现这个图片占用太大的面积了,要把它缩小,才放得下,与文字的比例才合适。这样的需求,就需要使用仿射变换的缩放功能,而实现这个功能的方法,就是采用齐次坐标的变换功式:

可看到最后一条公式,就是缩放公式,要实现二维图像的缩放,需要构造前面那个缩放矩阵,因此在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()

输出结果如下:

左图是X轴和Y轴都缩小一半的图片,右边是原图。

在这个例子里与平移不一样的,就是矩阵的变化:

np.array([[0.5, 0, 0], [0, 0.5, 0]], np.float32)

就是矩阵对角线上的值发生了变化,如果要放大就是变为大于1的值。

总结

以上所述是小编给大家介绍的使用OpenCV实现仿射变换—缩放功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对【听图阁-专注于Python设计】网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

Python引用(import)文件夹下的py文件的方法

Python引用(import)文件夹下的py文件的方法

Python的import包含文件功能就跟PHP的include类似,但更确切的说应该更像是PHP中的require,因为Python里的import只要目标不存在就报错程序无法往下执行...

python3实现指定目录下文件sha256及文件大小统计

python3实现指定目录下文件sha256及文件大小统计

有时会统计某个目录下有哪些文件,每个文件的sha256及文件大小等相关信息,这里用python3写了个脚本用来实现此功能,此脚本可跨平台,同时支持windows和linux,脚本(get...

Python编程中归并排序算法的实现步骤详解

基本思想:归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比...

Python使用Pycrypto库进行RSA加密的方法详解

密码与通信 密码技术是一门历史悠久的技术。信息传播离不开加密与解密。密码技术的用途主要源于两个方面,加密/解密和签名/验签 在信息传播中,通常有发送者,接受者和窃听者三个角色。假设发送者...

python3实现从kafka获取数据,并解析为json格式,写入到mysql中

项目需求:将kafka解析来的日志获取到数据库的变更记录,按照订单的级别和订单明细级别写入数据库,一条订单的所有信息包括各种维度信息均保存在一条json中,写入mysql5.7中。 配置...