python+OpenCV图像处理(四)图像的简单几何变换

图像的简单几何变换

先看一下关于图像几何变换的简介:

几何变换不改变图像的像素值,只是在图像平面上进行像素的重新安排。

适当的几何变换可以最大程度地消除由于成像角度、透视关系乃至镜头自身原因所造成的几何失真所产生的负面影响。有利于我们在后续的处理和识别工作中将注意力集中子图像内容本身,更确切地说是图像中的对象,而不是该对象的角度和位置等。几何变换常常作为图像处理应用的预处理步骤,是图像归一化的核心工作之一。

一个几何变换需要两部分运算:首先是空间变换所需的运算,如平移、缩放、旋转和正平行投影等,需要用它来表示输出图像与输入图像之间的(像素)映射关系;此外,还需要使用灰度差值算法,因为按照这种变换关系进行计算,输出图像的像素可能被映射到输入图像的非整数坐标上。

(一)图形的平移

对于图像的平移非常简单,在平移之前,我们需要先构造一个移动矩阵,所谓移动矩阵,就是让说明白在x轴方向上移动多少距离,在y轴上移动多少距离。

通过numpy来构造这个矩阵,并将其传给仿射函数cv2.warpAffine( )

仿射函数cv2.warpAffine( )接受三个参数,需要进行图像变换的原始图像矩阵,移动矩阵以及图像变换的大小(这里要说明一下,图像本身并不会放大或缩小,而是图像显示区域的大小)

img = cv2.imread('4.jpg')
# 构造移动矩阵H
# 在x轴方向移动多少距离,在y轴方向移动多少距离
H = np.float32([[1, 0, 50], [0, 1, 25]])
rows, cols = img.shape[:2]
print(img.shape)
print(rows, cols)
res = cv2.warpAffine(img, H, (cols, rows))  # 注意这里rows和cols需要反置,个人感觉这里是一个坑
cv2.imshow('origin_picture', img)
cv2.imshow('new_picture', res)
cv2.waitKey(0)

(二)图像的放大和缩小

图像的放大和缩小有一个专门的函数,就是cv2.resize( ),这其中就需要设置缩放的比例,一种办法是设置缩放因子,另一种办法是直接设置图像的大小,在缩放以后,图像必然会发生变化,这就涉及到图像的插值问题。

缩放有几种不同的插值(interpolation)方法,在缩小时推荐使用cv2.INTER_AREA,扩大时推荐使用cv2.INTER_CUBIC和cv2.INTER_LINEAR。

img = cv2.imread('4.jpg')
# 一是通过设置图像缩放比例,即缩放因子,来对图像进行放大或缩小
res1 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
height, width = img.shape[:2]
# 二是直接设置图像的大小,不需要缩放因子
res2 = cv2.resize(img, (int(0.8*width), int(0.8*height)), interpolation=cv2.INTER_AREA)
cv2.imshow('origin_picture', img)
cv2.imshow('res1', res1)
cv2.imshow('res2', res2)
cv2.waitKey(0)

关于插值算法有很多,我这里举一个例子。

最近邻插值算法:选择离它映射到的位置最近的输入像素的灰度值为插值结果。

通过图像长和宽的比例,将原有的图像映射到所需要的图像上。这里涉及到对图像矩阵元素的操作,对于其如何计算的可以看代码,也可以联系我,从数学的角度解释。

# need_height参数不得超过原来图像高的两倍,这是由临近插值算法本身的性质所决定的
# need_width参数则可以任意选取
def pic_interpolation(img, need_height, need_width):height, width, channels = img.shapeprint(height, width, channels)emptyImage = np.zeros((need_height, need_width, channels), np.uint8)sh = need_height/heightsw = need_width/widthfor i in range(need_height):for j in range(need_width):x = round(i/sh)y = math.floor(j/sw)emptyImage[i, j] = img[x, y]return emptyImageimg = cv2.imread("4.jpg")
zoom = pic_interpolation(img, 220, 180)
cv2.imshow("nearest neighbor", zoom)
cv2.imshow("image", img)
cv2.waitKey(0)

(三)图像的旋转

对于图像的旋转,我们需要构造旋转矩阵。一般的图像的旋转矩阵是在原点处进行变换的


为了能够在任意位置进行旋转变换,OpenCV采用了另一种方式


为了构造这个矩阵,OpenCV提供了一个函数:cv2.getRotationMarix2D( ),这个函数需要三个参数,旋转中心,旋转角度,旋转后图像的缩放比例:

img = cv2.imread('4.jpg')
rows, cols = img.shape[:2]
# 第一个参数是旋转中心,第二个参数是旋转角度,第三个参数是缩放比例
M1 = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 0.5)
M2 = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 2)
M3 = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1)
res1 = cv2.warpAffine(img, M1, (cols, rows))
res2 = cv2.warpAffine(img, M2, (cols, rows))
res3 = cv2.warpAffine(img, M3, (cols, rows))
cv2.imshow('res1', res1)
cv2.imshow('res2', res2)
cv2.imshow('res3', res3)
cv2.waitKey(0)
cv2.destroyAllWindows()

(四)图像的仿射

仿射变换是指在向量空间中进行一次线性变换(乘以一个矩阵)并加上一个平移(加上一个向量),变换为另一个向量空间的过程。

Affine Transform描述了一种二维仿射变换的功能,它是一种二维坐标之间的线性变换,保持二维图形的“平直性”(即变换后直线还是直线,圆弧还是圆弧)和“平行性”(其实是保持二维图形间的相对位置关系不变,平行线还是平行线,而直线上的点位置顺序不变,另特别注意向量间夹角可能会发生变化)。仿射变换可以通过一系列的原子变换的复合来实现包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和错切(Shear)。

仿射变化也是需要一个M矩阵就可以,但是由于仿射变换比较复杂,很难找到这个矩阵,opencv提供了根据变换前后三个点的对应关系来自动求解M, 这个函数是cv2.getAffineTransoform(pts1, pts2)

事实上,仿射变换代表的是两幅图之间的关系,我们通常使用2x3矩阵来表示仿射变换如下:


img = cv2.imread('4.jpg')
rows, cols = img.shape[:2]
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])
# 类似于构造矩阵
M = cv2.getAffineTransform(pts1, pts2)
res = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow('原图', img)
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

(五)图像的透射

仿射变换(affine transform)与透视变换(perspective transform)在图像还原、图像局部变化处理方面有重要意义。通常,在2D平面中,仿射变换的应用较多,而在3D平面中,透视变换又有了自己的一席之地。两种变换原理相似,结果也类似,可针对不同的场合使用适当的变换。

基于3×3矩阵进行的变换,叫透视变换或者单应性映射

仿射变换可以形象的表示成以下形式。一个平面内的任意平行四边形ABCD可以被仿射变换映射为另一个平行四边形A’B’C’D’。通俗的解释就是,可以将仿射变换想象成一幅图像画到一个胶版上,在胶版的角上推或拉,使其变形而得到不同类型的平行四边形。相比较仿射变换,透射变换更具有灵活性,一个透射变换可以将矩形转变成梯形。

img = cv2.imread('4.jpg')
rows, cols = img.shape[:2]
pts1 = np.float32([[56, 65], [238, 52], [28, 237], [239, 240]])
pts2 = np.float32([[0, 0], [200, 0], [0, 200], [200, 200]])
M = cv2.getPerspectiveTransform(pts1, pts2)
res = cv2.warpPerspective(img, M, (cols, rows))
cv2.imshow('yuantu', img)
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌AI自动重建果蝇大脑,离绘制人脑更进一步

来源:googleblog、biorxiv、venturebeat导语:将果蝇的大脑分割成成千上万个40纳米的超薄切片?不怕,谷歌新AI技术能够重建果蝇完整大脑。智东西8月6日消息,据外媒报道,谷歌刚刚公布了一项最新研究结果“用洪…

python+OpenCV图像处理(五)图像的阈值分割

图像的阈值处理一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法&#xf…

为什么有些softmax公式需要减去输入中的最大值

我们都知道softmax公式如下: 但有些softmax公式是先将每个x_i减去x中的最大值再代入以上公式 原因是为了防止上溢和下溢 举个例子,x[100000,100001,100002],如果直接代入上式数值会非常大,当对每个x的值减去x中的最大值后得到[-2,-1,0]&…

兰德公司报告分析 “分布式作战”对美空军兵力运用的影响

来源:兰德公司网站/图片来自互联网导读7月17日,兰德公司发布《竞争环境下的分布式作战:对美国空军兵力运用的影响》的报告,研究了美空军竞争环境下“分布式作战”的能力需求,分析了如何调整美空军当前的“兵力运用模式…

MATLAB(四)在高等数学中的应用

