opencv中一般是利用高通滤波器进行图像去噪,具体包括以下三个函数。
cv2.Sobel(),其实求得是一阶导数
cv2.Schar(),其实也求得是一阶导数,是对sobel算子的优化
cv2.Laplacian(),其实求得是二阶导数
上述三个算法的原理可以进行百度,很多地方都有。
另外我们需要知道的是,低通滤波器一般也是可以进行去噪声的。
附代码如下进行对比算法:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('4.jfif') #原图为彩色图,可将第二个参数变为0,为灰度图
laplacian=cv2.Laplacian(img,cv2.CV_64F)#cv2.CV_64F输出图像的数据类型,可以使用-1,与原图像保持一致
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)# 参数 1,0 ,其中1是只在 x 方向求一阶导数,0是y方向不求导数,其最大可以求2阶导数。
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5) # 参数 1,0 ,其中1是只在 y 方向求一阶导数,0是x方向不求导数,其最大可以求2阶导数。
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()
运行结果如下所示:
若要进行灰度图像的处理,代码如下:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('4.jfif',0) #原图为彩色图,可将第二个参数变为0,为灰度图
laplacian=cv2.Laplacian(img,cv2.CV_64F)#cv2.CV_64F输出图像的数据类型,可以使用-1,与原图像保持一致
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)# 参数 1,0,其中1是只在x方向求一阶导数,0是y方向不求导数,其最大可以求2阶导数。
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5) # 参数 1,0 ,其中1是只在y方向求一阶导数,0是x方向不求导数,其最大可以求2阶导数。
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()
运行结果如下所示: