openCV中如何实现滤波
图像滤波用于去除噪声和图像平滑,OpenCV 提供了多种滤波器:
1.1. 均值滤波:
import cv2# 读取图像
image = cv2.imread("example.jpg")# 均值滤波
blurred_image = cv2.blur(image, (5, 5)) # (5, 5) 是滤波核的大小
滤波核大小的影响:
- 滤波核需要设定为奇数,确保有中心点
- 滤波核变大
-
- 平滑效果增强:更大的滤波核会考虑更多的邻域像素,从而导致更强的平滑效果。图像中的噪声和高频信息(如边缘、纹理)会被更有效地去除,图像整体看起来更加模糊。
- 计算时间增加:滤波核越大,需要处理的像素数量越多,计算时间也会相应增加。
- 细节丢失增加:较大的滤波核可能会导致图像细节(如物体的边缘和纹理)的丢失。这是因为在计算均值时,更多的像素被考虑进去,而这些像素可能包含图像中的关键细节。
- 滤波核变小
-
- 平滑效果减弱:较小的滤波核只能覆盖较小的邻域像素,因此平滑效果相对较弱。图像中的噪声和高频信息可能无法被完全去除,但图像的细节能够得到更好的保留。
- 计算时间减少:较小的滤波核需要处理的像素数量较少,计算时间也会相应减少。
- 细节保留更好:较小的滤波核能够更好地保留图像中的细节,因为只有较少的像素被用于计算均值,从而避免了过度平滑导致的细节丢失。
- 总结:如果需要移除大量噪声并获得更平滑的图像,可以使用较大的滤波核。如果需要保留更多细节并稍微减少噪声,则应选择较小的滤波核。
#函数:对比均值滤波不同滤波核结果
@staticmethod
def TestBlur():image=cv2.imread("Fu.jpg")# image=cvTest.add_salt_and_pepper_noise(cv2.imread("Cat.jpg"))blurred_3x3=cv2.blur(image,(3,3))blurred_5x5=cv2.blur(image,(5,5))blurred_7x7=cv2.blur(image,(7,7))# 显示结果plt.figure(figsize=(12, 6))plt.subplot(221), plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)), plt.title('Original Image')plt.xticks([]), plt.yticks([])plt.subplot(222), plt.imshow(cv2.cvtColor(blurred_3x3, cv2.COLOR_BGR2RGB)), plt.title('Blur 3x3')plt.xticks([]), plt.yticks([])plt.subplot(223), plt.imshow(cv2.cvtColor(blurred_5x5, cv2.COLOR_BGR2RGB)), plt.title('Blur 5x5')plt.xticks([]), plt.yticks([])plt.subplot(224), plt.imshow(cv2.cvtColor(blurred_7x7, cv2.COLOR_BGR2RGB)), plt.title('Blur 7x7')plt.xticks([]), plt.yticks([])plt.show()

1.2. 中值滤波
# 中值滤波
median_filtered = cv2.medianBlur(image, 5) # 5 是滤波核的大小
滤波核大小的影响:
- 滤波核变大
-
- 去噪能力增强:较大的滤波核能够覆盖更多的像素,因此能更好地去除图像中的噪声,特别是对于那些孤立的噪声点(如椒盐噪声)。例如,使用
ksize=5的滤波核可以更有效地去除椒盐噪声。 - 计算时间增加:随着滤波核的增大,需要排序的像素数量增多,计算时间也会相应增加。
- 细节丢失增加:较大的滤波核可能会导致图像细节的丢失,因为排序后取中值的过程会使图像的某些边缘或纹理变得模糊。例如,对于图像中的细小文字或线条,使用较大的滤波核可能会使这些细节变得不清晰。
- 去噪能力增强:较大的滤波核能够覆盖更多的像素,因此能更好地去除图像中的噪声,特别是对于那些孤立的噪声点(如椒盐噪声)。例如,使用
- 滤波核变小
-
- 去噪能力减弱:较小的滤波核只能覆盖较少的像素,因此对噪声的去除效果相对较弱。例如,使用
ksize=3的滤波核对于去除大量的椒盐噪声可能效果不佳。 - 计算时间减少:较小的滤波核需要处理的像素数量较少,因此计算时间会相应减少。
- 细节保留更好:较小的滤波核能够更好地保留图像中的细节,因为排序后取中值的过程对像素值的影响较小。例如,对于图像中的边缘和纹理,使用较小的滤波核可以更好地保留它们。
- 去噪能力减弱:较小的滤波核只能覆盖较少的像素,因此对噪声的去除效果相对较弱。例如,使用
总结:
- 滤波核变大:去噪能力增强,计算时间增加,细节丢失增加。
- 滤波核变小:去噪能力减弱,计算时间减少,细节保留更好。
#模拟椒盐噪声
@staticmethod
def add_salt_and_pepper_noise(image, salt_prob=0.02, pepper_prob=0.02):noisy_image = np.copy(image)total_pixels = image.size# 计算盐和胡椒的数量num_salt = np.ceil(salt_prob * total_pixels)num_pepper = np.ceil(pepper_prob * total_pixels)# 添加盐噪声for _ in range(int(num_salt)):x_coord = np.random.randint(0, image.shape[1])y_coord = np.random.randint(0, image.shape[0])noisy_image[y_coord, x_coord] = 255# 添加胡椒噪声for _ in range(int(num_pepper)):x_coord = np.random.randint(0, image.shape[1])y_coord = np.random.randint(0, image.shape[0])noisy_image[y_coord, x_coord] = 0return noisy_image#函数:对比 中值滤波不同核去噪效果
@staticmethod
def TestMedioBlur():#读取图像image = cv2.imread("Cat.jpg")# 添加椒盐噪声noisy_image = cvTest.add_salt_and_pepper_noise(image) # 假设已添加椒盐噪声的图像# 应用不同大小的中值滤波filtered_3 = cv2.medianBlur(noisy_image, 3)filtered_5 = cv2.medianBlur(noisy_image, 5)filtered_7 = cv2.medianBlur(noisy_image, 7)# 显示结果plt.figure(figsize=(12, 6))plt.subplot(221), plt.imshow(cv2.cvtColor(noisy_image, cv2.COLOR_BGR2RGB)), plt.title('Noisy Image')plt.xticks([]), plt.yticks([])plt.subplot(222), plt.imshow(cv2.cvtColor(filtered_3, cv2.COLOR_BGR2RGB)), plt.title('Median Filter 3x3')plt.xticks([]), plt.yticks([])plt.subplot(223), plt.imshow(cv2.cvtColor(filtered_5, cv2.COLOR_BGR2RGB)), plt.title('Median Filter 5x5')plt.xticks([]), plt.yticks([])plt.subplot(224), plt.imshow(cv2.cvtColor(filtered_7, cv2.COLOR_BGR2RGB)), plt.title('Median Filter 7x7')plt.xticks([]), plt.yticks([])plt.show()

1.3. 高斯滤波
# 高斯滤波
gaussian_filtered = cv2.GaussianBlur(image, (5, 5), 0) # (5, 5) 是滤波核的大小,0 是标准差
函数参数:
cv2.GaussianBlur(image, ksize, sigmaX, sigmaY=0, borderType=BORDER_DEFAULT) 是 OpenCV 中用于高斯滤波的函数。其参数如下:
image:输入图像。ksize:滤波核的大小,为(width, height)格式的元组,必须是正奇数(如(5, 5))。表示滤波窗口的宽度和高度。sigmaX:X 方向的标准差,控制高斯核在水平方向上的平滑程度。如果设置为 0,则会根据ksize自动计算。sigmaY:Y 方向的标准差,控制高斯核在垂直方向上的平滑程度。如果设置为 0,则会使用与sigmaX相同的值。borderType:边界处理方式,默认为BORDER_DEFAULT,表示使用默认的边界处理方法。
工作原理:
高斯滤波是一种基于高斯函数的平滑滤波技术,用于去除图像中的噪声。其基本思想是:
- 对于图像中的每一个像素,考虑以其为中心的一个
ksize × ksize的邻域。 - 使用高斯函数计算该邻域内每个像素的权重,权重值随着距离中心像素的距离增加而减小。
- 将邻域内所有像素的加权平均值作为该像素的新值。
高斯函数的公式为: G(x,y)=2πσ21e−2σ2x2+y2 其中,σ 是标准差,控制高斯核的宽度。
滤波核大小的影响:
- 滤波核变大
-
- 平滑效果增强:较大的滤波核会覆盖更多的像素,因此能更有效地去除图像中的噪声,特别是高频噪声(如高斯噪声)。图像会变得更加平滑,但边缘和细节可能会变得模糊。例如,使用
ksize=(11, 11)的滤波核可以显著减少噪声,但图像的细节会丢失较多。 - 计算时间增加:随着滤波核的增大,需要处理的像素数量增多,计算时间也会相应增加。
- 细节丢失增加:较大的滤波核可能会导致图像细节的丢失,因为高斯核的权重分布使得远离中心的像素对结果的影响减小,从而导致图像的边缘和纹理变得模糊。
- 平滑效果增强:较大的滤波核会覆盖更多的像素,因此能更有效地去除图像中的噪声,特别是高频噪声(如高斯噪声)。图像会变得更加平滑,但边缘和细节可能会变得模糊。例如,使用
- 滤波核变小
-
- 平滑效果减弱:较小的滤波核只能覆盖较少的像素,因此对噪声的去除效果相对较弱。图像中的高频噪声可能无法被完全去除,但图像的细节能够得到更好的保留。例如,使用
ksize=(3, 3)的滤波核可以轻微减少噪声,同时保留较多的图像细节。 - 计算时间减少:较小的滤波核需要处理的像素数量较少,因此计算时间会相应减少。
- 细节保留更好:较小的滤波核能够更好地保留图像中的细节,因为高斯核的权重分布使得邻域内的像素对结果的影响较大,从而避免了过度平滑导致的细节丢失。
- 平滑效果减弱:较小的滤波核只能覆盖较少的像素,因此对噪声的去除效果相对较弱。图像中的高频噪声可能无法被完全去除,但图像的细节能够得到更好的保留。例如,使用
标准差的影响:
sigmaX和sigmaY变大
-
- 平滑效果增强:较大的标准差会使高斯核的权重分布更加平缓,从而导致更强的平滑效果。图像中的噪声会被更有效地去除,但图像的细节和边缘可能会变得更加模糊。例如,使用
sigmaX=10和sigmaY=10会显著平滑图像,但可能会导致图像的边缘和纹理变得不清晰。 - 计算时间增加:较大的标准差会增加高斯核的计算复杂度,从而导致计算时间增加。
- 平滑效果增强:较大的标准差会使高斯核的权重分布更加平缓,从而导致更强的平滑效果。图像中的噪声会被更有效地去除,但图像的细节和边缘可能会变得更加模糊。例如,使用
sigmaX和sigmaY变小
-
- 平滑效果减弱:较小的标准差会使高斯核的权重分布更加集中,从而导致较弱的平滑效果。图像中的噪声可能无法被完全去除,但图像的细节能够得到更好的保留。例如,使用
sigmaX=1和sigmaY=1可以轻微减少噪声,同时保留较多的图像细节。 - 计算时间减少:较小的标准差会减少高斯核的计算复杂度,从而导致计算时间减少。
- 平滑效果减弱:较小的标准差会使高斯核的权重分布更加集中,从而导致较弱的平滑效果。图像中的噪声可能无法被完全去除,但图像的细节能够得到更好的保留。例如,使用
def add_gaussian_noise(image, mean=0, sigma=25):"""添加高斯噪声到图像。参数:image: 输入图像 (灰度或彩色)mean: 高斯噪声的均值,默认为0sigma: 高斯噪声的标准差,默认为25返回:noisy_image: 添加了高斯噪声后的图像"""# Ensure the image is in float32 format and normalized to [0, 1]if len(image.shape) == 2:row, col = image.shapech = 1img = image.astype(np.float32) / 255.0else:row, col, ch = image.shapeimg = image.astype(np.float32) / 255.0# Generate Gaussian noisegauss = np.random.normal(mean, sigma / 255.0, (row, col, ch))gauss = gauss.reshape(row, col, ch)# Add the Gaussian noise to the imagenoisy_image = img + gauss# Clip the values to stay within [0, 1] range and convert back to uint8noisy_image = np.clip(noisy_image, 0, 1)noisy_image = (noisy_image * 255).astype(np.uint8)return noisy_image@staticmethod
def TestGauss():# 读取图像image = cv2.imread("Cat.jpg")# 添加高斯噪声noisy_image = cvTest.add_gaussian_noise(image)# 应用不同大小的高斯滤波filtered_3 = cv2.GaussianBlur(noisy_image, (3, 3), 1)filtered_5 = cv2.GaussianBlur(noisy_image, (5, 5), 2)filtered_11 = cv2.GaussianBlur(noisy_image, (11, 11), 5)# 显示结果plt.figure(figsize=(12, 6))plt.subplot(221), plt.imshow(cv2.cvtColor(noisy_image, cv2.COLOR_BGR2RGB)), plt.title('Noisy Image')plt.xticks([]), plt.yticks([])plt.subplot(222), plt.imshow(cv2.cvtColor(filtered_3, cv2.COLOR_BGR2RGB)), plt.title('Gaussian Filter 3x3')plt.xticks([]), plt.yticks([])plt.subplot(223), plt.imshow(cv2.cvtColor(filtered_5, cv2.COLOR_BGR2RGB)), plt.title('Gaussian Filter 5x5')plt.xticks([]), plt.yticks([])plt.subplot(224), plt.imshow(cv2.cvtColor(filtered_11, cv2.COLOR_BGR2RGB)), plt.title('Gaussian Filter 11x11')plt.xticks([]), plt.yticks([])plt.show()

