当前位置: 首页 > news >正文

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,表示使用默认的边界处理方法。

工作原理:

高斯滤波是一种基于高斯函数的平滑滤波技术,用于去除图像中的噪声。其基本思想是:

  1. 对于图像中的每一个像素,考虑以其为中心的一个 ksize × ksize 的邻域。
  2. 使用高斯函数计算该邻域内每个像素的权重,权重值随着距离中心像素的距离增加而减小
  3. 将邻域内所有像素的加权平均值作为该像素的新值。

高斯函数的公式为: G(x,y)=2πσ21e−2σ2x2+y2 其中,σ 是标准差,控制高斯核的宽度。

滤波核大小的影响:

  • 滤波核变大
    • 平滑效果增强:较大的滤波核会覆盖更多的像素,因此能更有效地去除图像中的噪声,特别是高频噪声(如高斯噪声)。图像会变得更加平滑,但边缘和细节可能会变得模糊。例如,使用 ksize=(11, 11) 的滤波核可以显著减少噪声,但图像的细节会丢失较多。
    • 计算时间增加:随着滤波核的增大,需要处理的像素数量增多,计算时间也会相应增加。
    • 细节丢失增加:较大的滤波核可能会导致图像细节的丢失,因为高斯核的权重分布使得远离中心的像素对结果的影响减小,从而导致图像的边缘和纹理变得模糊。
  • 滤波核变小
    • 平滑效果减弱:较小的滤波核只能覆盖较少的像素,因此对噪声的去除效果相对较弱。图像中的高频噪声可能无法被完全去除,但图像的细节能够得到更好的保留。例如,使用 ksize=(3, 3) 的滤波核可以轻微减少噪声,同时保留较多的图像细节。
    • 计算时间减少:较小的滤波核需要处理的像素数量较少,因此计算时间会相应减少。
    • 细节保留更好:较小的滤波核能够更好地保留图像中的细节,因为高斯核的权重分布使得邻域内的像素对结果的影响较大,从而避免了过度平滑导致的细节丢失。

标准差的影响:

  • sigmaXsigmaY 变大
    • 平滑效果增强较大的标准差会使高斯核的权重分布更加平缓,从而导致更强的平滑效果。图像中的噪声会被更有效地去除,但图像的细节和边缘可能会变得更加模糊。例如,使用 sigmaX=10sigmaY=10 会显著平滑图像,但可能会导致图像的边缘和纹理变得不清晰。
    • 计算时间增加:较大的标准差会增加高斯核的计算复杂度,从而导致计算时间增加。
  • sigmaXsigmaY 变小
    • 平滑效果减弱:较小的标准差会使高斯核的权重分布更加集中,从而导致较弱的平滑效果。图像中的噪声可能无法被完全去除,但图像的细节能够得到更好的保留。例如,使用 sigmaX=1sigmaY=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,表示使用默认的边界处理方法。

工作原理:

双边滤波是一种非线性的滤波方法,结合了图像的空间邻近度和像素值相似度,达到保边去噪的目的。其基本思想是:

  1. 对于图像中的每一个像素,考虑以其为中心的一个 d × d 的邻域。
  2. 使用两个高斯函数计算该邻域内每个像素的权重:
    • 空间域高斯函数:权重随着距离中心像素的空间距离增加而减小。
    • 值域高斯函数:权重随着像素值与中心像素值的差值增加而减小。
  1. 将邻域内所有像素的加权平均值作为该像素的新值。

由于其内部仍然使用了高斯滤波,所以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  # 边界扩展方式  定义图像边界的处理方式,以避免在卷积过程中超出图像范围。 一般默认即可
)

应用

  • 边缘检测:结合水平和垂直方向的梯度,计算图像的梯度幅值和方向。
  • 图像增强:通过增强图像的梯度,使边缘更加明显。

例子:

有一个圆形和方形,

  1. 分别使用sobel算子计算x方向与y方向的梯度
  2. 将结果(Numpy数组)转化为图片数据范围(Uint8)
  3. 通过结果可以很清晰的观察到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

 

  1. 逐行计算:
    • 第一行:(-100 + 0 + 200) = 100
    • 第二行:(-200 + 0 + 400) = 200
    • 第三行:(-100 + 0 + 200) = 100
  1. 总和: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 算子检测边缘的过程:

  1. 计算二阶导数:通过卷积运算将 Laplacian 卷积核与图像进行卷积,得到图像的二阶导数近似值。
  2. 检测零交叉点:在边缘附近,二阶导数通常会过零点。因此,可以通过检测 Laplacian 响应中的零交叉点来确定边缘的位置。
  3. 衡量边缘强度: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中如何实现滤波

图像滤波用于去除噪声和图像平滑&#xff0c;OpenCV 提供了多种滤波器&#xff1a; 1.1. 均值滤波&#xff1a; import cv2# 读取图像 image cv2.imread("example.jpg")# 均值滤波 blurred_image cv2.blur(image, (5, 5)) # (5, 5) 是滤波核的大小 滤波核大小的…...

BGP配置华为——路由汇总

实验拓扑 实验要求 1.R1,R2,R3间运行BGP&#xff0c;搭建EBGP邻居 2.R3一段的网络实现自动聚合&#xff0c;R1一端的网络实现手动路由聚合 3.启用as-set防环 实验配置 配置相关IP 过程省略&#xff0c;结果如图 R1 R2 R3 配置EBGP [R1]bgp 100 [R1-bgp]router 10.10.1…...

机器学习核心算法解析

机器学习核心算法解析 机器学习是人工智能的核心技术之一&#xff0c;它通过从数据中学习模式并做出预测或决策。本文将深入解析机器学习的核心算法&#xff0c;包括监督学习、无监督学习和强化学习&#xff0c;并通过具体案例和代码示例帮助读者理解这些算法的实际应用。 1. …...

【C++学习篇】C++11

目录 ​编辑 1. 初始化列表{} 1.1 C98中的{} 1.2 C11中的{} 2. C11中的std::initializer_list 3. 右值引用和移动语义 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延长生命周期 3.4 左值和右值的参数匹配 3.5 右值引⽤和移动语义的使⽤场景 3.5.1 左值引⽤…...

SQLite 数据库:优点、语法与快速入门指南

文章目录 一、引言二、SQLite 的优点 &#x1f4af;三、SQLite 的基本语法3.1 创建数据库3.2 创建表3.3 插入数据3.4 查询数据3.5 更新数据3.6 删除数据3.7 删除表 四、快速入门指南4.1 安装 SQLite4.2 创建数据库4.3 创建表4.4 插入数据4.5 查询数据4.6 更新数据4.7 删除数据4…...

数据结构——二叉树(2025.2.12)

目录 一、树 1.定义 &#xff08;1&#xff09;树的构成 &#xff08;2&#xff09;度 2.二叉树 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;二叉树的遍历 &#xff08;3&#xff09;遍历特性 二、练习 1.二叉树 &#xff08;1&#xff09;创建二叉树…...

图神经网络简介

一、说明 本文介绍了GNN网络一些要素&#xff0c;其中与CNN进行过一些对比&#xff0c;并且对GNN的一些统计原理进行介绍。 二、介绍 对于不同类型的训练数据集&#xff0c;卷积神经网络 &#xff08;CNN&#xff09; 擅长处理方形或网格状或欧几里得结构化数据&#xff0c;…...

小程序报错The JavaScript function Pointer_stringify(ptrToSomeCString)

小程序报错The JavaScript function Pointer _stringify&#xff08;ptrToSomeCString&#xff09; 介绍修改地址总结 介绍 这个报错是我在打包小程序在手机上运行时报的错&#xff0c;这个地方问题是个小问题&#xff0c;其实就是Pointer_stringify(ptrToSomeCString) 函数过时…...

DeepSeek 与网络安全:AI 驱动的智能防御

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;深度学习技术正渗透到多个领域&#xff0c;从医疗诊断到…...

Redission看门狗

