Python与图像处理7

来源:互联网 发布:单片机数字式温度计 编辑:程序博客网 时间:2024/05/22 08:28

1. 相机畸变校正 

cv.GetOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, alpha, newCameraMatrix, newImageSize=(0, 0), validPixROI=0, centerPrincipalPoint=0) → None:Returns the new camera matrix based on the free scaling parameter.

解析:

(1)alpha:Free scaling parameter between 0 (when all the pixels in the undistorted image are valid) and 1 (when all the source image pixels are retained in the undistorted image). See stereoRectify() for details.

(2)validPixROI:Optional output rectangle that outlines all-good-pixels region in the undistorted image. See roi1, roi2 description in stereoRectify().

如果缩放系数alpha=0,返回的非畸变图像会带有最少量的不想要的像素,它甚至有可能在图像角点去除一些像素。如果alpha=1,所有的像素都会被返回。如下所示:

img = cv2.imread('left12.jpg')h, w = img.shape[:2]newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
畸变矫正有两种方法,分别是cv2.undistort()和重映射(remapping)。cv2.undistort()只需使用该函数和ROI对结果进行裁剪。如下所示:
# undistortdst = cv2.undistort(img, mtx, dist, None, newcameramtx)# crop the imagex,y,w,h = roidst = dst[y:y+h, x:x+w]cv2.imwrite('calibresult.png',dst)
说明:cv2.undistort(src, cameraMatrix, distCoeffs[, dst[, newCameraMatrix]]) → dst:Transforms an image to compensate for lens distortion.

使用重映射(remapping)要首先找到从畸变图像到非畸变图像的映射方程,然后使用重映射方程。如下所示:

# undistortmapx,mapy = cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w,h),5)dst = cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)# crop the imagex,y,w,h = roidst = dst[y:y+h, x:x+w]cv2.imwrite('calibresult.png',dst)
说明:

(1)cv2.initUndistortRectifyMap(cameraMatrix, distCoeffs, R, newCameraMatrix, size, m1type[, map1[, map2]]) → map1, map2:Computes the undistortion and rectification transformation map.

(2)cv2.remap(src, map1, map2, interpolation[, dst[, borderMode[, borderValue]]]) → dst:Applies a generic geometrical transformation to an image.


2. 反向投影误差

假设我们已经得到了相机内部参数(相机矩阵),畸变系数(5个)和相机外部参数(旋转矩阵(R)和平移矩阵(T)),就可以利用反向投影误差对找到的参数的准确性进行估计。因为标定图像有很多张,所以可以计算所有标定图像的误差平均值。如下所示:

mean_error = 0for i in xrange(len(objpoints)):imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)error = cv2.norm(imgpoints[i],imgpoints2, cv2.NORM_L2)/len(imgpoints2)tot_error += errorprint "total error: ", mean_error/len(objpoints)

说明:cv2.projectPoints(objectPoints, rvec, tvec, cameraMatrix, distCoeffs[, imagePoints[, jacobian[, aspectRatio]]]) → imagePoints, jacobian:Projects 3D points to an image plane.


3. 积分图像 [2]

解析:对于一幅灰度的图像,积分图像中的任意一点的值是指从图像的左上角到这个点的所构成的矩形区域内所有的

点的灰度值之和。如果原始图像是彩色图像,那么积分图像也是彩色图像,这时积分图像的结果不是灰度值,而是颜

色值。假设image是灰度图像,那么计算积分图像:intim = cv2.integral(gray);intim = (255.0*intim) / intim.max()。


4. cv2.floodFill(泛洪填充)

解析:

cv2.floodFill(image, mask, seedPoint, newVal[, loDiff[, upDiff[, flags]]]) → retval, rect:Fills a connected component with the given color.

(1)image:Input/output 1- or 3-channel, 8-bit, or floating-point image.

(2)mask:Operation mask that should be a single-channel 8-bit image, 2 pixels wider and 2 pixels taller than image. 

(3)seedPoint:Starting point.

(4)newVal:New value of the repainted domain pixels.

(5)loDiff:Maximal lower brightness/color difference between the currently observed pixel and one of its 

neighbors belonging to the component, or a seed pixel being added to the component.

(6)upDiff:Maximal upper brightness/color difference between the currently observed pixel and one of its 

