畸变矫正


注意:虽然能够成功矫正但是也会损失了部分图像!

透视变换(Perspective Transformation)

概念:

透视变换是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。 我们常说的仿射变换是透视变换的一个特例。 透视变换的目的就是把现实中为直线的物体,在图片上可能呈现为斜线,通过透视变换转换成直线 的变换。 仿射变换(Affine Transformation或 Affine Map),又称为仿射映射,是指在几何中,图像进行从 一个向量空间进行一次线性变换和一次平移,变换为到另一个向量空间的过程。

思想:

通用的变换公式为:

x,y是原始图片坐标,对应得到变换后的图片坐标(X’;Y’;Z’)其中:

可以看作原图像的数据各值与变换后图像的数据各值,对应相等。
令a33=1,展开上面公式,得到一个点的情况:

如果我们要解出上面含有8个未知量(a)的方程,我们需要8个像素点,原图像4个,新图像4个。
源点四个坐标分别为A:(x0,y0),(x1,y1),(x2,y2),(x3,y3) 目标点四个坐标分别为B:(X’0,Y’0),(X’1,Y’1),(X’2,Y’2),(X’3,Y’3)

手动代码实现:

import numpy as npdef WarpPerspectiveMatrix(src, dst):assert src.shape[0] == dst.shape[0] and src.shape[0] >= 4#assert:当src的格式等于dst的格式,并且src的格式大于等于4,程序才继续运行nums = src.shape[0]A = np.zeros((2*nums, 8)) # A*warpMatrix=BB = np.zeros((2*nums, 1))for i in range(0, nums):A_i = src[i,:]B_i = dst[i,:]A[2*i, :] = [A_i[0], A_i[1], 1, 0, 0, 0,-A_i[0]*B_i[0], -A_i[1]*B_i[0]]B[2*i] = B_i[0]A[2*i+1, :] = [0, 0, 0, A_i[0], A_i[1], 1,-A_i[0]*B_i[1], -A_i[1]*B_i[1]]B[2*i+1] = B_i[1]A = np.mat(A)#用A.I求出A的逆矩阵,然后与B相乘,求出warpMatrixwarpMatrix = A.I * B #求出a_11, a_12, a_13, a_21, a_22, a_23, a_31, a_32#之后为结果的后处理warpMatrix = np.array(warpMatrix).T[0]warpMatrix = np.insert(warpMatrix, warpMatrix.shape[0], values=1.0, axis=0) #插入a_33 = 1warpMatrix = warpMatrix.reshape((3, 3))return warpMatrixif __name__ == '__main__':print('warpMatrix')src = [[10.0, 457.0], [395.0, 291.0], [624.0, 291.0], [1000.0, 457.0]]  #编造的输入src = np.array(src)dst = [[46.0, 920.0], [46.0, 100.0], [600.0, 100.0], [600.0, 920.0]]    #编造的输出dst = np.array(dst)warpMatrix = WarpPerspectiveMatrix(src, dst)print(warpMatrix)

这里就不展示结果了 重点是思想

opencv接口代码实现:

import cv2
import numpy as npimg = cv2.imread('photo1.jpg')result3 = img.copy()#img = cv2.GaussianBlur(img,(3,3),0)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#转灰度,做单通道计算比较节省时间
edges = cv2.Canny(gray,50,150,apertureSize = 3)
#canny边缘检测(仅针对这次的输入图片)
cv2.imshow("canny", edges)'''
注意这里src和dst的输入并不是图像,而是图像对应的顶点坐标。
'''
src = np.float32([[207, 151], [517, 285], [17, 601], [343, 731]])
dst = np.float32([[0, 0], [337, 0], [0, 488], [337, 488]])
# 生成透视变换矩阵;进行透视变换
m = cv2.getPerspectiveTransform(src, dst)
result = cv2.warpPerspective(result3, m, (337, 488))
# (337,488)是输出图像大小
cv2.imshow("src", img)
cv2.imshow("result", result)
cv2.waitKey(0)

结果展示:

分别是:输入图片,边缘提取,透视变换结果
成功将其原图片中纸片矫正~
但是注意:虽然成功矫正但是也损失了部分图像!