MATLAB在高等数学中的应用 (一)求极限 matlab中求极限的命令为 limit(expr, x, a) limit(expr, a) limit(expr) limit(expr, x, a, left) limit(expr, x, a, right) 其中,limit(expr, x, a)表示求符号表达式expr关于符号变量x趋近于a时的…

华为手机到底用了多少美国芯?外媒拆解来了

来源:iFixit、IT之家从拆解结果来看,华为Mate 20 X (5G)手机除了使用了3颗美国的芯片产品(美光内存、SkyworksWCDMA/LTE低端前端模块、Qorvo中高频段模块)以及荷兰公司恩智浦的芯片产品,其余主要部件基本上都是由华为海…

MATLAB(五)在线性代数中的应用

MATLAB在线性代数中的应用 (一)向量组的线性相关性 求列向量组A的一个最大线性无关组,可用命令rref(A)将A化成行最简形,其中单位向量对应的列向量即为最大线性无关组所含向量,其他列向量的坐标即为其对应向量用最大线…

全球市值最大公司的巨变:20年,已是沧海桑田

来源: 资本实验室三十年河东,三十年河西。而商业的世界,变化来得更为迅猛、激烈。就比如当我们比较1999到2019年间的全球市值最大公司,并回看二十年时,惊觉已是沧海桑田。如果以更短的五年为一个观察周期,则…

python+OpenCV图像处理(六)图像平滑与滤波

图像平滑与滤波 运用它,首先就要了解它,什么是平滑滤波? 平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的…

语音助手再次敲响隐私保护警钟

来源: 中国科学报智能手机内置的语音助手已成为人们生活中的亲密伙伴,大家习惯于让它完成报时、查询天气等日常任务甚至与它聊天解闷。然而,近期多家科技公司被曝光以智能语音助手录制用户谈话,再通过人工对语音做标注和反馈&…

大数据深度解析NLP文本摘要技术:定义、应用与PyTorch实战

文章目录 大数据深度解析NLP文本摘要技术:定义、应用与PyTorch实战1. 概述1.1 什么是文本摘要?1.2 为什么需要文本摘要? 2. 发展历程2.1 早期技术2.2 统计方法的崛起2.3 深度学习的应用2.4 文本摘要的演变趋势 3. 主要任务3.1 单文档摘要3.2 …

python+OpenCV图像处理(七)图像的形态学处理

图像的形态学处理 数学形态学(Mathematical morphology)是一门 建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、…

站立会议08

一、会议细节 时间   2014-4-27 21:10~21:40 地点   基教102 记录人   王岸城 二,会议记录 姓名今天你做了什么明天你要做什么今天遇到了什么问题王岸城记事本删除记事本修改无法使用数据库 苏月 实现登录和注册的连接 学习数据库 连接数据库信息…

【人工智能】机器人的未来发展:从工业自动化到知识自动化

来源:王飞跃博客【导读】智能时代的核心技术将是知识自动化,因此必须从一开始就加快、加强以软件形态为主的知识机器人的研发与应用,尽快形成软件和物理形态平行互动的新型机器人系统,并以此为突破口,引发下一代智能机…

python+OpenCV图像处理(八)边缘检测

边缘检测 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。边缘检测是特征提取中的一个研究领域。 图像边缘检测大幅度地减少了数据量,并且剔除了…

python+OpenCV图像处理(九)图像金字塔

图像金字塔 图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通…

3位物理学家获基础物理学特别突破奖

Peter van Nieuwenhuizen、Sergio Ferrara和Dan Freedman(从左至右)来源:中国科学报超引力理论是一个试图统一所有自然力的理论,在被提出40多年后,它是否能真实描述这个世界仍然悬而未决。尽管如此,该理论的…

python+OpenCV图像处理(十)霍夫变换简单图形检测

霍夫变换 霍夫变换(Hough Transform)是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如:直线、圆等)。最基…

Windows下安装scikit-learn

在安装sklearn前,首先确保安装了Numpy、Scipy和matplotlib 安装Numpy: 首先到https://pypi.org/project/numpy/#files下载安装包 注意文件的版本,如“numpy-1.19.1-cp36-cp36m-win_amd64.whl”表示该文件适用于widows操作系统下64位的Pyth…

华为发布面向2025十大趋势

来源:华为华为今日发布全球产业展望GIV2025,提出智能世界正在加速而来,触手可及,并预测:到2025年,智能技术将渗透到每个人、每个家庭、每个组织,全球58%的人口将能享有5G网络,14%的家…