neighbors belonging to the component, or a seed pixel being added to the component.

Note:Since the mask is larger than the filled image, a pixel (x, y) in image corresponds to the pixel (x+1, y+1) in 

the mask.


5. 变焦与对焦区别 [3]

解析:

(1)变焦就是改变镜头的焦距,以改变拍摄影的视角,也就是通常说的把被摄体拉近或推远。对焦通常指调整镜头与底片之间的距离使底片上主体成的像清晰。一般的拍摄步骤是先变焦确定拍摄范围,然后对焦使主体清晰。

(2)变焦基本上有两种,一种是物理变焦(光学变焦),一种是电子变焦(数码变焦)。物理变焦主要是利用移动镜头里面的镜片距离来达到物体光线的反射和折射把物体拉近或推远。因为是镜片的实际移动,属于物理变焦,对于成像效果是不会失真的,所以光学变焦的倍数越高越好。电子变焦是透过电子模式和软件运算方式来达到物体的拉近或推远,所以会失真,倍数越大越失真。

(3)通常没有手动变焦和自动变焦的说法,只有手动对焦和自动对焦的说法。


6. 色彩模型(颜色模型)

解析:

(1)HSV颜色模型

(2)HSI颜色模型

(3)RGB颜色模型

(4)CMY颜色模型

(5)HSL颜色模型

(6)HSB颜色模型

(7)Ycc颜色模型

(8)XYZ颜色模型

(9)Lab颜色模型

(10)YUV颜色模型

说明:自然界中任何一种色光都可由R、G、B三基色按不同的比例相加混合而成。RGB模型是色光的彩色模型,
因为是由红、绿、蓝相叠加形成其它颜色,因此该模型也叫加色合成法。所有的显示器、投影设备,以及电视等许多设备都是依赖于这种加色模型的;CMYK模型也称减色合成法,主要应用于印刷行业中;RGB和CMYK颜色模型都是面向硬件的,但从人眼视觉特性来看,HSI模型用色调、饱和度和亮度来描述彩色空间能更好地与人的视觉特性相匹配。


7. 图像分辨率

解析:

(1)图像空间分辨率:指的是图像中每单位长度所包含的像素数目,通常以像素/英寸(ppi)为单位来表示。

(2)图像灰度级分辨率:指的是图像中可分辨的灰度级数目。


8. 彩色图像与深度图像

解析:

(1)彩色图像中每一像素点的值由三部分组成,分别代表着对应方向上物体表面色彩中的红色、绿色和蓝色的量化数值大小。

(2)深度图像中每一像素点的值代表着对应方向上物体和摄像头之间的距离。


9. 彩色三维点云数据

解析:彩色三维点云数据的每个点都包含三维位置信息(XYZ)和该点的彩色信息(RGB),并且采用pcd格式存储三维相机获取的点云图像。根据需要可以实现彩色图像和深度图像之间的转换。


10. 光栅图像和立体图像

解析:

(1)光栅图像:光栅图也叫位图、点阵图、像素图,即最小单位由像素构成的图,只有点的信息,缩放时会失真。每个像素有自己的颜色,把它放很大后就会看到点变成小色块了。

(2)立体图像:立体图像利用人们两眼视觉差别和光学折射原理在一个平面内使人们可直接看到一幅三维立体图。


11. 对极几何和对极约束

解析:对极几何是研究立体视觉的重要数学工具。


12. 立体视觉 [4]

解析:立体视觉的基本原理是从两个(或多个)视点观察同一景物,以获取在不同视角下的感知图像,通过三角测量原理计算图像像素间的位置偏差(即视差)来获取景物的三维信息。一个完整的立体视觉系统通常可分为图像获取、摄像机标定、特征提取、立体匹配、深度确定及内插6个大部分。如下所示:

(1)图像获取:在获取立体图像时不但要满足应用要求,而且要考虑视点差异、光照条件、摄像机性能以及景物特点等因素的影响,以有利于立体视觉计算。

(2)摄像机标定:摄像机标定是为了确定摄像机的位置、属性参数和建立成像模型,以便确定空间坐标系中物体点同它在图像平面上像点之间的对应关系。摄象机标定方法可分为两大类,第一类是直接估计摄象机位置、光轴方向、焦距等参数;第二类是通过最小二乘法拟合,确定三维空间点映射为二维图象点的变换矩阵。

