openCV常用方法

您所在的位置:网站首页 几何纠正常用的方法是 openCV常用方法

openCV常用方法

2024-07-14 19:59| 来源: 网络整理| 查看: 265

cv.warpAffine 和 cv.warpPerspective OpenCV 中用于图像几何变换的两个重要函数。

cv.warpAffine 用于对二维图像进行仿射变换(文末详细介绍仿射变换)。它接受输入图像和一个仿射变换矩阵,并输出经过仿射变换后的图像。仿射变换是一种线性变换,包括平移、旋转、缩放和剪切。它可以用来实现平移、旋转、缩放图像等操作。

cv.warpPerspective 用于执行透视变换(文末详细介绍透视变换),将图像投影到一个新的视角。它接受输入图像和一个透视变换矩阵,并输出经过透视变换后的图像。透视变换可以用于将一个平面上的图像投影到另一个平面,比如校正图像中的透视畸变,或者在计算机视觉中进行场景重建。

这两个方法所接受的参数,和默认参数相似。下面只介绍cv.warpAffine,另一个将不在赘述

缩放

缩放只是调整图像的大小。为此,OpenCV带有一个函数cv.resize()。图像的大小可以手动指定,也可以指定缩放比例。也可使用不同的插值方法。

当调用 cv.resize() 方法时,您需要提供以下几个参数:

src:这是输入图像。dsize:这是一个元组,指定调整后的目标图像大小。可以是 (width, height) 形式的元组。fx:这是水平方向上的缩放比例。fy:这是垂直方向上的缩放比例。interpolation:这是插值方法,它确定在调整图像大小时如何对像素进行插值。常见的插值方法包括最近邻插值、双线性插值和双三次插值。 import numpy as np import cv2 as cv img = cv.imread('messi5.jpg') res = cv.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC) #或者 height, width = img.shape[:2] res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC) 插值方式

在 OpenCV 中,cv.resize() 方法中的 interpolation 参数可以设置为以下选项之一:

cv.INTER_NEAREST:最近邻插值方法。它选择最接近的像素值作为调整后像素的值。这种方法简单快速,但可能会导致图像质量下降。

cv.INTER_LINEAR:双线性插值方法。它基于最近的 2x2 邻居像素来计算新像素的值。这种方法比最近邻插值更精确,但可能会导致图像细节的一些损失。

cv.INTER_CUBIC:双三次插值方法。它基于最近的 4x4 邻居像素来计算新像素的值。这种方法比双线性插值更精确,可以产生更平滑的调整图像,但也需要更多的计算资源。

cv.INTER_AREA:区域插值方法。它适用于缩小图像的情况,使用像素区域的关系来计算新像素值。这种方法对于缩小图像并保持细节很有用。

cv.INTER_LANCZOS4:Lanczos 插值方法。它基于 Lanczos 滤波器来计算新像素值,能够产生高质量的调整图像,但也需要更多的计算资源。

平移

在进行图像处理时,如果需要对图像进行平移,可以使用仿射变换矩阵来实现。具体而言,如果您知道需要在水平方向上平移 t_x 个单位,在垂直方向上平移 t_y 个单位,那么您可以创建一个如下形式的转换矩阵 

您可以将这个转换矩阵放入一个 np.float32 类型的 NumPy 数组中,然后将其作为参数传递给 cv.warpAffine 函数,以便对图像进行相应的平移操作。例如要将图片偏移为(100, 50)

import numpy as np import cv2 as cv img = cv.imread('messi5.jpg',0) rows,cols = img.shape M = np.float32([[1,0,100],[0,1,50]]) dst = cv.warpAffine(img,M,(cols,rows)) cv.imshow('img',dst) cv.waitKey(0) cv.destroyAllWindows()

cv.warpAffine 方法用于对二维图像进行仿射变换。它需要以下参数:

src:输入图像。M:2x3 的变换矩阵,数据类型为 np.float32。dsize:输出图像的大小。flags:用于指定插值方法的附加标志,通常使用默认值 cv.INTER_LINEAR。borderMode:用于指定边界填充模式的附加标志,通常使用默认值 cv.BORDER_CONSTANT。borderValue:如果选择了 cv.BORDER_CONSTANT 模式,则可以指定边界填充的像素值。 参数borderMode详解

在 OpenCV 中,cv.warpAffine 方法中的 borderMode 参数可以设置为以下选项之一:

cv.BORDER_CONSTANT:表示用常数填充边界,可以通过 borderValue 参数指定填充的像素值。cv.BORDER_REPLICATE:表示通过复制边界像素的方式填充边界。cv.BORDER_REFLECT:表示通过镜像反射的方式填充边界。cv.BORDER_REFLECT_101:表示通过镜像反射的方式填充边界,但排除了边界像素本身。cv.BORDER_WRAP:表示通过环绕方式填充边界。

根据特定的需求和应用场景,可以选择不同的 borderMode 参数以获得所需的边界处理效果。

在图像处理和计算机视觉应用中,需要对图片进行填充边界的情况包括但不限于以下几种:

仿射变换和透视变换: 在对图像进行仿射变换或透视变换时,由于变换导致原始图像的部分区域被移出边界,因此需要通过填充边界的方式确保变换后的图像完整。

图像拼接: 当进行多幅图像的拼接时,由于不同图像可能存在畸变、旋转或缩放等差异,因此需要对边界进行填充以使不同图像能够无缝拼接。

卷积运算: 在进行图像卷积运算时,卷积核可能会超出图像边界,此时可以通过填充边界的方式避免计算错误。

图像增强: 在一些图像增强操作中,可能需要对图像边界进行填充以确保特定处理操作的正确性和稳定性。

填充边界的功能可以在处理图像时保持图像的完整性和连续性,避免由于边界缺失而引起的异常情况。根据具体的图像处理任务和要求,选择合适的填充方式可以提高处理的准确性和稳定性。

borderValue使用详解

如上面介绍,在设置borderMode为cv.BORDER_CONSTANT 模式时可以用常数表达。例如

import cv2 import numpy as np # 读取输入图像 img = cv2.imread('input.jpg') # 定义变换矩阵 M = np.float32([[1, 0, 100], [0, 1, 50]]) # 在x和y方向上分别平移100和50个单位 # 获取输入图像的行数和列数 rows, cols = img.shape[:2] # 填充边界颜色为黑色 border_img_black = cv2.warpAffine(img, M, (cols, rows), borderMode=cv2.BORDER_CONSTANT, borderValue=(0, 0, 0)) # 填充边界颜色为红色 border_img_red = cv2.warpAffine(img, M, (cols, rows), borderMode=cv2.BORDER_CONSTANT, borderValue=(0, 0, 255)) # 填充边界颜色为绿色 border_img_green = cv2.warpAffine(img, M, (cols, rows), borderMode=cv2.BORDER_CONSTANT, borderValue=(0, 255, 0)) # 填充边界颜色为蓝色 border_img_blue = cv2.warpAffine(img, M, (cols, rows), borderMode=cv2.BORDER_CONSTANT, borderValue=(255, 0, 0)) # 显示输出图像 cv2.imshow('Black Border', border_img_black) cv2.imshow('Red Border', border_img_red) cv2.imshow('Green Border', border_img_green) cv2.imshow('Blue Border', border_img_blue) cv2.waitKey(0) cv2.destroyAllWindows() 旋转

cv.getRotationMatrix2D方法 是 OpenCV 中用于获取旋转变换矩阵的函数。这个函数可以根据指定的旋转角度、旋转中心点和缩放因子计算出旋转变换所需的 2x3 变换矩阵。

具体来说,cv.getRotationMatrix2D 函数接受以下参数:

旋转中心点:这是旋转操作的中心点坐标。旋转角度:这是要应用的旋转角度。缩放因子:这是可选参数,用于指定是否在旋转时进行缩放操作

注意:该方法返回值是一个变换矩阵,记得变换矩阵要在cv.warpAffine 方法中作为M参数传入。

img = cv.imread('messi5.jpg',0) rows,cols = img.shape # cols-1 和 rows-1 是坐标限制 M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1) dst = cv.warpAffine(img,M,(cols,rows)) 仿射变换

在仿射变换中,原始图像中的所有平行线在输出图像中仍将平行。为了找到变换矩阵,我们需要输入图像中的三个点及其在输出图像中的对应位置。然后cv.getAffineTransform将创建一个2x3矩阵,该矩阵将传递给cv.warpAffine。

img = cv.imread('drawing.png') rows,cols,ch = img.shape pts1 = np.float32([[50,50],[200,50],[50,200]]) pts2 = np.float32([[10,100],[200,50],[100,250]]) M = cv.getAffineTransform(pts1,pts2) dst = cv.warpAffine(img,M,(cols,rows)) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output')

在二维空间中,仿射变换可以表示为一个 2x3 的矩阵,它可以描述平移、旋转、缩放和剪切操作。仿射变换的基本形式是:

其中 (x, y) 是原始点的坐标,(x', y') 是变换后点的坐标,矩阵中的参数 a, b, c, d, e, f 控制了平移、旋转、缩放和剪切的效果。

在三维空间中,仿射变换可以表示为一个 3x4 的矩阵,它可以描述三维空间中的平移、旋转、缩放和剪切操作。仿射变换的基本形式是:

其中 (x, y, z) 是原始点的坐标,(x', y', z') 是变换后点的坐标,矩阵中的参数 a, b, c, d, e, f, g, h, i, j, k, l 控制了平移、旋转、缩放和剪切的效果。

仿射变换应用场景

仿射变换在图像处理和计算机视觉领域具有广泛的应用,其中一些主要的应用场景包括:

1. **图像校正和矫正:** 仿射变换可用于校正图像中的旋转、缩放和平移等几何变换,以确保图像中的物体保持正确的尺度和比例关系。

2. **图像配准和对齐:** 仿射变换可用于对不同图像之间的特征点进行配准和对齐,从而实现图像的对齐和拼接,用于图像融合和特征匹配等应用。

3. **图像扭曲和变形:** 仿射变换可用于对图像进行扭曲和变形操作,以实现图像的特殊效果和艺术处理,包括图像的弯曲、拉伸和形变等操作。

4. **平面标定和测量:** 仿射变换可用于对平面图像进行标定和测量,从而实现图像中物体的几何测量和尺寸估计,用于实现图像的几何分析和测量。

5. **图像纠偏和校准:** 仿射变换可用于对图像中的透视失真进行纠正和校准,从而实现图像中物体的几何纠正和透视校准,用于实现图像的透视纠正和视觉校准。

通过应用仿射变换,可以实现对图像和场景的几何校正、图像对齐和特征匹配等操作,从而提高图像处理和计算机视觉应用的准确性和稳定性。

透视变换

对于透视变换,您需要3x3变换矩阵。即使在转换后,直线也将保持直线。要找到此变换矩阵,您需要在输入图像上有4个点,在输出图像上需要相应的点。在这四个点中,其中三个不应共线。然后可以通过函数cv.getPerspectiveTransform找到变换矩阵。然后将cv.warpPerspective应用于此3x3转换矩阵。

img = cv.imread('sudoku.png') rows,cols,ch = img.shape pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]]) pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]]) M = cv.getPerspectiveTransform(pts1,pts2) dst = cv.warpPerspective(img,M,(300,300)) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output') plt.show()

透视变换 具体的操作可以看这个链接。

透视变换应用场景

透视变换在计算机视觉和图形处理中有许多实际的应用场景,其中一些主要的应用包括:

1. **文档扫描和校正:** 透视变换可用于对扫描的文档图像进行校正,使得文档上的文字和图像保持水平和垂直对齐,从而提高识别和处理的准确性。

2. **图像矫正和校准:** 透视变换可用于校正图像中的透视失真,例如建筑物外观的摄影图像中的透视畸变,从而实现图像的几何校正和视觉修复。

3. **虚拟现实和增强现实:** 透视变换可用于将虚拟对象或增强现实元素准确投影到真实世界场景中,以实现虚拟现实应用和增强现实效果的展示。

4. **摄像头校准和视角修正:** 透视变换可用于对摄像头采集的图像进行校准和视角修正,以确保图像中的物体保持准确的尺度和比例关系。

5. **三维重建和立体视觉:** 透视变换可用于将三维场景中的物体投影到二维平面上,以便进行三维重建和立体视觉分析,从而实现深度感知和空间重建。

通过应用透视变换,可以实现对图像和场景的几何矫正、透视纠正和三维重建等操作,从而提高图像处理和计算机视觉应用的准确性和稳定性。

总结

仿射变换主要用于改变图像中对象的相对位置、尺寸和角度,包括平移、旋转、缩放和剪切等操作,但不会改变图像中物体的透视关系。

透视变换则主要用于改变图像的观测角度和透视关系,可以使得图像中的物体在不同的视角下呈现出不同的形状和位置,模拟真实世界中的视觉投影效果。

在图像处理和计算机视觉中,仿射变换主要用于图像的几何校正和对齐,以及物体的尺度调整和几何变换。而透视变换则主要用于图像的透视纠正、场景重建和视角调整,以模拟真实世界中的视觉观测效果。两者在应用场景和目的上有所不同,但都是图像处理和计算机视觉中重要的几何变换操作。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3