在 Redisson 中&#xff0c;lock.tryLock() 和 lock.lock() 是两种不同的加锁方式&#xff0c;它们的行为有所不同&#xff1a; lock.lock()&#xff1a;这是阻塞方法&#xff0c;当调用时&#xff0c;如果锁当前不可用&#xff0c;线程将被阻塞&#xff0c;直到获取到锁。如果…...

LeetCode 热题 100_组合总和(58_39_中等_C++)(递归(回溯))

LeetCode 热题 100_组合总和&#xff08;58_39&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;递归&#xff08;回溯&#xff09;&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08…...

使用PHP爬虫获取1688商品分类:实战案例指南

在电商领域&#xff0c;商品分类信息是商家进行市场调研、选品分析和竞争情报收集的重要基础。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富且详细的商品分类数据。通过PHP爬虫技术&#xff0c;我们可以高效地获取这些分类信息&#xff0c;为商业决策提供有力支持。 …...

Nginx location 和 proxy_pass 配置详解

概述 Nginx 配置中 location 和 proxy_pass 指令的不同组合方式及其对请求转发路径的影响。 配置效果 1. location 和 proxy_pass 都带斜杠 / location /api/ {proxy_pass http://127.0.0.1:8080/; }访问地址&#xff1a;www.hw.com/api/upload转发地址&#xff1a;http://…...

云创智城充电系统:基于 SpringCloud 的高可用、可扩展架构详解-多租户、多协议兼容、分账与互联互通功能实现

在新能源汽车越来越普及的今天&#xff0c;充电基础设施的管理和运营变得越来越重要。云创智城充电系统&#xff0c;就像一个超级智能管家&#xff0c;为新能源充电带来了全新的解决方案&#xff0c;让充电这件事变得更方便、更高效、更安全。 一、厉害的技术架构&#xff0c;让…...

AIP-143 标准代号

编号143原文链接AIP-143: Standardized codes状态批准创建日期2019-07-24更新日期2019-07-24 许多常见的概念&#xff0c;如语言、国家、货币等&#xff0c;都有用于数据通信和处理的通用代号&#xff08;通常由国际标准化组织正式定义&#xff09;。这些代号解决了在书面语言…...

机器视觉--数字图像格式

图像格式 在数字图像的世界里&#xff0c;不同的图像格式有着各自的特点和适用场景。了解这些图像格式&#xff0c;对于我们在处理图像时选择合适的存储和传输方式至关重要。下面就让我们来详细探讨一下常见的几种数字图像格式。 一、BMP 文件&#xff08;Bitmap&#xff09;…...

Kotlin 2.1.0 入门教程(十七)接口

接口 接口可以包含抽象方法的声明&#xff0c;也可以包含方法的实现。 接口与抽象类的不同之处在于&#xff0c;接口无法存储状态。接口可以拥有属性&#xff0c;但这些属性要么必须是抽象的&#xff0c;要么就得提供访问器的实现。 接口使用 interface 关键字来定义&#x…...

渗透测试工具:SQLmap安装教程及使用

在渗透测试的世界里&#xff0c;SQL注入攻击无疑是最常见且最具威胁的安全漏洞之一。幸运的是&#xff0c;SQLmap 这个强大的自动化工具&#xff0c;能够帮助我们快速识别和利用这些漏洞。如果你也想了解如何用 SQLmap 进行渗透测试&#xff0c;那么这篇文章就是为你准备的&…...

4.SpringSecurity在分布式环境下的使用

参考 来源于黑马程序员&#xff1a; 手把手教你精通新版SpringSecurity 分布式认证概念说明 分布式认证&#xff0c;即我们常说的单点登录&#xff0c;简称SSO&#xff0c;指的是在多应用系统的项目中&#xff0c;用户只需要登录一次&#xff0c;就可以访 问所有互相信任的应…...

RocketMQ和Kafka如何实现顺序写入和顺序消费?

0 前言 先说明kafka&#xff0c;顺序写入和消费是Kafka的重要特性&#xff0c;但需要正确的配置和使用方式才能保证。本文需要解释清楚Kafka如何通过分区来实现顺序性&#xff0c;以及生产者和消费者应该如何配合。   首先&#xff0c;顺序写入。Kafka的消息是按分区追加写入…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...