(3)特征提取:特征提取是为了得到匹配赖以进行的图像特征,由于目前尚没有一种普遍适用的理论可运用于图像特征的提取,从而导致了立体视觉研究中匹配特征的多样性。目前,常用的匹配特征主要有点状特征、线状特征和区域特征等。

(4)立体匹配:对于任何一种立体匹配方法,其有效性有赖于3个问题的解决:选择正确的匹配特征,寻找特征间的本质属性及建立能正确匹配所选特征的稳定算法。

(5)深度确定:已知立体成像模型和匹配视差后,三维距离的恢复是很容易的。影响距离测量精度的因素主要有摄象机标定误差、数字量化效应、特征检测与匹配定位精度等。

(6)内插:立体视觉的最终目的是为了恢复景物可视表面的完整信息。目前,无论是哪种匹配方法都不可能恢复出所有图象点的视差。对于一个完整的立视系统来讲,都必须进行最终的表面内插重建。


13. 光学概念

解析:

(1)发光强度(光强):光源在给定方向的单位立体角中发射的光通量。

(2)光通量:光源在单位时间内发射出的光量。

(3)亮度:指发光体(反光体)表面发光(反光)强弱的物理量。 

(4)照度:指物体被被照面单位时间内所接受的光通量。

(5)主观亮度:指由观察者判断出的亮度。

(6)光效:1W的能量能够转换成多少LM的光通量。

(7)色温:通过开尔文温度表示的黑体的温度来表示颜色。

(8)显色性:指在此光线下,能够现出被照射物体的原有颜色的性质。


14. 仿射变换与透视变换

解析:

(1)仿射变换:二维空间的变换,线性变换,已知3对坐标点就可以求得变换矩阵。

(2)透视变换:三维空间的变换,非线性变换,已知4对坐标点可以求得变换矩阵。


15. 监控摄像机镜头,可视距离和角度表关系


解析:

(1)标准镜头:视角30度左右,在1/2英寸CCD摄像机中,标准镜头焦距定为12mm,在1/3英寸CCD摄像机中,标准镜头焦距定为8mm。

(2)广角镜头:视角90度以上,焦距可小于几毫米,可提供较宽广的视景。

(3)远摄镜头:视角20度以内,焦距可达几米甚至几十米,此镜头可在远距离情况下将拍摄的物体影响放大,但使

观察范围变小。

说明:

(1)1英寸:靶面尺寸为宽12.7mm,高9.6mm,对角线16mm。 

(2)2/3英寸:靶面尺寸为宽8.8mm,高6.6mm,对角线11mm。 

(3)1/2英寸:靶面尺寸为宽6.4mm,高4.8mm,对角线8mm。 

(4)1/3英寸:靶面尺寸为宽4.8mm,高3.6mm,对角线6mm。 

(5)1/4英寸:靶面尺寸为宽3.2mm,高2.4mm,对角线4mm。 


16. 角点

解析:通常角点是指二维图像亮度变化剧烈的点或图像边缘曲线上曲率极大值的点。目前的角点检测算法可归纳为3类:基于灰度图像的角点检测、基于二值图像的角点检测、基于轮廓曲线的角点检测。角点在三维场景重建、运动估计、目标跟踪、目标识别、图像配准与匹配等计算机视觉领域起着非常重要的作用。


17. 图像分辨率与图像数组

解析:假设图像分辨率为2592*1936,那么x=2592,y=1936,然而图像数组中,row=1936,column=2592。


18. scipy.signal.convolve [5][6]

解析:为了减少FFT所截取的数据段前后的跳变,可以对数据先乘以一个窗函数,使得其前后数据能平滑过渡。窗函数都在scipy.signal库中定义,常用的窗函数是hann窗函数。


19. cv2.HoughCircles

解析:cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) → circles:Finds circles in a grayscale image using the Hough transform.

(1)dp:如果设置dp为1,那么累加器和输入图像分辨率相同;如果设置为2,那么累加器是输入图像分辨率的一半。并且dp的值不能小于1。

(2)minDist:霍夫变换检测到圆的圆心之间的最小距离。

(3)param1:Canny边缘检测算子的高阈值,而低阈值为高阈值的一半。

(4)param2:累加器阈值。越小会检测到很多不存在的圆,而越大检测到的圆就更加接近圆形。