总结:
- 滤波核变大:平滑效果增强,计算时间增加,细节丢失增加。
- 滤波核变小:平滑效果减弱,计算时间减少,细节保留更好。
- 标准差变大:平滑效果增强,计算时间增加,细节丢失增加。
- 标准差变小:平滑效果减弱,计算时间减少,细节保留更好。
1.4. 双边滤波
# 双边滤波
bilateral_filtered = cv2.bilateralFilter(image, 9, 75, 75) # 9 是滤波核的大小,75 是色彩空间的标准差,75 是坐标空间的标准差
函数参数:
cv2.bilateralFilter(image, d, sigmaColor, sigmaSpace, borderType=BORDER_DEFAULT) 是 OpenCV 中用于双边滤波的函数。其参数如下:
image:输入图像。d:滤波器的直径,表示滤波窗口的大小。必须是正奇数(如 5、9、15 等)。如果设置为负值,则会根据sigmaSpace自动计算。sigmaColor:颜色空间的标准差,控制像素值相似度的影响范围。值越大,颜色相似的像素对滤波结果的影响越大。sigmaSpace:坐标空间的标准差,控制像素空间距离的影响范围。值越大,空间距离较远的像素对滤波结果的影响越大。borderType:边界处理方式,默认为BORDER_DEFAULT,表示使用默认的边界处理方法。
工作原理:
双边滤波是一种非线性的滤波方法,结合了图像的空间邻近度和像素值相似度,达到保边去噪的目的。其基本思想是:
- 对于图像中的每一个像素,考虑以其为中心的一个
d × d的邻域。 - 使用两个高斯函数计算该邻域内每个像素的权重:
-
- 空间域高斯函数:权重随着距离中心像素的空间距离增加而减小。
- 值域高斯函数:权重随着像素值与中心像素值的差值增加而减小。
- 将邻域内所有像素的加权平均值作为该像素的新值。
由于其内部仍然使用了高斯滤波,所以d的影响与sigma的影响与高斯滤波的相同,总结如下:
- 滤波核变大:平滑效果增强,计算时间增加,细节丢失增加。
- 滤波核变小:平滑效果减弱,计算时间减少,细节保留更好。
sigmaColor变大:颜色相似度影响增强,平滑效果增强,细节丢失增加。sigmaColor变小:颜色相似度影响减弱,平滑效果减弱,细节保留更好。sigmaSpace变大:空间距离影响增强,平滑效果增强,细节丢失增加。sigmaSpace变小:空间距离影响减弱,平滑效果减弱,细节保留更好。
对比代码如下:
@staticmethoddef TestBilateralFilter():# 读取图像image = cv2.imread("Cat.jpg")# 添加高斯噪声noisy_image = cvTest.add_gaussian_noise(image) # 假设已添加高斯噪声的图像# 应用不同参数的双边滤波filtered_5 = cv2.bilateralFilter(noisy_image, 5, 50, 50)filtered_9 = cv2.bilateralFilter(noisy_image, 9, 100, 100)filtered_15 = cv2.bilateralFilter(noisy_image, 15, 150, 150)# 显示结果plt.figure(figsize=(12, 6))plt.subplot(221), plt.imshow(cv2.cvtColor(noisy_image, cv2.COLOR_BGR2RGB)), plt.title('Noisy Image')plt.xticks([]), plt.yticks([])plt.subplot(222), plt.imshow(cv2.cvtColor(filtered_5, cv2.COLOR_BGR2RGB)), plt.title('Bilateral Filter 5')plt.xticks([]), plt.yticks([])plt.subplot(223), plt.imshow(cv2.cvtColor(filtered_9, cv2.COLOR_BGR2RGB)), plt.title('Bilateral Filter 9')plt.xticks([]), plt.yticks([])plt.subplot(224), plt.imshow(cv2.cvtColor(filtered_15, cv2.COLOR_BGR2RGB)), plt.title('Bilateral Filter 15')plt.xticks([]), plt.yticks([])plt.show()

1.5. 高通滤波
1.5.1. OpenCV中的实现有三种方式:
- Sobel 算子:用于计算图像的梯度,实现高通滤波。使用函数
cv2.Sobel()。 - Laplacian 算子:用于检测图像中的二阶导数,实现高通滤波。使用函数
cv2.Laplacian()。 - 自定义高通滤波器:通过定义自定义的卷积核,使用函数
cv2.filter2D()实现高通滤波。
Sobel 算子
- Sobel 算子是一种用于计算图像梯度的微分算子。它通过计算图像在水平和垂直方向上的梯度来实现高通滤波。
- 其核心思想是利用卷积核与图像进行卷积运算,从而检测图像中的边缘和轮廓。
- Sobel 算子由两个方向的卷积核组成,分别用于检测水平和垂直方向的梯度。
- 边缘在梯度幅值较高的区域。
水平方向卷积核:

,
垂直方向卷积核:

