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] = 0

    return 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: 高斯噪声的均值,默认为0
        sigma: 高斯噪声的标准差,默认为25

    返回:
        noisy_image: 添加了高斯噪声后的图像
    """
    # Ensure the image is in float32 format and normalized to [0, 1]
    if len(image.shape) == 2:
        row, col = image.shape
        ch = 1
        img = image.astype(np.float32) / 255.0
    else:
        row, col, ch = image.shape
        img = image.astype(np.float32) / 255.0

    # Generate Gaussian noise
    gauss = np.random.normal(mean, sigma / 255.0, (row, col, ch))
    gauss = gauss.reshape(row, col, ch)

    # Add the Gaussian noise to the image
    noisy_image = img + gauss

    # Clip the values to stay within [0, 1] range and convert back to uint8
    noisy_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 变小:空间距离影响减弱,平滑效果减弱,细节保留更好。

对比代码如下:

@staticmethod
    def 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_64F
    dx,         # 表示对x方向求导
    dy,         # 表示对y方向求导
    ksize=3,    # 卷积核的大小,可以是 1、3、5 或 7
    scale=1,    # 比例因子 求导结果放大缩小 X 法 增大>1 减少 <1
    delta=0,    # 偏移量 求导结果整体+ -
    borderType=cv2.BORDER_DEFAULT  # 边界扩展方式  定义图像边界的处理方式,以避免在卷积过程中超出图像范围。 一般默认即可
)

应用

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

例子:

有一个圆形和方形,

  1. 分别使用sobel算子计算x方向与y方向的梯度
  2. 将结果(Numpy数组)转化为图片数据范围(Uint8)
  3. 通过结果可以很清晰的观察到sobel算子的功能
@staticmethod
    def 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_64F
    ksize=1,     # 卷积核的大小,可以是 1、3、5 或 7
    scale=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_64F
    kernel,      # 自定义的卷积核
    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中,常见的低通滤波实现方式就是上述已说明的滤波:

  • 均值滤波
  • 中值滤波
  • 高斯滤波
  • 双边滤波

详见上述内容

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/972014.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux网络 | 多路转接Reactor

前言&#xff1a;本节内容结束Linux网络部分。本节将要简单实现一下多路转接Reactor的代码&#xff0c;制作一个多路转接版本的四则运算计算器服务器。Reactor的代码相当困难&#xff0c;除了350多行新代码&#xff0c; 还要用到我们之前写的许多文件&#xff0c; 比如之前写的…

数控机床设备分布式健康监测与智能维护系统MTAgent

数控机床设备分布式健康监测与智能维护系统MTAgent-v1.1融合了目前各种先进的信号处理以及信息分析算法以算法工具箱的方式&#xff0c;采用了一种开发的、模块化的结构实现信号各种分析处理&#xff0c;采用Python编程语言&#xff0c;满足不同平台需求(包括Windows、Linux)。…

Opencv项目实战:26 信用卡号码识别与类型判定

项目介绍 在日常生活中&#xff0c;信用卡的使用越来越普遍。本项目的主要目标是通过图像处理技术自动识别信用卡号码&#xff0c;并根据信用卡号码的第一个数字判定信用卡的类型&#xff08;如Visa、MasterCard等&#xff09;。项目结合了图像预处理、轮廓检测、模板匹配等技…

利用websocket检测网络连接稳定性

浏览器中打开F12&#xff0c;控制台中输入以下内容 > 回车 > 等待结果 连接关闭 表示断网 let reconnectDelay 1000; // 初始重连间隔 let pingInterval null; let socketManuallyClosed false; // 标志是否手动关闭function createWebSocket() {if (socketManuallyCl…

WPF9-数据绑定进阶

目录 1. 定义2. 背景3. Binding源3.1. 使用Data Context作为Binding的源3.2. 使用LINQ检索结果作为Binding的源 4. Binding对数据的转换和校验4.1. 需求4.2. 实现步骤4.3. 值转换和校验的好处4.3.1. 数据转换的好处 4.4. 数据校验的好处4.5. 原理4.5.1. 值转换器原理4.5.2. 数据…

【Unity Shader编程】之图元装配与光栅化

执行方式&#xff1a;自动完成 图元装配自动化流程 顶点坐标存入装配区 → 按绘制模式连接顶点 → 生成完整几何图元 示例&#xff1a;gl.drawArrays(gl.TRIANGLES, 0, 3)自动生成三角形 会自动自动裁剪超出屏幕范围&#xff08;NDC空间外&#xff09;的三角形&#xff0c;仅保…

ssm121基于ssm的开放式教学评价管理系统+vue(源码+包运行+LW+技术指导)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

网工项目理论1.11 网络出口设计

本专栏持续更新&#xff0c;整一个专栏为一个大型复杂网络工程项目。阅读本文章之前务必先看《本专栏必读》。 一.网络出口接入技术 二.单一出口网络结构 三.同运营商多出口结构 四.多运营商多出口结构——出向流量 五.多运营商多出口结构——服务器访问流量 六.多运营商多出口…

Django 5 实用指南(一)安装与配置

1.1 Django5的背景与发展 Django 自从2005年由Adrian Holovaty和Simon Willison在 Lawrence Journal-World 新闻网站上首次发布以来&#xff0c;Django 一直是 Web 开发领域最受欢迎的框架之一。Django 框架经历了多个版本的演进&#xff0c;每次版本更新都引入了新功能、改进了…

Redis实战-扩展Redis

扩展Redis 1、扩展读性能2、扩展写性能和内存容量3、扩展复杂的查询3.1 扩展联合查询3.2 扩展分片排序 如有侵权&#xff0c;请联系&#xff5e; 如有错误&#xff0c;也欢迎批评指正&#xff5e; 本篇文章大部分是来自学习《Redis实战》的笔记 1、扩展读性能 单台Redis服务器…

【AI面板识别】

题目描述 AI识别到面板上有N&#xff08;1 ≤ N ≤ 100&#xff09;个指示灯&#xff0c;灯大小一样&#xff0c;任意两个之间无重叠。 由于AI识别误差&#xff0c;每次别到的指示灯位置可能有差异&#xff0c;以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1&#x…

朴素模式匹配算法与KMP算法(有next[]和nextval[]详细讲解

这篇文章是建立在上篇文章的基础上的,看此篇文章要有串的基本知识 举个例子引进我们今天的知识 假设我们这里有两个字符串,一个主串,一个子串 主串: aaa223aa225 子串: aa22 我们这里需要进行匹配,传统的朴素模式匹配算法,就是主串下标i从1开始,主串j从1开始…

文件操作(PHP)(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…

【分治法】棋盘覆盖问题 C/C++(附代码和测试实例及算法分析)

问题描述 在一个 2 k 2 k 2^k \times 2^k 2k2k大小的棋盘中&#xff0c;有一个与其他方块不同的特殊方块&#xff0c;如下图红色方块。另有4种形态不同的L型骨块&#xff08;见下图&#xff09;&#xff0c;要用图示四种骨块覆盖棋盘上除特殊方格外的其他所有方格&#xff0c…

el-table的hasChildren不生效?子级没数据还显示箭头号?树形数据无法展开和收缩

问题&#xff1a;明明子级只有一条数据&#xff0c;还显示箭头号 原因&#xff1a;最开始row-key写的是id,父级和子级都有该属性&#xff0c;所以展开失效了。 解决方法&#xff1a;row-key&#xff1a;id改成 row-key"name"

2002-2019年各省人口老龄化程度数据

2002-2019年各省人口老龄化程度数据 1、时间&#xff1a;2002-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;地区、年度、六十五岁以上占比 4、范围&#xff1a;31省 5、指标解释&#xff1a;人口老龄化是指人口生育率降低和人均寿命延长导致的总人…

面向机器学习的Java库与平台简介、适用场景、官方网站、社区网址

Java机器学习的库与平台 最近听到有的人说要做机器学习就一定要学Python&#xff0c;我想他们掌握的知道还不够系统全面。本文作者给大家介绍几种常用Java实现的机器学习库&#xff0c;快快收藏加关注吧&#xff5e; Java机器学习库表格 Java机器学习库整理库/平台概念适合场…

MySQL 之服务器配置和状态(MySQL Server Configuration and Status)

MySQL 之服务器配置和状态 1 MySQL 架构和性能优化 1.3 服务器配置和状态 设置 MySQL 服务的特性&#xff0c;可以通过 mysqld 服务选项&#xff0c;服务器系统变量和服务器状态变量这三个方面来进行设置和查看。 官方文档 https://dev.mysql.com/doc/refman/8.0/en/serve…

Linux的基础指令和环境部署,项目部署实战(下)

目录 上一篇&#xff1a;Linxu的基础指令和环境部署&#xff0c;项目部署实战&#xff08;上&#xff09;-CSDN博客 1. 搭建Java部署环境 1.1 apt apt常用命令 列出所有的软件包 更新软件包数据库 安装软件包 移除软件包 1.2 JDK 1.2.1. 更新 1.2.2. 安装openjdk&am…

LabVIEW无刷电机控制器检测系统

开发了一种基于LabVIEW的无刷电机控制器检测系统。由于无刷电机具有高效率、低能耗等优点&#xff0c;在电动领域有取代传统电机的趋势&#xff0c;而无刷电机的核心部件无刷电机控制器产量也在不断增长。然而&#xff0c;无刷电机控制器的出厂检测仍处于半自动化状态&#xff…