(5)minRadius:圆半径的最小值。

(6)maxRadius:圆半径的最大值。


20.特征提取,特征检测

解析:

(1)特征提取:特征提取三大法宝:方向梯度直方图(Histogram of Oriented Gradient, HOG),局部二值模式(Local Binary Pattern, LBP),Haar特征(边缘特征、线性特征、中心特征和对角线特征,组合成特征模板)。

(2)特征检测:图像特征一般分为三大类:点特征,线特征,区域特征。其中,点特征中最重要的是角点,线特征中最重要的是边缘,区域特征是现在图形特征研究的热点。找到图像特征的技术被称为特征检测。


21. cv2.cornerHarris

解析:cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]]) → dst:Harris edge detector.

(1)blockSize:Harris角点检测中的邻域大小。

(2)ksize:Sobel中的窗口大小。

(3)k:Harris角点检测中的自由参数。


22. cv2.cornerSubPix

解析:cv2.cornerSubPix(image, corners, winSize, zeroZone, criteria) → None:Refines the corner locations. 首先找到Harris角点,然后将角点的重心传给该函数进行修正。

(1)winSize:Half of the side length of the search window. For example, if winSize=Size(5,5), then a search window is used.
(2)zeroZone:Half of the size of the dead region in the middle of the search zone over which the summation in the formula below is not done. It is used sometimes to avoid possible singularities of the autocorrelation matrix. The value of (-1,-1) indicates that there is no such a size. [没有看懂]


23. 图像二值化

解析:图像的二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值。比较常用的二值化方法有:双峰法、P参数法、迭代法和OTSU法等。


24. 仿射变换

解析:在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建这个矩阵我们需要从原图像中找到三个点以及它们在输出图像中的位置。然后cv2.getAffineTransform会创建一个2x3的矩阵,最后这个矩阵会被传给函数cv2.warpAffine。如下所示:

import cv2import numpy as npfrom matplotlib import pyplot as pltimg=cv2.imread('drawing.png')rows,cols,ch=img.shapepts1=np.float32([[50,50],[200,50],[50,200]])pts2=np.float32([[10,100],[200,50],[100,250]])M=cv2.getAffineTransform(pts1,pts2)dst=cv2.warpAffine(img,M,(cols,rows))plt.subplot(121,plt.imshow(img),plt.title('Input'))plt.subplot(121,plt.imshow(img),plt.title('Output'))plt.show()


25. 透视变换

解析:对于透视变换,需要一个3x3变换矩阵。在变换前后直线还是直线。要构建这个变换矩阵,需要在输入图像上找4个点,以及它们在输出图像上对应的位置。这四个点中的任意三个都不能共线。这个变换矩阵可以由函数cv2.getPerspectiveTransform()构建。然后把这个矩阵传给函数cv2.warpPerspective。如下所示:

import cv2import numpy as npfrom matplotlib import pyplot as pltimg=cv2.imread('sudokusmall.png')rows,cols,ch=img.shapepts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])M=cv2.getPerspectiveTransform(pts1,pts2)dst=cv2.warpPerspective(img,M,(300,300))plt.subplot(121,plt.imshow(img),plt.title('Input'))plt.subplot(121,plt.imshow(img),plt.title('Output'))plt.show()


参考文献:

[1] Camera Calibration and 3D Reconstruction:http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#camera-calibration-and-3d-reconstruction

[2] Rapid Object Detection using a Boosted Cascade of Simple Features:http://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf

[3] 变焦与对焦的区别:https://zhidao.baidu.com/question/175504893632415884.html

[4] 立体视觉研究的现状与进展:http://www.cnki.net/KCMS/detail/detail.aspx?QueryID=0&CurRec=1&recid=&filename=ZGTB701.004&dbname=CJFD9697&dbcode=CJFQ&pr=&urlid=&yx=&v=MjkxNzZGNTRPZmdnNXpoQVU0amg0T1g2VHJIMDNlYk9TUkx1ZVlPZHVGeW5tVXc9PVB5cmZiTFM0SDgvTXI0c3E=

[5] scipy.signal.convolve:https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve.html

[6] 频域信号处理:http://old.sebug.net/paper/books/scipydoc/frequency_process.html

1 0
原创粉丝点击