目录
一、效果图展示
![](https://i-blog.csdnimg.cn/blog_migrate/058067baf321b6ed42fba28d5f3bca39.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/b502b85a0d9a9b7ab2cbf47e9b081c9a.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/45125600b03311217eedf7b3b868878c.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/dba530d8f19707e34b5e5852cf5a12b7.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/9ca35be6c410378688dc86c323e14cb7.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/b9cf62ee8377bb5662706c4a5e5a3e98.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/18716d95d0f01858fb5ec127b57389de.jpeg)
二、均值滤波
均值滤波是计算机视觉和图像处理中常用的一种平滑滤波方法。它的原理是用像素周围邻域内像素值的平均值来代替该像素原始的像素值,从而达到降噪和平滑图像的效果。
在均值滤波中,对于图像中的每一个像素,会取周围邻域内像素值的平均值来作为该像素的新值。这个邻域的大小可以根据具体需求而定,通常是一个固定大小的矩形或者正方形区域。在实际处理中,取邻域的大小会影响到平滑的程度,较大的邻域可以更有效地平滑图像,但也可能导致图像细节的丢失。
均值滤波的步骤很简单:
- 定义滤波器的大小和形状。
- 对于图像中的每一个像素,取其周围邻域内像素值的平均值。
- 将平均值作为该像素的新值。
均值滤波常用于去除图像中的噪声,例如椒盐噪声(随机黑白像素点)或高斯噪声(高斯分布的噪声),以改善图像质量。然而,它也可能会导致图像边缘变得模糊,因为它对整个邻域内的像素进行了平均,无法保留图像的细节信息。
三、高斯滤波
高斯滤波是一种常用的图像处理技术,用于去除图像中的噪声和平滑图像。与均值滤波类似,高斯滤波也是一种线性平滑滤波方法,但它使用了不同权重的高斯函数来进行滤波处理。
高斯滤波的原理是利用高斯函数生成一个权重矩阵作为滤波器,在图像的每个像素点上应用这个滤波器,用周围像素的加权平均值来代替该像素的原始值。不同于均值滤波的等权重邻域,高斯滤波使用高斯分布的权重,使得离中心像素越远的像素在平均计算中起到的作用更小。
高斯滤波的步骤如下:
- 定义高斯核(滤波器)的大小和标准差。
- 根据高斯函数的公式计算出滤波器中各个位置的权重值。
- 将权重值应用到图像的对应像素周围的邻域内,并计算加权平均值,得到该像素的新值。
高斯滤波相对于均值滤波的优势在于能更好地保留图像的细节信息,因为它在计算平均值时更加关注中心像素周围的像素。这种加权的方式能够在平滑图像的同时尽量减少对图像细节的破坏。
四、二值化图像
二值化是图像处理中常用的一种方法,它将图像的像素值转换为两个可能的取值之一,通常是 0 和 255(或 0 和 1),即将图像转换成只有两个灰度级别的图像。这种处理方式能够突出图像的特定特征,例如边缘、轮廓或者特定目标。
二值化的实现方法有很多种,其中最简单的是全局阈值法。全局阈值法通过选择一个阈值,然后将图像中的像素值与这个阈值进行比较,大于阈值的像素设置为一个值(比如255),小于等于阈值的像素设置为另一个值(比如0),从而将图像转换为只有两个值的二值图像。
除了全局阈值法,还有自适应阈值法,它根据像素周围的局部信息来确定阈值。自适应阈值法可以应对光照不均匀或者背景复杂的图像情况,因为它能够根据局部情况动态地调整阈值。
五、Sobel边缘检测
Sobel 边缘检测是一种经典的图像处理技术,用于检测图像中的边缘。它利用了图像的灰度值在边缘处发生突变的特性,通过计算图像中每个像素点的梯度来寻找边缘的位置和方向。
Sobel 算子是一种基于卷积运算的方法,通过卷积一个小的滤波器矩阵来计算图像的梯度。Sobel 算子分别对图像进行水平和垂直方向的梯度计算,通常使用下面两个 3x3 的卷积核(滤波器矩阵):
# 水平方向梯度计算
[ -1 0 1 ]
[ -2 0 2 ]
[ -1 0 1 ]
# 垂直方向梯度计算
[ 1 2 1 ]
[ 0 0 0 ]
[ -1 -2 -1 ]
Sobel 算子将这两个卷积核分别应用于图像的每个像素,分别计算水平和垂直方向上的梯度。然后可以通过以下步骤得到边缘强度和方向:
- 对图像进行灰度化处理(将彩色图像转换为灰度图)。
- 将水平和垂直方向的 Sobel 算子分别应用于灰度图像。
- 计算每个像素点的梯度幅值和方向。梯度幅值表示边缘的强度,方向表示边缘的方向。
梯度幅值较大的像素通常被认为是边缘点,因为它们对应着图像中像素值变化较大的地方。通过设定合适的阈值,可以将边缘和非边缘区域分开,得到二值化的边缘图像。
Sobel 边缘检测是一种简单而有效的方法,常用于计算机视觉和图像处理中的边缘检测任务,如物体检测、图像分割以及特征提取等。然而,它也可能对噪声敏感,边缘检测结果可能会受到图像噪声的影响。
六、Canny边缘检测
Canny 边缘检测是一种经典且广泛应用的图像处理技术,被认为是边缘检测方法中的一种最优方法之一。由 John F. Canny 在 1986 年提出,它在检测图像边缘时具有高效性和精确性,并且能够有效地抑制噪声。
Canny 边缘检测的步骤包括:
-
高斯滤波:首先对图像进行高斯滤波,以降低图像的噪声。高斯滤波能够平滑图像并减少噪声对边缘检测的影响。
-
计算梯度:利用 Sobel 算子或其他梯度计算方法,对经过高斯滤波的图像进行梯度计算,得到图像中每个像素点的梯度幅值和方向。
-
非极大值抑制:在梯度图上,对每个像素点进行非极大值抑制,保留局部梯度幅值最大的点,这样可以获得更细化的边缘。
-
双阈值检测:使用两个阈值来检测边缘,分为高阈值和低阈值。如果像素的梯度值超过高阈值,则被认为是强边缘;如果梯度值在低阈值和高阈值之间,则被认为是弱边缘;低于低阈值的像素则被认为不是边缘。
-
边缘跟踪:对弱边缘进行边缘跟踪,将其与强边缘连接起来形成完整的边缘。这一步通过检查弱边缘像素是否与强边缘像素相邻来实现。
Canny 边缘检测方法因其对噪声的抑制、准确性和高效性而被广泛应用于图像处理、计算机视觉和图像分析领域。它能够较好地定位图像中的边缘,同时抑制噪声,并且生成细化、连续的边缘轮廓。然而,选择合适的阈值对最终的边缘检测结果至关重要,且算法中包含一些需要调整的参数,因此在实际应用中可能需要一些参数优化和调节。
七、代码
import cv2 as cv
# 读取图像
img = './img.jpg'
# 转为灰度图并保存
out_path0 = './gray.jpg'
gray_img = cv.imread(img, cv.IMREAD_GRAYSCALE)
cv.imwrite(out_path0, gray_img)
# 均值滤波
out_path1 = './blurred.jpg'
kernel_size1 = (5, 5) # 滤波器大小
blurred_image = cv.blur(gray_img, kernel_size1)
cv.imwrite(out_path1, blurred_image)
# 高斯滤波
out_path2 = './gs_blurred.jpg'
kernel_size2 = (5, 5) # 滤波器大小
sigma_x = 0 # X方向的高斯核标准差,若为0,根据kernel_size自动计算
gs_blurred_image = cv.GaussianBlur(gray_img, kernel_size2, sigma_x)
cv.imwrite(out_path2, gs_blurred_image)
# 二值化
out_path3 = './binary_img.jpg'
threshold_value = 128 # 替换为你想要的阈值
max_value = 255 # 输出像素的最大值
# 对图像进行二值化处理
_, binary_image = cv.threshold(gray_img, threshold_value, max_value, cv.THRESH_BINARY)
cv.imwrite(out_path3, binary_image)
# Sobel
out_path4 = './sobel.jpg'
# 计算Sobel卷积结果
x = cv.Sobel(gray_img, cv.CV_16S, 1, 0)
y = cv.Sobel(gray_img, cv.CV_16S, 0, 1)
# 转换数据并合成
Scale_absX = cv.convertScaleAbs(x) # 格式转换函数
Scale_absY = cv.convertScaleAbs(y)
sobel_result = cv.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0) # 图像混合
cv.imwrite(out_path4, sobel_result)
# canny边缘检测
out_path5 = './canny.jpg'
# 高斯滤波 sigma大,检测“大尺度”边缘,小则检测精细边缘
blurred = cv.GaussianBlur(gray_img, (5, 5), 0)
threshold1 = 50
threshold2 = 150
canny_edges = cv.Canny(blurred, threshold1, threshold2)
cv.imwrite(out_path5, canny_edges)