2,反向映射
扫描变换后图像的每个像素(x,y),根据逆变换找到原图中对应的(v,w)
大概率找到的不是整点,所以需要使用图像插值
https://blog.csdn.net/nameofcsdn/article/details/118281568
二,常见的仿射变换
1,恒等变换
2,尺度变换(缩放)
3,旋转变换
4,平移变换
5,偏移变换
垂直偏移变换:
水平偏移变换:
三,透视投影
把三维图像透视投影到二维平面:
x' = x/z , y' = y/z
如,有3个垂直于z轴的正方形,分别是:
{6<=x<=12,6<=y<=12,z=1}、{6<=x<=12,6<=y<=12,z=2}、{6<=x<=12,6<=y<=12,z=3}
那么投影之后得到的正方形如图:
这么看着没什么感觉,但是如果旋转180度,再添加2条透视线:
显然,原点O就是透视点,对应z=∞的点。
四,透视变换
透视变换就是,把一个平面图形在三维空间中做仿射变换,然后再做透视投影变成平面图形。
三维仿射变换:
其中w可以取任意不为0的数,如w=1
然后透视投影:
注意到,这9个变量同时放大缩小是不影响的,所以不妨设a33 = 1,那么就剩下8个未知数。
五,图像配准
输入两幅图片,已知一副图像是另外一副图像变换得到,通过计算反推出变换。
常用的方法就是根据特征点,代入图像变换的公式求解。
特征点的最少数目,取决于变换的方式。而特征点越多,自然配准越容易,越准确。
PS:只有部分重合的图片,也能做配准,如全景照片就是配准之后拼接起来的。
六,Opencv 配准+变换
从未知数的数量来看,仿射变换有6个未知数,透视变换有8个未知数。
所以确定一个仿射变换需要3个点的前后坐标值,确定一个透视变换需要4个点的前后坐标值。
从几何意义来看,仿射变换是平面操作,所以需要3个点,透视变换是空间操作,所以需要4个点。
Opencv里面提供了仿射变换和透视变换的配准和变换的接口,先提供点的坐标匹配,根据坐标匹配自动配准,得到变换公式的对象,再用这个对象对整个图像进行变换。
仿射变换:(这里是旋转的示例)
image = cv2.imread("D:/im.jpg", 0)
image = cv2.resize(image,(500,500))
cv2.imshow("img",image)
p_src = numpy.float32([[0, 0],[0, 500],[500, 0]])
p_dst = numpy.float32([[300, 0],[0, 400],[700, 300]])
trans = cv2.getAffineTransform(p_src,p_dst)
image2 = cv2.warpAffine(image,trans,(700,700))
cv2.imshow("img2",image2)
cv2.waitKey(0)
变换结果:
透视变换:
image = cv2.imread("D:/im.jpg", 0)
image = cv2.resize(image,(500,500))
cv2.imshow("img",image)
p_src = numpy.float32([[0, 0],[0, 500],[500, 0],[500,500]])
p_dst = numpy.float32([[0, 0],[0, 500],[250, 0],[500,500]])
trans = cv2.getPerspectiveTransform(p_src,p_dst)
image2 = cv2.warpPerspective(image,trans,(500,500))
cv2.imshow("img2",image2)
cv2.waitKey(0)
变换结果:
七,其他变换
1,双线性变换
显然这个也是需要4个点才能确定变换。
书中的这个式子卡住了我很久,因为我一直想不通这是什么变换,于是我举了一个简单的例子:
把正方形{(0,0)(0,500)(500,0){500,500}}变换为梯形{(0,0)(0,250)(500,0){500,500}}
如果是透视,那么变换就是x=500u/(1000-u), y=500v/(1000-u)
如果是双线性变换,那么就是x=u, y=v(u+500)/1000
2,实现双线性变换和透视变换
image = cv2.imread("D:/im.jpg", 0)
image = cv2.resize(image,(500,500))
cv2.imshow("img",image)
image2 = image.copy()
image3 = image.copy()
for i in range(image.shape[0]):
for j in range(image.shape[1]):
image2[i, j] = 0
image3[i, j] = 0
for i in range(image.shape[0]):
for j in range(image.shape[1]):
image2[int(i * 500 / (1000 - i)) % image.shape[0], int(j * 500 / (1000 - i)) % image.shape[1]] = image[i, j]
image3[i,int(j*(i+500)/1000)%image.shape[1]] = image[i,j]
cv2.imshow("image2",image2) #透视
cv2.imshow("image3",image3) #双线性
cv2.waitKey(0)
可以看出来,图2是透视,物体在图片中的高度位置有变化,直线还是直线,
图3是双线性变换,高度没有变化,直线变得不直了。
PS:自己写的透视变换有点粗糙,中间有些黑线,如果是反向映射的话应该就不会这样了:
image = cv2.imread("D:/im.jpg", 0)
image = cv2.resize(image,(500,500))
cv2.imshow("img",image)
image2 = image.copy()
image3 = image.copy()
for i in range(image.shape[0]):
for j in range(image.shape[1]):
image2[i, j] = 0
image3[i, j] = 0
for i in range(image.shape[0]):
for j in range(image.shape[1]):
j2 = int(j * 1000 / (i + 500))
if j2 >= 500:
image2[i, j] = 0
else:
image2[i,j] = image[int(i * 1000 / (i + 500)) % image.shape[0], j2]
image3[i,int(j*(i+500)/1000)%image.shape[1]] = image[i,j]
cv2.imshow("image2",image2) #透视
cv2.imshow("image3",image3) #双线性
cv2.waitKey(0)
目录一,仿射变换二,仿射变换的映射方式1,前向映射2,反向映射三,常见的变换1,恒等变换2,尺度变换(缩放)3,旋转变换4,平移变换5,偏移变换一,仿射变换二,仿射变换的映射方式仿射变换的映射方式有两种,前向映射和反向映射。1,前向映射扫描原图的每个像素(v,w),变换后的值填入对应的(x,y)处。对于多个像素点映射到同一个(x,y)的情况,不太好处理,所以反向映射更有效。2,反向映射扫描变换后图像的每个像素(x,y),根
透视
变换
(Perspective Transformation)的本质是将图像投影到一个新的视平面,其通用
变换
公式为:
(u,v)为原始图像像素坐标,(x=x’/w’,y=y’/w’)为
变换
之后的图像像素坐标。
透视
变换
矩阵图解如下:
仿射变换
(Affine Transformation)可以理解为
透视
变换
的特殊形式。
透视
变换
的数学表达式为:
所以,给定
透视
变换
对应的四对像素点坐标,即可求得
透视
变换
矩阵;反之,给定
透视
变换
矩阵,即可对图像或像素点坐标完成
透视
变换
,如下图所示:
写文章不易,如果您觉得此文对您有所帮助,请帮忙点赞、评论、收藏,感谢您!
一.
仿射变换
介绍:
请参考:图解图像
仿射变换
:https://www.cnblogs.com/wojianxin/p/12518393.html
二.
仿射变换
公式:
仿射变换
过程,(x,y)表示原图像中的坐标,(x’,y’)表示目标图像的坐标 ↑
三.
仿射变换
——图像平移 算法:
仿射变换
—图像平移算法,其中tx为在横轴上移动的距离,ty为在纵轴上移动的距离 ↑
四. python实现
仿射变换
——图像平移
import cv2
import numpy as np
# 图像
仿射变换
->图
1. 最近在做身份证OCR项目中,需要对倾斜扭曲的图像做矫正,
透视
变换
正可以解决这个问题,在这里记录对
变换
方法的理解。
2. 本文主要介绍一下
仿射变换
和
透视
变换
的原理,特点以及其在opencv中实现的一些注意点。
3. 首先看下
透视
变换
后的例图:
二. 从
仿射变换
说起
透视
变换
和
仿射变换
在原理上比较相似,而
仿射变换
更加简单。
1. 定义:...
在LabVIEW中实现
图像配准
可以通过以下步骤进行:
1. 导入图像:使用LabVIEW中的图像处理工具包,可以使用"Read Image File"函数来导入需要
配准
的图像。
2. 图像预处理:根据需要,对导入的图像进行预处理,例如去噪、平滑、增强等操作,以提高
配准
的准确性。
3. 特征提取:使用LabVIEW中的特征提取工具包,例如边缘检测、角点检测等方法,提取图像的特征点。
4. 特征匹配:通过比较两幅图像的特征点,找到它们之间的对应关系。可以使用LabVIEW中的图像匹配工具包,例如基于特征点的匹配算法(如SIFT、SURF等)或基于相关性的匹配算法。
5.
变换
估计:根据特征点的对应关系,使用合适的
变换
模型(如平移、旋转、缩放等)估计出两幅图像之间的
变换
关系。
6.
图像配准
:将一个图像根据
变换
关系进行
配准
,使其与另一个图像对齐。可以使用LabVIEW中的图像
变换
工具包,例如
仿射变换
、
透视
变换
等方法。
7. 可选步骤:根据需要,可以进行后续的图像融合、重采样等处理,以得到最终的
配准
结果。
以上是一个基本的
图像配准
流程,具体的实现方式可以根据具体情况和需求进行调整和优化。希望对你有帮助!