opencv:畸变矫正:透视变换算法的思想与实现相关推荐

  1. 图像畸变矫正——透视变换

    图像畸变矫正--透视变换 由于相机制造精度以及组装工艺的偏差引入的畸变,或者由于照片拍摄时的角度.旋转.缩放等问题, 可能会导致原始图像的失真,如果要修复这些失真,我们可以通过透视变换,对图像进行畸变 ...

  2. 镜头畸变矫正、鱼眼镜头(算法)

    首先这是 径向畸变+切向畸变,都需要矫正(图片保密) 径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的地方比靠近中心的地方更加弯曲,这种畸变在短焦镜头中表现更加明显,径向畸变主要 ...

  3. python opencv 摄像头标定_(五)单目摄像头标定与畸变矫正(C++,opencv)

    本文将梳理一种单目摄像头标定和矫正的方法,在梳理的过程中,首先使用网上离线的图片数据跑通流程,然后接入自己的camera,手动采集标定图像,实时矫正相机的畸变,然后输出矫正后的图像.全文基于Openc ...

  4. 基于OpenCV的鱼眼相机畸变矫正(含代码)

    首先展示一下实现的效果: 校正前: 校正后: 本文分为两部分,一部分是介绍鱼眼相机畸变校正的原理,一部分是手撕OpenCV相机矫正代码. 文章主要结构如下图所示: 一.介绍鱼眼相机的原理 1.什么是鱼 ...

  5. 鱼眼摄像头的畸变矫正方法-python+opencv

    鱼眼摄像头畸变校正的方法: 1. 棋盘矫正法 2. 经纬度矫正法. 相机为什么会出现畸变? 当前相机的畸变主要分为径向畸变和切向畸变两种. 径向畸变产生的原因:相机的光学镜头厚度不均匀,离镜头越远场景 ...

  6. 图像畸变矫正 matlab,关于opencv图像畸变矫正

    本文通过摄像头参数(fx,fy,cx,cy,k1,k2,p1,p2,p3(标定得到))去矫正摄像头拍出来的图像畸变详细代码在底部 首先 这里我们先介绍两个函数:他们都可以用来矫正畸变,但是一个是输入是 ...

  7. 相机畸变矫正原理及代码实现

    在视觉工程中,涉及到测量任务时,第一步就是对相机的畸变进行矫正.此篇博文首先对坐标系变换进行简介,之后介绍畸变矫正方法,最后给出OpenCV  C++的实现代码. 目录 一.坐标系简介 1.像素坐标系 ...

  8. StereoRectify()函数定义及用法畸变矫正与立体校正

    畸变矫正是上一篇博文的遗留问题,当畸变系数和内外参数矩阵标定完成后,就应该进行畸变的矫正,以达到消除畸变的目的,此其一. 在该系列第一部分的博文中介绍的立体成像原理中提到,要通过两幅图像估计物点的深度 ...

  9. 五、畸变矫正—让世界不在扭曲

    五.畸变矫正-让世界不在扭曲 这篇博文所要讲述的内容,是标定的主要用途之一:矫正摄像机的畸变.对于图像畸变矫正的方法,张正友教授也在其大作"A Flexible New Technique ...

最新文章

  1. HDU1880(map)
  2. oracle将多行转成多列,oracle 多行转多列查询
  3. 服务器融合系统,全球领先的企业级服务器、存储、融合系统及解决方案-H3C与HPE...
  4. Android百度地图scode,“androidsdk | 百度地图API SDK
  5. 大型网站 linux,大型网站架构演变
  6. 笔记-信息系统开发基础-软件工程-评审与审计
  7. 过程记录 yolov3目标检测输出目标坐标和原图物体像素坐标比较
  8. 求两个相交链表的交点
  9. mysql5.7.32 win7_拯救10年前老爷机:C盘不到3G的Win7官方精简版amp;俄大神精简版分享...
  10. Oracle 中control_file_record_keep_time参数的解释
  11. SINOCES 2011
  12. 年薪60w财务总监的加薪秘诀:从不用Excel做报表
  13. qt5 tcp服务器编程 多固定客户_如何编程实现电脑与智能小车通信?
  14. 有什么工具或应用可以帮助找到适合搭配一种颜色的另一种颜色?
  15. 我理解的Java栈与堆,String类
  16. Flutter高仿微信-第28篇-好友详情-查看个人头像
  17. 联想服务器刀片机型号,ThinkSystem SN550刀片服务器
  18. java中finally语句是否一定会被执行
  19. Centos7.4/RHEL7.4---Samba服务器的搭建
  20. mac为什么又叫linux,为什么我从 Mac 换到了 Linux

热门文章

  1. Ubuntu根目录空间不足
  2. HDU2683——欧拉完全数
  3. yfan.qiu linux硬链接与软链接
  4. 文件操作函数(读写)
  5. 1073 多选题常见计分法 (20 分)
  6. 阿里P8亲自教你!mysql列转行
  7. 腾讯,字节等大厂面试真题汇总,深夜思考
  8. 2018.09.16 loj#10243. 移棋子游戏(博弈论)
  9. python会什么比c慢
  10. tcp http socket