作用:
- Sobel 算子主要用于边缘检测和图像增强。通过计算图像的梯度,可以突出图像中的边缘和轮廓,从而增强图像的细节。
实现方式:
使用函数 cv2.Sobel():
cv2.Sobel(src, # 输入图像ddepth, # 输出图像的深度,通常设置为 cv2.CV_64Fdx, # 表示对x方向求导dy, # 表示对y方向求导ksize=3, # 卷积核的大小,可以是 1、3、5 或 7scale=1, # 比例因子 求导结果放大缩小 X 法 增大>1 减少 <1delta=0, # 偏移量 求导结果整体+ -borderType=cv2.BORDER_DEFAULT # 边界扩展方式 定义图像边界的处理方式,以避免在卷积过程中超出图像范围。 一般默认即可
)
应用
- 边缘检测:结合水平和垂直方向的梯度,计算图像的梯度幅值和方向。
- 图像增强:通过增强图像的梯度,使边缘更加明显。
例子:
有一个圆形和方形,
- 分别使用sobel算子计算x方向与y方向的梯度
- 将结果(Numpy数组)转化为图片数据范围(Uint8)
- 通过结果可以很清晰的观察到sobel算子的功能
@staticmethoddef TestSobel():# 高通滤波(使用 Sobel 算子)image=cv2.imread("Cicle.jpg")gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)sobelx = cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=3) # x 方向sobely = cv2.Sobel(gray_image, cv2.CV_64F, 0, 1, ksize=3) # y 方向sobelx_img=cv2.convertScaleAbs(sobelx)sobely_img=cv2.convertScaleAbs(sobely)soble_combine=cv2.magnitude(sobelx,sobely)soble_combine=cv2.convertScaleAbs(soble_combine)# 显示结果plt.figure(figsize=(12, 6))plt.subplot(221), plt.imshow(cv2.cvtColor(gray_image, cv2.COLOR_BGR2RGB)), plt.title('Gray Image')plt.xticks([]), plt.yticks([])plt.subplot(222), plt.imshow(cv2.cvtColor(sobelx_img, cv2.COLOR_BGR2RGB)), plt.title('sobelx Image')plt.xticks([]), plt.yticks([])plt.subplot(223), plt.imshow(cv2.cvtColor(sobely_img, cv2.COLOR_BGR2RGB)), plt.title('sobely Image')plt.xticks([]), plt.yticks([])plt.subplot(224), plt.imshow(cv2.cvtColor(soble_combine, cv2.COLOR_BGR2RGB)), plt.title('soble_combine Image')plt.xticks([]), plt.yticks([])plt.show()
结果:

原理理解:
我们自定义一个3*3的图像(Numpy数组),我们分别计算出sobelx和sobely的结果并输出
@staticmethod
def LearnSobel():# 创建一个 3x3 的灰度图像gray_image = np.array([[100, 150, 200],[100, 150, 200],[100, 150, 200]], dtype=np.uint8)#查看其按照Sobel算子默认边界扩展类型扩展结果# border_image=cv2.copyMakeBorder(gray_image,1,1,1,1,cv2.BORDER_DEFAULT)# print("Border Image:")print(border_image)print("Original Image:")print(gray_image)# 使用 Sobel 算子计算 x 和 y 方向梯度sobelx = cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=3)sobely = cv2.Sobel(gray_image, cv2.CV_64F, 0, 1, ksize=3)# 打印结果print("\nSobel X Gradient:")print(sobelx)print("\nSobel Y Gradient:")print(sobely)
可以看到输出结果如下:
Original Image:
[[100 150 200][100 150 200][100 150 200]]Sobel X Gradient:
[[ 0. 400. 0.][ 0. 400. 0.][ 0. 400. 0.]]Sobel Y Gradient:
[[0. 0. 0.][0. 0. 0.][0. 0. 0.]]
Sobel默认卷积核为:
SobelX:
[[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]]
SobelY:
[[1, 2, 1],[0, 0, 0],[-1, -2, -1]]
中心像素点X方向梯度计算(使用Sobel算子):
以(2,2)的像素为例计算SobleX

- 逐行计算:
-
- 第一行:
(-100 + 0 + 200) = 100 - 第二行:
(-200 + 0 + 400) = 200 - 第三行:
(-100 + 0 + 200) = 100
- 第一行:
- 总和:
100 + 200 + 100 = 400,得到:

边缘像素点X方向梯度计算:
在cv2.sobel内部会先按照设定的borderType=cv2.BORDER_DEFAULT(最开始函数介绍已介绍),扩展函数,然后再以原图像像素为中心的3*3范围的数组与SobelX卷积核计算得出该像素的梯度值。
我们可以自己计算扩展函数看一下:
# 创建一个 3x3 的灰度图像gray_image = np.array([[100, 150, 200],[100, 150, 200],[100, 150, 200]], dtype=np.uint8)border_image=cv2.copyMakeBorder(gray_image,1,1,1,1,cv2.BORDER_DEFAULT)print("Border Image:")print(border_image)
输出结果为
Border Image:
[[150 100 150 200 150][150 100 150 200 150][150 100 150 200 150][150 100 150 200 150][150 100 150 200 150]]
这样计算原图像中(1,1)的像素的x方向的梯度则使用:

Laplacian 算子
原理
- Laplacian 算子是一种基于二阶导数的微分算子,用于检测图像中的突变。
- 它通过计算图像的二阶导数来实现高通滤波,能够有效地检测图像中的边缘和细节。
Laplacian 算子的卷积核通常为:

作用
- Laplacian 算子主要用于边缘检测和图像锐化。通过增强图像的二阶导数,可以突出图像中的边缘和轮廓,从而达到锐化图像的效果。
Laplacian 算子检测边缘的过程:
- 计算二阶导数:通过卷积运算将 Laplacian 卷积核与图像进行卷积,得到图像的二阶导数近似值。
- 检测零交叉点:在边缘附近,二阶导数通常会过零点。因此,可以通过检测 Laplacian 响应中的零交叉点来确定边缘的位置。
- 衡量边缘强度:Laplacian 响应的绝对值大小可以衡量边缘的强度。绝对值越大,说明边缘越明显。
实现方式:
使用函数 cv2.Laplacian():
cv2.Laplacian(src, # 输入图像ddepth, # 输出图像的深度,通常设置为 cv2.CV_64Fksize=1, # 卷积核的大小,可以是 1、3、5 或 7scale=1, # 比例因子delta=0, # 偏移量borderType=cv2.BORDER_DEFAULT # 边界扩展方式
)
应用:
- 边缘检测:通过检测图像的二阶导数来突出边缘。
- 图像锐化:增强图像的细节和清晰度。
示例代码:
@staticmethod
def TestLaplacian():image_gray=cv2.imread("Department.jfif",cv2.IMREAD_GRAYSCALE)gaussi_image_gray=cv2.GaussianBlur(image_gray,(3,3),0)#直接 laplacian 滤波 laplacianImage=cv2.Laplacian(image_gray,cv2.CV_64F)laplacianImage=cv2.convertScaleAbs(laplacianImage)#高斯滤波平滑处理后再laplacianImage_gaussi=cv2.Laplacian(image_gray,cv2.CV_64F)laplacianImage_gaussi=cv2.convertScaleAbs(laplacianImage_gaussi)plt.figure(figsize=(12,6))plt.subplot(131),plt.imshow(cv2.cvtColor(image_gray, cv2.COLOR_BGR2RGB)),plt.title("Original Image"),plt.xticks([]),plt.yticks([])plt.subplot(132),plt.imshow(cv2.cvtColor(laplacianImage,cv2.COLOR_BGR2RGB) ),plt.title("laplacian Image"),plt.xticks([]),plt.yticks([])plt.subplot(133),plt.imshow(cv2.cvtColor(laplacianImage_gaussi,cv2.COLOR_BGR2RGB) ),plt.title("laplacian Image_gaussi "),plt.xticks([]),plt.yticks([])plt.show()
不用照片的结果:


