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) 是滤波核的大小 滤波核大小的…...
vscode通过ssh连接服务器实现免密登录+删除
文章目录 参考: 1、 vscode通过ssh连接服务器实现免密登录删除(吐血总结)...
智能硬件新时代,EasyRTC开启物联音视频新纪元
在万物互联的时代浪潮中,智能硬件正以前所未有的速度融入我们的生活,从智能家居的便捷控制,到智能穿戴设备的健康监测,再到工业物联网的高效管理,智能硬件的应用场景不断拓展。而在这个智能硬件蓬勃发展的背后…...
《机器学习数学基础》补充资料:求解线性方程组的克拉默法则
《机器学习数学基础》中并没有将解线性方程组作为重点,只是在第2章2.4.2节做了比较完整的概述。这是因为,如果用程序求解线性方程组,相对于高等数学教材中强调的手工求解,要简单得多了。 本文是关于线性方程组的拓展,供…...
mysql的rpm包安装
(如果之前下载过mariadb,使用yum remove mariadb卸载,因为mariadb与rpm包安装的mysql有很多相似的组件和文件,会发生冲突,而源码包安装的mysql不会,所以不用删除源码包安装myqsl,只删除mariadb就可以&#…...
TailwindCss的vue3安装使用
按照官网的安装教程,属性最后无法生效,这是自我改良版,添加了额外步骤,但是每次引入新的tailwindcss属性 需要重新跑一次项目 npm下载tailwindcss npm install -D tailwindcss npx初始化tailwind配置 npx tailwindcss init 此时根…...
foobar2000设置DSP使用教程及软件推荐
foobar2000安卓中文版:一款高品质手机音频播放器 foobar2000安卓中文版是一款备受好评的高品质手机音频播放器。 几乎支持所有的音频格式,包括 MP3、MP4、AAC、CD 音频等。不论是经典老歌还是最新的流行音乐,foobar2000都能完美播放。除此之…...
开源多商户商城源码最新版_适配微信小程序+H5+APP+PC多端
在数字化时代,电子商务已经成为各行业不可或缺的一部分,开源多商户商城源码为中小企业和个人开发者提供了快速搭建和定制电商平台的利器。分享一款最新版的开源多商户商城源码,它能够适配微信小程序、H5、APP和PC等多个端口,满足商…...
【matlab】大小键盘对应的Kbname
matlab中可以通过Kbname来识别键盘上的键。在写范式的时候,遇到一个问题,我想用大键盘上排成一行的数字按键评分,比如 Kbname(1) 表示键盘上的数字1,但是这种写法只能识别小键盘上的数字,无法达到我的目的,…...
go语言并发的最佳实践
Go 语言的并发模型是其最强大的特性之一,基于 CSP(Communicating Sequential Processes)理论,通过 goroutine 和 channel 实现轻量级并发. 一、并发核心概念 1. Goroutine 在 Go 语言中,Goroutine 是实现并发编程的…...
超全Deepseek资料包,deepseek下载安装部署提示词及本地部署指南介绍
该资料包涵盖了DeepSeek模型的下载、安装、部署以及本地运行的详细指南,适合希望在本地环境中高效运行DeepSeek模型的用户。资料包不仅包括基础的安装步骤,还提供了68G多套独立部署视频教程教程,针对不同硬件配置的模型选择建议,以…...
重看Spring聚焦BeanDefinition分析和构造
目录 一、对BeanDefinition的理解 (一)理解元信息 (二)BeanDefinition理解分析 二、BeanDefinition的结构设计分析 (一)整体结构体会 (二)重要接口和类分析 三、构造 BeanDef…...
从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
一、前言 升级需求:将5.7.35升级到8.0.27, 升级方式 in-place升级【关闭现有版本MySQL,将二进制或包替换成新版本并在现有数据目录上启动MySQL并执行升级任务的方式,称为in-place升级】 原版本 5.7.35 CentOS Linux release 7.9.2009 新版本…...
Node-Red
是什么? ——基于浏览器的流程编辑工具可连接设备、服务器和API应用 一、安装 1、本地安装(Windows) 在电脑上安装 Node.js 环境,然后使用 NPM 安装 Node-RED Node.js介绍: JavaScript 在不同的位置有不一样的解析器 写入 HTML 的 JS 语言,浏览器即它的解析器需要独…...
GO语言的安装以及第一个Go语言程序
1. Go语言的安装与设置 官网:golang.org 国内下载:https://studygolang.com/dl 国内镜像:https://goproxy.cn/ 2. GOland的安装 Go 1.13 及以上(推荐) 打开你的终端并执行 $ go env -w GO111MODULEon $ go env -w GOPROXYhttps://goproxy.cn,direc…...
年前集训总结python
1.用空格隔开输出列表list1 print(" ".jion(map(str,list1))) 2.转换函数 int() 将一个数字或字符串转换为整数。可以指定基数,支持从其他进制(如二进制、十六进制)转换为十进制。 int(101, 2) # 二进制字符串转十进制 > 5 …...
【JAVA实战】JAVA实现Excel模板下载并填充模板下拉选项数据
背景 有这样一个场景:前端下载Excel模板,进行数据导入,这个下载模板过程需要经过后端接口去数据库查询数据进行某些列的下拉数据填充,下拉填充的数据过程中会出现错误String literals in formulas can’t be bigger than 255 cha…...
【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题
【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题 【承接商业广告,如需商业合作请+v17740568442】 文章目录 【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题问题描述:解决方法方法一:手动中断并重启下载方法二:使用 Bash 脚本自动化下载在…...
Rust 面试题
1. Rust 中的所有权(Ownership)是什么? 回答: 所有权是 Rust 的核心概念之一,每个值在 Rust 中都有一个唯一的所有者,并且所有权在作用域内转移。当所有者离开作用域时,Rust 会自动释放该值的内存,避免了内存泄漏。 代码示例: fn main() {let s1 = String::from(&q…...
Copilot Next Edit Suggestions(预览版)
作者:Brigit Murtaugh,Burke Holland 排版:Alan Wang 我们很高兴向你介绍在本次 Visual Studio Code 发布中,关于 GitHub Copilot 的三个预览功能: Next Edit Suggestions(NES)Copilot Edits 的…...
LeetCode - 18 四数之和
题目来源 18. 四数之和 - 力扣(LeetCode) 题目描述 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一…...
汽车零部件开发应该具备哪些编程思维?
目录 1、功能安全思维 2、实时性与确定性思维 3、可靠性和冗余思维 4、硬件软件协同思维 5、CAN总线通信思维 6、故障诊断和自诊断思维 7、功耗优化思维 8、软件更新和版本管理思维 9、用户体验与安全性思维 汽车零部件开发中,嵌入式软件在车辆系统中的作用…...
在Windows系统中安装Open WebUI并连接Ollama
Open WebUI是一个开源的大语言模型(LLM)交互界面,支持本地部署与离线运行。通过它,用户可以在类似ChatGPT的网页界面中,直接操作本地运行的Ollama等大语言模型工具。 安装前的核心要求: Python 3.11&#…...
React 与 Vue 对比指南 - 上
React 与 Vue 对比指南 - 上 本文将展示如何在 React 和 Vue 中实现常见功能,从基础渲染到高级状态管理 Hello 分别使用 react 和 vue 写一个 Hello World! react export default () > {return <div>Hello World!</div>; }vue <…...
自动化办公|通过xlwings进行excel格式设置
1. 介绍 xlwings 是一个强大的 Python 库,可以用来操作 Excel,包括设置单元格格式、调整行高列宽、应用条件格式以及使用内置样式。本文将详细介绍如何使用 xlwings 进行 Excel 格式化操作,并附带代码示例。 2. 基础格式设置(字…...
c# -01新属性-模式匹配、弃元、析构元组和其他类型
文章目录 **学习摘抄分享**模式匹配概述Null 检查类型测试比较离散值关系模型多个输入ObServation列表模式弃元元组和对象析构利用switch的模式进行匹配对于out的方法调用独立弃元析构元组和其他类型元组方法一方法二方法三方法四使用弃元元组的元素使用弃元的用户定义类型解构…...
银河麒麟V10SP1下qt5-12-12编译环境配置
下面的脚本在兆芯版kylin上试过,如果是本地编译,arm版应该也没有问题 a. 如果执行脚本安装有问题,读者可以拷贝命令多次安装 b. 建议在虚拟机环境下进行 #!/bin/bashsudo apt updatesudo apt-get install g gcc make cmake gperf bison flex libdrm-dev libxcompos…...
轻松搭建本地大语言模型(一)Ollama安装与使用
Ollama 是一款开源的本地大语言模型运行框架,支持在 Windows、macOS 和 Linux 系统上运行,能够帮助用户轻松下载和使用各种大语言模型(例如deepseek、llama、qwen)。本文将详细介绍 Ollama 的安装步骤,帮助你快速搭建本…...
【深度学习】Transformer入门:通俗易懂的介绍
【深度学习】Transformer入门:通俗易懂的介绍 一、引言二、从前的“读句子”方式三、Transformer的“超级阅读能力”四、Transformer是怎么做到的?五、Transformer的“多视角”能力六、Transformer的“位置记忆”七、Transformer的“翻译流程”八、Trans…...
浅识Linux高阶用法
(前记:内容有点多,先看目录再挑着看。) 问题:在Java面试中,当被提问到Linux的高阶用法以及如何使用Linux将程序、数据库、中间件等部署在云上时,可以从以下几个方面进行回答: Li…...
I²C简介
前言 IC(Inter-Integrated Circuit, 内置集成电路)总线是由Philips公司(现属于恩智浦)在上世纪80年代开发的两线式串行通信总线,用于连接微控制器及其外围设备,控制设备之间的通信。 IC总线的物理拓扑示意…...
Linux定时静默执行桌面/前台程序
Linux服务器上的程序大都在后台默默的执行,但有些需要在前台或桌面上运行的程序该怎么办呢?这就要借助虚拟显示技术,也就是在后台运行时提供虚拟的显示,使前台运行的程序也能默默的在后台运行,这就是所谓的以“无头模式…...
Redux中间件redux-thunk和redux-saga的具体区别是什么?
Redux 中间件是增强 Redux 功能的重要工具,redux-thunk 和 redux-saga 是两个常用的中间件,它们在处理异步操作和副作用时提供了不同的方式和理念。以下是两者的具体区别: 1. 概念与设计理念 redux-thunk 简洁:redux-thunk 是一…...
【STM32】DRV8833驱动电机
1.电机如何转动 只需要给电机两个端子加一正一负的极性就会转起来了,但是要注意的是不要将电机两端直接接在5v和gnd之间,这种电机一般要提供几百毫安的电流,而GPIO口只能提供几毫安,所以我们使用一个DRV8833来驱动 DRV8833输入口…...
【go语言规范】 使用函数式选项 Functional Options 模式处理可选配置
如何处理可选配置? Config Struct 方式 (config-struct/main.go) 这是最简单的方式,使用一个配置结构体: 定义了一个简单的 Config 结构体,包含 Port 字段创建服务器时直接传入配置对象优点:简单直接缺点:…...
vue中为组建添加样式的方式
在 Vue 中,可以通过多种方式为 view 添加样式,并且支持动态绑定样式。以下是几种常见的方式: 1. 内联样式 直接在模板中使用 style 属性来添加样式。 <template><div style"color: red; font-size: 14px;">这是一个…...
如何简单的去使用jconsloe 查看线程 (多线程编程篇1)
目录 前言 1.进程和线程 进程 PCB 的作用 并发编程和并行编程 线程 为什么选择多线程编程 2.在IDEA中如何简单创建一个线程 1. 通过继承Thread类 2. 通过实现 Runnable 接口 3. 使用 Lambda 表达式 3.如何简单使用jconsloe去查看创建好的线程 前言 2025来了,这是第…...
机器学习·最近邻方法(k-NN)
前言 上一篇简单介绍了决策树,而本篇讲解与决策树相近的 最近邻方法k-NN。 机器学习决策树-CSDN博客 一、算法原理对比 特性决策树最近邻方法(k-NN)核心思想通过特征分割构建树结构,递归划分数据基于距离度量,用最近…...
网络安全试题
ciw网络安全试题 (1)(单选题)使网络服务器中充斥着大量要求回复的信息,消耗带宽,导致网络或系统停止正常服务,这属于什么攻击类型? A、拒绝服务 B、文件共享 C、BIND漏洞 D、远程过程调用 &a…...
沃丰科技大模型标杆案例 | 索尼大模型智能营销机器人建设实践
AI大模型发展日新月异,国内外主流大模型每月必会升级。海外AI大模型市场由美国主导, 各模型已形成“多强竞合”的局面。中国积极响应全球大模型技术的发展趋势,高校、研究院所等科研机构、互联网企业,人工智能企业均不同程度地投入…...
rust学习四、控制语句
rust的控制语句和大部分语言没有什么区别,都是熟悉的for,while,loop,if。 比较不同的是,在绝大部分非常流行的语言中都有的switch,rust是没有的。 诸如c/c,java,javascript,c#。连PL/SQL都有case when语句。 一、基本的for、while、if&…...
会员购交易系统架构演进
本期作者 1.背景 会员购是B站2017年推出的IP消费体验服务平台,在售商品以手办、漫画、JK制服等贴合平台生态的商品为主。随着业务发展,会员购从最开始的预售,现货拓展到全款预售,盲盒,众筹等多种售卖方式,销…...
在Linux系统下修改Docker的默认存储路径
在Linux系统下修改Docker的默认存储路径可以通过多种方法实现,下边是通过修改daemon.json文件方式实现 查看当前Docker存储路径 使用命令 docker info | grep "Docker Root Dir" 查看当前Docker的存储路径,默认为 /var/lib/docker 停止Docker…...
【人工智能】释放数据潜能:使用Featuretools进行自动化特征工程
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 特征工程是机器学习流程中至关重要的一步,它直接影响模型的性能。然而,手动特征工程既耗时又需要领域专业知识。Featuretools是一个强大的…...
shell脚本备份PostgreSQL数据库和库下表
注意: 以下为对PostgreSQL13.16版本数据库备份shell脚本参考请确认备份节点上psql和pgdump的版本不至于太低,建议>13.16该脚本目前是对于整库、(默认针对public这个schema,如果有其他schema,请自行添加一层循环&am…...
java面试笔记(一)
1. 一万个string类型的数据,设计一个算法如何按照String长度来排序 以使用 Arrays.sort() 方法,并结合一个自定义的比较器。以下是实现的示例代码: public class StringLengthSort {public static void main(String[] args) {// 定义一万个字符串的示例…...
网络分析仪E5071C的回波损耗测量
回波损耗(Return Loss)是评估射频/微波元件(如滤波器、天线、电缆等)信号反射特性的关键参数,反映端口阻抗匹配性能。E5071C矢量网络分析仪(VNA)通过以下步骤实现高精度回波损耗测量:…...
sql注入中,如果information_schema被过滤,该怎么绕过
目录 一、sys.schema_auto_increment_columns 1.功能 2.利用思路 二、sys.schema_table_statistics_with_buffer 1.功能 2.利用思路 三、mysql.innodb_table_stats和mysql.innodb_index_stats 1.mysql.innodb_table_stats 1.1功能 2.mysql.innodb_index_stats 2.1功…...
若依Flowable工作流版本监听器使用方法
1.前言 本文详细介绍如何在若依Flowable工作流版本(RuoYi-Vue-Flowable)中配置执行监听器和任务监听器。是以我二次开发的代码为基础,介绍如何配置监听器,已解决源码在新增或删除监听器出现的问题,如果需要二次开发的…...
Linux(Centos 7.6)命令详解:cat
1.命令作用 将文件或标准输入连接到标准输出(Concatenate FILE(s), or standard input, to standard output), 即将文件内容输出到屏幕上,或者将多个文件合并成一个文件。 2.命令语法 Usage: cat [OPTION]... [FILE]... 3.参数详解 OPTION: -A, -…...