Sobel 算子函数
功能: Sobel 算子用于计算图像的梯度(变化率),常用于边缘检测。它通过对图像应用一个基于一阶导数的滤波器来强调图像中的边缘部分,特别是水平和垂直方向上的边缘。通过计算图像的梯度,可以获得图像中亮度变化较大的地方,这些地方通常是物体的边界。
Sobel 算子有两个方向的变体:
- Sobel X:计算水平方向的梯度。
- Sobel Y:计算垂直方向的梯度。
Sobel 算子函数:cv2.Sobel()
函数原型
cv2.Sobel(src, ddepth, dx, dy, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
参数:
-
src (
InputArray
):- 输入图像,必须是灰度图像(单通道),通常是
uint8
或float32
类型。
- 输入图像,必须是灰度图像(单通道),通常是
-
ddepth (
int
):- 输出图像的深度(数据类型)。通常选择:
cv2.CV_8U
:8位无符号整数(用于图像显示)。cv2.CV_32F
:32位浮动点(用于更高精度的计算)。cv2.CV_64F
:64位浮动点(高精度计算)。
- 输出图像的深度(数据类型)。通常选择:
-
dx (
int
):- x方向的导数阶数。
dx=1
表示计算水平方向的梯度,dx=0
表示不计算水平方向的导数。
-
dy (
int
):- y方向的导数阶数。
dy=1
表示计算垂直方向的梯度,dy=0
表示不计算垂直方向的导数。
返回值:
- 返回与输入图像大小相同的图像,表示计算得到的梯度图。其每个像素值代表在该位置的梯度强度。
import cv2
img = cv2.imread("shudu.png")
img_sobel = cv2.Sobel(img, -1, 0,1, ksize=3)
img_sobel2 = cv2.Sobel(img, -1, 1,0, ksize=3)
cv2.imshow("img", img)
cv2.imshow("img_sobel", img_sobel)
cv2.imshow("img_sobel2", img_sobel2)
cv2.waitKey(0)
Laplacian 算子函数
功能: Laplacian 算子用于图像的二阶导数处理,能够检测图像中的边缘和细节,尤其是图像亮度变化非常显著的地方。它是基于图像的二阶导数,能够揭示图像中变化急剧的区域(例如,边缘和纹理)。
与 Sobel 算子主要处理图像一阶导数的不同,Laplacian 算子通过计算图像的二阶导数来增强边缘信息,特别适用于检测图像中亮度变化较大的部分。
Laplacian 算子可以用来:
- 检测边缘:通过高亮变化剧烈的区域(边缘)来找到图像的结构。
- 增强细节:增强图像中的细节部分,尤其是图像对比度较低的地方。
- 图像预处理:通常用于后续的图像分析,如分割、特征提取等。
Laplacian 算子函数:cv2.Laplacian()
函数原型
cv2.Laplacian(src, ddepth, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
参数:
-
src (
InputArray
):- 输入图像,必须是灰度图像(单通道),通常是
uint8
或float32
类型。彩色图像需要先转换为灰度图像。
- 输入图像,必须是灰度图像(单通道),通常是
-
ddepth (
int
):- 输出图像的深度(数据类型)。常用的选项包括:
cv2.CV_8U
:8位无符号整数(用于图像显示)。cv2.CV_32F
:32位浮动点(用于精确计算)。cv2.CV_64F
:64位浮动点(用于高精度计算)。
- 输出图像的深度(数据类型)。常用的选项包括:
-
ksize (
int
, 可选):- 卷积核的大小。常用值为 1、3、5、7 等,默认是 3。较大的核大小可以捕捉到更大的变化,但可能导致图像模糊。
返回值:
- 返回与输入图像大小相同的图像,表示图像的 Laplacian 变换结果。输出图像反映了图像的二阶导数信息,边缘部分的像素值较大,而平坦区域的像素值较小。
import cv2
img = cv2.imread("shudu.png")
img_lap = cv2.Laplacian(img, -1, ksize=3)
cv2.imshow("img", img)
cv2.imshow("img_lap", img_lap)
cv2.waitKey(0)
Canny 算子函数
功能: Canny 算子是图像处理中经典的边缘检测算法,由 John F. Canny 于1986年提出。它基于多阶段的处理流程,旨在通过检测图像中亮度急剧变化的区域来提取边缘。Canny 算子通常用于:
- 提取图像中的边缘。
- 去除噪声并减少误检。
- 提高图像分析和识别的准确性。
Canny 算子包括以下主要步骤:
- 高斯滤波:使用高斯滤波器对图像进行平滑处理,去除噪声。
- 梯度计算:计算图像在水平方向(X)和垂直方向(Y)的梯度,通常使用 Sobel 算子。
- 非极大值抑制(NMS):在梯度图像中找到边缘,并通过抑制非边缘点来细化边缘。
- 双阈值检测:根据设定的低阈值和高阈值对梯度值进行分类,确定边缘的强度。
- 边缘连接:使用边缘连接算法,确保边缘被正确地连接起来。
Canny 算子函数:cv2.Canny()
函数原型
cv2.Canny(image, threshold1, threshold2, edges=None, apertureSize=3, L2gradient=False)
参数:
-
image (
InputArray
):- 输入图像,必须是灰度图像。若输入为彩色图像,函数会自动转换为灰度图像。
-
threshold1 (
int
):- 低阈值。图像中的梯度值低于该值的像素点将被认为不是边缘。用于初步筛选边缘像素。
-
threshold2 (
int
):- 高阈值。图像中的梯度值高于该值的像素点将被认为是边缘。用于确定强边缘像素。
返回值:
- 返回一个二值图像,表示图像中的边缘。边缘的像素值为 255(白色),非边缘的像素值为 0(黑色)。边缘图像与输入图像具有相同的大小。
import cv2
img = cv2.imread("flower.png")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度化
_, img_bin = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) # 二值化
img_blur = cv2.GaussianBlur(img_bin, (3, 3), 3) # 高斯模糊
img_canny = cv2.Canny(img_blur, 30, 70) # 边缘检测
cv2.imshow("img", img)
cv2.imshow("img_canny", img_canny)
cv2.waitKey(0)
findContours
函数 和 drawContours
函数
findcontours()
功能: cv2.findContours()
函数是 OpenCV 中用于图像轮廓检测的函数,它可以检测图像中的轮廓(即边界或物体的外形)。通过该函数,可以将图像中的物体或结构提取为一系列的轮廓,通常用于图像分析、形状识别、图像分割等任务。
轮廓是指图像中像素的边界,在二值化图像中,通常白色区域的边界就是轮廓。该函数可以帮助识别这些边界,进而提取对象的形状或进行进一步处理。
findContours
函数:cv2.findContours()
函数原型
cv2.findContours(image, mode, method, contours=None, hierarchy=None)
参数:
-
image (
InputArray
):- 输入图像,必须是二值化图像(黑白图像),可以是
uint8
类型。轮廓检测通常在二值图像中进行,通常首先使用阈值化或边缘检测(如 Canny)方法将图像转换为二值图像。
- 输入图像,必须是二值化图像(黑白图像),可以是
-
mode (
int
):- 轮廓的检索模式。决定了如何存储轮廓信息。常用的模式有:
cv2.RETR_EXTERNAL
:仅检索最外层的轮廓,不考虑内嵌的轮廓。cv2.RETR_LIST
:检索所有轮廓,并将它们放在列表中(不建立层级关系)。cv2.RETR_TREE
:检索所有轮廓,并建立轮廓的层级关系(即父子关系)。cv2.RETR_CCOMP
:检索所有轮廓,返回双层结构(外轮廓与内轮廓)。cv2.RETR_FLOODFILL
:检索所有轮廓,并支持 Flood Fill(洪水填充)结构。
- 轮廓的检索模式。决定了如何存储轮廓信息。常用的模式有:
-
method (
int
):- 轮廓的近似方法。决定如何近似轮廓的形状。常用方法有:
cv2.CHAIN_APPROX_SIMPLE
:存储轮廓的端点,减少存储点的数量。适用于大多数应用。cv2.CHAIN_APPROX_NONE
:保存轮廓的所有点(无压缩),适用于需要所有点的应用。
- 轮廓的近似方法。决定如何近似轮廓的形状。常用方法有:
返回值:
cv2.findContours()
返回一个包含两个或三个元素的元组:
- contours:
- 检测到的轮廓列表。每个轮廓是一个由轮廓点构成的数组,表示轮廓的形状。
- hierarchy(可选):
- 轮廓的层级结构信息,表示轮廓之间的嵌套关系。通常是一个
numpy
数组,包含每个轮廓的父子层级、同级关系等。
- 轮廓的层级结构信息,表示轮廓之间的嵌套关系。通常是一个
drawContours()
功能: cv2.drawContours()
函数用于在图像上绘制轮廓。它可以根据提取到的轮廓信息,将轮廓绘制到图像上,通常用于视觉展示或进一步分析。此函数可以绘制一个或多个轮廓,支持自定义颜色、线条厚度、轮廓层级等。
drawContours
函数:cv2.drawContours()
函数原型
cv2.drawContours(image, contours, contourIdx, color, thickness, lineType=cv2.LINE_8, hierarchy=None, maxLevel=0, offset=(0, 0))
参数:
-
image (
InputOutputArray
):- 输入图像,可以是彩色图像(例如:BGR图像)或灰度图像。该图像会在绘制轮廓的基础上进行修改,因此如果不希望修改原图,建议先复制图像。
-
contours (
list
):- 轮廓的列表,每个轮廓是一个包含多个点的数组。轮廓是由
cv2.findContours()
函数提取的,可以是一个或多个轮廓。每个轮廓是一个包含边界点(如[[x1, y1], [x2, y2], ...]
)的 NumPy 数组。
- 轮廓的列表,每个轮廓是一个包含多个点的数组。轮廓是由
-
contourIdx (
int
):- 需要绘制的轮廓索引。如果为 -1,表示绘制所有的轮廓。如果要绘制特定轮廓,只需指定其索引值(例如
0
表示第一个轮廓,1
表示第二个轮廓等)。
- 需要绘制的轮廓索引。如果为 -1,表示绘制所有的轮廓。如果要绘制特定轮廓,只需指定其索引值(例如
-
color (
Scalar
):- 轮廓的颜色。可以是一个三元组(如
BGR
或RGB
)。例如,(0, 255, 0)
表示绿色(BGR格式),(255, 0, 0)
表示蓝色。颜色值可以是整型或浮点型。
- 轮廓的颜色。可以是一个三元组(如
-
thickness (
int
):- 轮廓的线条厚度。正整数表示线条宽度,
-1
表示填充轮廓区域。如果是负值,轮廓区域会被填充(例如:-1
表示填充整个轮廓)
- 轮廓的线条厚度。正整数表示线条宽度,
返回值:
- 此函数没有返回值,它直接修改传入的图像(即在图像上绘制轮廓)。因此,绘制轮廓后,通常会显示或保存修改后的图像。
import cv2
img = cv2.imread('../12.13/outline.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度化
ret,img_binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) #二值化
contour,hierarchy = cv2.findContours(img_binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) #轮廓检测
img_copy=img.copy() #复制图像
img_draw =cv2.drawContours(img_copy,contour,-1,(0,0,255),3) #绘制轮廓
cv2.imshow('img_draw',img_draw)
cv2.imshow('img',img)
cv2.waitKey(0)
透视变换函数:cv2.getPerspectiveTransform()
和 cv2.warpPerspective()
在计算机视觉中,透视变换(Perspective Transformation)用于将图像从一个视角变换到另一个视角。它广泛应用于图像矫正、图像配准、图像拼接等任务。
OpenCV 提供了两个主要函数用于透视变换:
cv2.getPerspectiveTransform()
:计算透视变换矩阵。cv2.warpPerspective()
:应用透视变换矩阵对图像进行变换。
1. cv2.getPerspectiveTransform()
函数
功能:
cv2.getPerspectiveTransform()
函数用于计算透视变换矩阵,该矩阵可以将图像中的四个点映射到目标图像中的四个点。它通过原图中的四个点和目标图中的四个点来计算变换矩阵。
函数原型
cv2.getPerspectiveTransform(src, dst)
参数:
- src (
numpy.ndarray
):- 原始图像中的四个点坐标,通常是一个形状为
(4, 2)
的数组,表示图像中四个点的坐标。格式为[x1, y1], [x2, y2], [x3, y3], [x4, y4]
,通常是一个矩形或四边形的四个顶点。
- 原始图像中的四个点坐标,通常是一个形状为
- dst (
numpy.ndarray
):- 目标图像中的四个点坐标,表示变换后图像中四个点的坐标。同样是一个形状为
(4, 2)
的数组。
- 目标图像中的四个点坐标,表示变换后图像中四个点的坐标。同样是一个形状为
返回值:
- M (
numpy.ndarray
):- 透视变换矩阵,是一个 3x3 的矩阵,用于将原始图像的四个点映射到目标图像的四个点。
应用:
cv2.getPerspectiveTransform()
用于计算从一个视角到另一个视角的透视变换矩阵。常用于图像矫正、变换、拼接等任务。
2. cv2.warpPerspective()
函数
功能:
cv2.warpPerspective()
函数使用 cv2.getPerspectiveTransform()
计算出的透视变换矩阵来实际执行图像的透视变换。它将图像的像素根据透视矩阵进行重新映射,得到变换后的图像。
函数原型
cv2.warpPerspective(src, M, dsize)
参数:
-
src (
numpy.ndarray
):- 输入图像,即要进行透视变换的原始图像。
-
M (
numpy.ndarray
):- 透视变换矩阵,通常通过
cv2.getPerspectiveTransform()
计算得到。
- 透视变换矩阵,通常通过
-
dsize (
tuple
):- 输出图像的大小,指定变换后图像的宽和高。通常是
(width, height)
。
- 输出图像的大小,指定变换后图像的宽和高。通常是
返回值:
- dst (
numpy.ndarray
):- 变换后的图像。输出图像的尺寸由
dsize
参数指定,并且图像的内容会根据透视变换矩阵进行重新映射。
- 变换后的图像。输出图像的尺寸由
应用:
cv2.warpPerspective()
用于对图像应用透视变换,常见的应用包括图像的视角变换、平面图形的变换(如棋盘格角度调整)、透视校正等
import cv2
import numpy as np
img = cv2.imread('./youhua.png')
points1 = np.float32([[175,142],[621,35],[89,491],[652,546]])
points2 = np.float32([[min(points1[:,0]),min(points1[:,1])],
[max(points1[:,0]),min(points1[:,1])],
[min(points1[:,0]),max(points1[:,1])],
[max(points1[:,0]),max(points1[:,1])]
])
M = cv2.getPerspectiveTransform(points1,points2)
img_output = cv2.warpPerspective(img,M,(img.shape[1],img.shape[0]))
cv2.imshow('img',img)
cv2.imshow('img_output',img_output)
cv2.waitKey(0)