opencv图像滤波
开源计算机视觉库(OpenCV)是一个广泛使用的计算机视觉库,它提供了许多图像处理和计算机视觉算法。在 OpenCV 中,滤波是图像处理中的一个重要概念,它可以用来改变图像的外观、增强图像的特征、去除噪声等。在本文中,我们将介绍一些常见的图像滤波算法,并给出相应的 OpenCV 代码示例。 ## 1. 中值滤波 中值滤波是一种常用的图像平滑滤波器,它用来去除图像中的噪声和不必要的细节。中值滤波器通常采用邻域平均值作为滤波器值,即将图像上的每个像素替换为相邻像素的中值。 下面是使用 OpenCV 实现中值滤波的 Python 代码: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg') # 计算图像尺寸 height, width = img.shape[:2] # 创建中值滤波器 kernel = np.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]]) # 应用中值滤波器 blurred_img = cv2.filter2D(img, -1, kernel) # 显示图像 cv2.imshow('Original Image', img) cv2.imshow('Blurred Image', blurred_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们首先使用 OpenCV 的 `imread` 函数读取一张图片,然后使用 `shape` 函数获取图片的尺寸。接着,我们创建一个 3x3 的中值滤波器,并将其存储在 NumPy 的 `kernel` 数组中。最后,我们使用 OpenCV 的 `filter2D` 函数来应用中值滤波器,并将结果存储在 `blurred_img` 变量中。最后,我们使用 OpenCV 的 `imshow` 函数来显示原始图像和模糊图像,并使用 `waitKey` 函数等待用户按下任意键后关闭窗口。 ## 2. 均值滤波 均值滤波是一种常用的图像平滑滤波器,它用来去除图像中的噪声和不必要的细节。均值滤波器通常采用邻域平均值作为滤波器值,即将图像上的每个像素替换为相邻像素的平均值。 下面是使用 OpenCV 实现均值滤波的 Python 代码: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg') # 计算图像尺寸 height, width = img.shape[:2] # 创建均值滤波器 kernel = np.array([[-1, -1, -1], [-1, 1, -1], [-1, -1, -1]]) # 应用均值滤波器 blurred_img = cv2.filter2D(img, -1, kernel) # 显示图像 cv2.imshow('Original Image', img) cv2.imshow('Blurred Image', blurred_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们首先使用 OpenCV 的 `imread` 函数读取一张图片,然后使用 `shape` 函数获取图片的尺寸。接着,我们创建一个 3x3 的均值滤波器,并将其存储在 NumPy 的 `kernel` 数组中。最后,我们使用 OpenCV 的 `filter2D` 函数来应用均值滤波器,并将结果存储在 `blurred_img` 变量中。最后,我们使用 OpenCV 的 `imshow` 函数来显示原始图像和模糊图像,并使用 `waitKey` 函数等待用户按下任意键后关闭窗口。 ## 3. 高斯滤波 高斯滤波是一种常用的图像平滑滤波器,它用来去除图像中的噪声和不必要的细节。高斯滤波器通常采用高斯函数作为滤波器函数,即将图像上的每个像素替换为高斯函数的值。 下面是使用 OpenCV 实现高斯滤波的 Python 代码: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg') # 计算图像尺寸 计算图像尺寸 height, width = img.shape[:2] # 创建高斯滤波器 kernel = np.array([[-1, -1, -1], [-1, 2, -1], [-1, -1, -1]]) # 应用高斯滤波器 blurred_img = cv2.filter2D(img, -1, kernel) # 显示图像 cv2.imshow('Original Image', img) cv2.imshow('Blurred Image', blurred_img) cv2.waitKey(0) cv2.destroyAllWindows() 在上面的代码中,我们首先使用 OpenCV 的 `imread` 函数读取一张图片,然后使用 `shape` 函数获取图片的尺寸。接着,我们创建一个 3x3 的高斯滤波器,并将其存储在 NumPy 的 `kernel` 数组中。最后,我们使用 OpenCV 的 `filter2D` 函数来应用高斯滤波器,并将结果存储在 `blurred_img` 变量中。最后,我们使用 OpenCV 的 `imshow` 函数来显示原始图像和模糊图像,并使用 `waitKey` 函数等待用户按下任意键后关闭窗口。 ## 4. 边缘检测 边缘检测是一种常用的图像处理技术,它用来检测图像中的边缘。在 OpenCV 中,我们可以使用 Canny 算子来实现边缘检测。Canny 算子是一种广泛使用的边缘检测算法,它采用高斯滤波、Sobel 算子和非极大值抑制等步骤来提取边缘。 下面是使用 OpenCV 实现 Canny 边缘检测的 Python 代码: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg') # 计算图像尺寸 height, width = img.shape[:2] # 创建 Canny 算子 kernel = np.array([[-1, -1, -1], [-1, 1, -1], [-1, -1, -1]]) # 应用 Canny 算子 edges = cv2.Canny(img, 100, 200) # 显示图像 cv2.imshow('Original Image', img) cv2.imshow('Edges', edges) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们首先使用 OpenCV 的 `imread` 函数读取一张图片,然后使用 `shape` 函数获取图片的尺寸。接着,我们创建一个 3x3 的 Canny 算子,并将其存储在 NumPy 的 `kernel` 数组中。最后,我们使用 OpenCV 的 `Canny` 函数来应用 Canny 算子,并将结果存储在 `edges` 变量中。最后,我们使用 OpenCV 的 `imshow` 函数来显示原始图像和边缘,并使用 `waitKey` 函数等待用户按下任意键后关闭窗口。 ## 5. 轮廓提取 轮廓提取是一种常用的图像处理技术,它用来提取图像中的轮廓。在 OpenCV 中,我们可以使用 Sobel 算子来实现轮廓提取。Sobel 算子是一种广泛使用的边缘检测算法,它采用高斯滤波、Sobel 算子和非极大值抑制等步骤来提取边缘。 下面是使用 OpenCV 实现 Sobel 轮廓提取的 Python 代码: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg') # 计算图像尺寸 height, width = img.shape[:2] # 创建 Sobel 算子 kernel = np.array([[-1, -1, -1], [0, 1, 0], [-1, -1, -1]]) # 应用 Sobel 算子 edges = cv2.Sobel(img, 100, 200) # 显示图像 cv2.imshow('Original Image', img) cv2.imshow('Edges', edges) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们首先使用 OpenCV 的 `imread` 函数读取一张图片,然后使用 `shape` 函数获取图片的尺寸。接着,我们创建一个 3x3 的 Sobel 算子,并将其存储在 NumPy 的 `kernel` 数组中。最后,我们使用 OpenCV 的 `Sobel` 函数来应用 Sobel 算子,并将结果存储在 `edges` 变量中。最后,我们使用 OpenCV 的 `imshow` 函数来显示原始图像和边缘,并使用 `waitKey` 函数等待用户按下任意键后关闭窗口。