自定义高通滤波器
原理
- 自定义高通滤波器通过定义特定的卷积核来实现高通滤波。用户可以根据需求设计不同的卷积核,以达到不同的滤波效果。
- 卷积核的设计通常基于高斯函数或其他数学函数,以实现对特定频率的增强或抑制。
作用
- 自定义高通滤波器可用于实现特定的图像增强效果,如锐化、边缘检测和细节提取等。
实现方式
使用函数 cv2.filter2D():
cv2.filter2D(src, # 输入图像ddepth, # 输出图像的深度,通常设置为 cv2.CV_64Fkernel, # 自定义的卷积核borderType=cv2.BORDER_DEFAULT # 边界扩展方式
)
应用
- 锐化:通过设计增强高频分量的卷积核,实现图像的锐化效果。
- 边缘检测:通过设计检测特定方向边缘的卷积核,实现图像的边缘检测。
示例代码
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread("example.jpg", cv2.IMREAD_GRAYSCALE)# 定义自定义高通滤波器卷积核
kernel = np.array([[0, -1, 0],[-1, 5, -1],[0, -1, 0]
])# 应用高通滤波
high_pass_filtered = cv2.filter2D(image, -1, kernel)
1.5.2. 总结
- Sobel 算子:适用于边缘检测和图像增强,能够计算图像的梯度。
- Laplacian 算子:适用于边缘检测和图像锐化,能够检测图像的二阶导数。
- 自定义高通滤波器:具有高度的灵活性,可根据需求设计特定的滤波器,可以自己改卷积核,实现各种图像处理效果, 需要学习顶层算法原理。
1.6. 低通滤波
在openCV中,常见的低通滤波实现方式就是上述已说明的滤波:
- 均值滤波
- 中值滤波
- 高斯滤波
- 双边滤波
详见上述内容
相关文章:
openCV中如何实现滤波
图像滤波用于去除噪声和图像平滑,OpenCV 提供了多种滤波器: 1.1. 均值滤波: import cv2# 读取图像 image cv2.imread("example.jpg")# 均值滤波 blurred_image cv2.blur(image, (5, 5)) # (5, 5) 是滤波核的大小 滤波核大小的…...
清影2.0(AI视频生成)技术浅析(二):自然语言处理
清影2.0(AI视频生成)中的自然语言处理(NLP)技术是其核心组件之一,负责将用户输入的自然语言文本转化为机器可以理解的语义表示,从而指导后续的视频生成过程。 一、基本原理 1. 目标 清影2.0的NLP技术旨在将用户输入的自然语言文本转化为机器可以理解的语义表示,从而指…...
五十天精通硬件设计第32天-S参数
系列文章传送门 50天精通硬件设计第一天-总体规划-CSDN博客 目录 1. S参数基础 2. S参数在信号完整性中的作用 3. 单端 vs. 差分S参数 4. S参数的关键特性 5. S参数的获取与使用 6. S参数分析中的常见问题 7. 实际案例:PCIe通道分析 8. 工具推荐 总结 信号完整性中…...
AI在网络安全中的应用:构建智能防护体系
AI在网络安全中的应用:构建智能防护体系 大家好,我是你们熟悉的人工智能与Python领域自媒体创作者Echo_Wish。今天我们来聊聊如何用AI技术提升网络安全水平。随着互联网的发展和数字化转型,网络安全威胁日益增多,传统的安全防护手段已经难以应对复杂多变的网络攻击。AI技术…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十七节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(InputOutputControl_0x2F服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x2F服务、输入输出控制、ISO 14229-1:2023、ECU测试 一、服务功能概…...
2025 BabitMF 第一期开源有奖活动正式开启 !
为了促进开源社区的交流与成长,字节跳动开源的多媒体处理框架 BabitMF (GitHub - BabitMF/bmf: Cross-platform, customizable multimedia/video processing framework. With strong GPU acceleration, heterogeneous design, multi-language support, e…...
Docker 安装和配置 Nginx 详细图文教程
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …...
链表和list
链表和list 算法题中的经典操作:用空间代替时间 双链表头插顺序: 1.先修改新结点的左右指针 2.然后修改结点y的左指针 3.最后修改哨兵位的右指针 双链表在任意位置(p)之后插入…...
深度学习机器学习:常用激活函数(activation function)详解
目录 Sigmoid Function ReLU(Rectified Linear Unit) LeakyReLU(Leaky Rectified Linear Unit) ClippedReLU(Clipped Rectified Linear Unit) PRelu(Parametric ReLU) Tanh&am…...
AIGC图生视频保姆级教程
一、AI文生图高阶技巧 推荐工具 ▸ MidJourney(艺术感最强) ▸ DALLE 3(与ChatGPT深度联动) ▸ Leonardo.ai(精细化参数控制) 核心策略 提示词架构: [主体描述][环境氛围][镜头语言][风格参数…...
【对比】Pandas 和 Polars 的区别
Pandas vs Polars 对比表 特性PandasPolars开发语言Python(Cython 实现核心部分)Rust(高性能系统编程语言)性能较慢,尤其在大数据集上(内存占用高,计算效率低)极快,利用…...
C# 鼠标点击ToolStripStatuslabel 在线修改Text属性并存储加载显示Text属性
在实际项目中为方便了解视觉软件的使用性,可能需要添加一些小而稍微实用的功能:一个StipStatus控件上的Label按钮属性Text需要修改并保存,软件重启后能够自动加载修改后的属性名。 定义变量 public static string controlsText System.Windows.Forms.A…...
下载安装运行测试开源vision-language-action(VLA)模型OpenVLA
1. 安装 项目官网OpenVLA 首先按照官网提示的以下代码,执行创建环境->安装最小依赖->git克隆项目等 # Create and activate conda environment conda create -n openvla python3.10 -y conda activate openvla# Install PyTorch. Below is a sample comma…...
PyQt6/PySide6 的 SQL 数据库操作(QtSql)
一、核心组件架构 1.1 QtSql模块构成 QSqlDatabase:数据库连接管理(支持连接池)QSqlQuery:SQL语句执行与结果遍历QSqlTableModel:可编辑的表格数据模型QSqlQueryModel:只读查询结果模型QSqlRelationalTab…...
【Zookeeper如何实现分布式锁?】
Zookeeper如何实现分布式锁? 一、ZooKeeper分布式锁的实现原理二、ZooKeeper分布式锁的实现流程三、示例代码四、总结一、ZooKeeper分布式锁的实现原理 ZooKeeper是一个开源的分布式协调服务,它提供了一个分布式文件系统的接口,可以用来存储和管理分布式系统的配置信息。 …...
【MySQL】环境变量配置
环境变量英文名SystemRoot,直译为“系统总(根)目录",主要指明操作系统的重要目录在哪里。那么配置MySQL的环境变量,就是在程序运行时,告诉操作系统你的MySQL目录位置。 复制MySQL安装目录:…...
为AI聊天工具添加一个知识系统 之103 详细设计之44 自性三藏 之4 祖传代码 之2
本文要点 要点 前面的所有讨论都是为了给出我的设计项目(为使用AI聊天工具的聊天者 开挂一个知识系统) 的祖传代码 的完整设计,其中 的“槽”(占位符变量)的 库元(宝性和自性creator -本俱 替换内容标准模…...
什么是 近端策略优化算法PPO
什么是 近端策略优化算法PPO 近端策略优化算法(Proximal Policy Optimization,PPO)是OpenAI公司于2017年开发的一系列无模型强化学习算法,用于优化策略网络以最大化累计奖励。以下是具体介绍及示例: 算法原理 策略梯度:PPO基于策略梯度算法,通过估计策略网络的梯度来更…...
【Java】实现后端请求接口
【Java】实现后端请求接口 【一】使用 HttpURLConnection 实现四种请求方式的示例【1】Get请求【2】POST请求【3】PUT请求【4】DELETE 请求【5】汇总工具类,通过传参实现4种请求 【二】HttpClient 实现四种请求方式的示例【1】GET请求【2】POST 请求【3】PUT 请求【…...
假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?
前言:本篇文章解释了接口学习过程中的2个常见问题,一个是“为什么是类在使用接口”,另一个一个是“编程接口与物理接口的差异源于所处的抽象层次和交互模式的不同”,旨在揭示编程接口的本质。 Part1.是类在使用接口 当学习接口时…...
Node.js 中的 Event 模块详解
Node.js 中的 Event 模块是实现事件驱动编程的核心模块。它基于观察者模式,允许对象(称为“事件发射器”)发布事件,而其他对象(称为“事件监听器”)可以订阅并响应这些事件。这种模式非常适合处理异步操作和…...
C# 添加图标
一、前言 为应用程序添加图标是优化用户界面、提升应用辨识度的重要操作。合适的图标能帮助用户快速识别和区分不同应用,增强应用的易用性和专业性。 本指南旨在为你提供详细、易懂的步骤,教你如何为应用程序的窗体添加图标。从图标素材的获取到具体的…...
Docker 入门与实战:从安装到容器管理的完整指南
🚀 Docker 入门与实战:从安装到容器管理的完整指南 🌟 📖 简介 在现代软件开发中,容器化技术已经成为不可或缺的一部分。而 Docker 作为容器化领域的领头羊,以其轻量级、高效和跨平台的特性,深…...
4.【线性代数】——矩阵的LU分解
四 矩阵的LU分解 1. AB的逆矩阵2. 转置矩阵3. ALU3.1 2x2矩阵3.2 3x3矩阵3.3 nxn的矩阵分解的次数? 1. AB的逆矩阵 { ( A B ) ( B − 1 A − 1 ) I ( B − 1 A − 1 ) ( A B ) I ⇒ ( A B ) − 1 B − 1 A − 1 \begin{cases} (AB)(B^{-1}A^{-1}) I\\ (B^{-1}A^…...
ELK8.17部署(Ubantu24x64)
检查java环境 ELK8.x不支持java8 若无环境可执行 sudo apt install openjdk-17-jre-headless 准备安装包 官网下载地址: ELK products 搜Elasticsearch、Kibana、Logstash、Filebeat versions需一致,这里使用8.17.0 Elasticsearch Kibana Logstash Filebeat e…...
什么是算法的空间复杂度和时间复杂度,分别怎么衡量。
1. 时间复杂度 时间复杂度衡量的是算法运行时间与输入规模之间的关系。它通常用大O记号(Big O Notation)表示,例如 O(1)、O(n)、O(n2) 等。 衡量方法: 常数时间复杂度 O(1):无论输入规模如何,算法的执行时…...
HCIA项目实践---ACL访问控制列表相关知识和配置过程
十 ACL访问控制列表 1 策略的概念 在网络连通之后, 把所有为了追求控制而实现的技术都叫策略 2 访问控制 在路由器流量流入或者流出的接口上,匹配流量,执行相应的动作。(流量流入或者流出的接口并不是一个固定的概念而是一个相对的…...
细说STM32F407单片机RTC入侵检测和时间戳的原理及使用方法
目录 一、入侵检测的功能 二、示例功能 三、项目设置 1、晶振、DEBUG、CodeGenerator、USART6、KEYLED 2、RTC (1)设置RTC的模式。 (2)General、Time、Date\Wake Up分组 (3)Tamper分组 1ÿ…...
STM32 CAN过滤器配置和应用方法介绍
目录 概述 一、CAN过滤器核心概念 二、过滤器配置步骤(以标准ID为例) 三、不同模式的配置示例 四、高级配置技巧 五、调试与问题排查 六、关键计算公式 总结 概述 在STM32微控制器中,CAN过滤器可以配置为标识符屏蔽模式和标识符列表模…...
搜狗浏览器卸载教程
需求背景 今天发现geek居然无法卸载搜狗浏览器,作为一个老司机,这是不允许的。如果你使用geek或者windows的卸载,或者直接在它的安装包的Uninstall.exe中卸载,他走到100%就一直不动了。那玩意是假的。 卸载教程 结束 -----华丽的…...
