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) 是滤波核的大小 滤波核大小的…...

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

机器学习核心算法解析
机器学习核心算法解析 机器学习是人工智能的核心技术之一,它通过从数据中学习模式并做出预测或决策。本文将深入解析机器学习的核心算法,包括监督学习、无监督学习和强化学习,并通过具体案例和代码示例帮助读者理解这些算法的实际应用。 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 的优点 💯三、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.定义 (1)树的构成 (2)度 2.二叉树 (1)定义 (2)二叉树的遍历 (3)遍历特性 二、练习 1.二叉树 (1)创建二叉树…...

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

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

DeepSeek 与网络安全:AI 驱动的智能防御
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 随着人工智能(AI)的快速发展,深度学习技术正渗透到多个领域,从医疗诊断到…...
Redission看门狗
在 Redisson 中,lock.tryLock() 和 lock.lock() 是两种不同的加锁方式,它们的行为有所不同: lock.lock():这是阻塞方法,当调用时,如果锁当前不可用,线程将被阻塞,直到获取到锁。如果…...

LeetCode 热题 100_组合总和(58_39_中等_C++)(递归(回溯))
LeetCode 热题 100_组合总和(58_39) 题目描述:输入输出样例:题解:解题思路:思路一(递归(回溯)): 代码实现代码实现(思路一(…...
使用PHP爬虫获取1688商品分类:实战案例指南
在电商领域,商品分类信息是商家进行市场调研、选品分析和竞争情报收集的重要基础。1688作为国内领先的B2B电商平台,提供了丰富且详细的商品分类数据。通过PHP爬虫技术,我们可以高效地获取这些分类信息,为商业决策提供有力支持。 …...

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

云创智城充电系统:基于 SpringCloud 的高可用、可扩展架构详解-多租户、多协议兼容、分账与互联互通功能实现
在新能源汽车越来越普及的今天,充电基础设施的管理和运营变得越来越重要。云创智城充电系统,就像一个超级智能管家,为新能源充电带来了全新的解决方案,让充电这件事变得更方便、更高效、更安全。 一、厉害的技术架构,让…...
AIP-143 标准代号
编号143原文链接AIP-143: Standardized codes状态批准创建日期2019-07-24更新日期2019-07-24 许多常见的概念,如语言、国家、货币等,都有用于数据通信和处理的通用代号(通常由国际标准化组织正式定义)。这些代号解决了在书面语言…...
机器视觉--数字图像格式
图像格式 在数字图像的世界里,不同的图像格式有着各自的特点和适用场景。了解这些图像格式,对于我们在处理图像时选择合适的存储和传输方式至关重要。下面就让我们来详细探讨一下常见的几种数字图像格式。 一、BMP 文件(Bitmap)…...
Kotlin 2.1.0 入门教程(十七)接口
接口 接口可以包含抽象方法的声明,也可以包含方法的实现。 接口与抽象类的不同之处在于,接口无法存储状态。接口可以拥有属性,但这些属性要么必须是抽象的,要么就得提供访问器的实现。 接口使用 interface 关键字来定义&#x…...

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

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

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

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
ip子接口配置及删除
配置永久生效的子接口,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 ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

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、结构体与…...