环球今头条!python数字图像处理之图像简单滤波实现
来源:脚本之家    时间:2022-06-29 05:55:28
目录
引言1、sobel算子2、roberts算子3、scharr算子4、prewitt算子5、canny算子6、gabor滤波7、gaussian滤波8、median9、水平、垂直边缘检测10、交叉边缘检测

引言

对图像进行滤波,可以有两种效果:一种是平滑滤波,用来抑制噪声;另一种是微分算子,可以用来检测边缘和特征提取。


(相关资料图)

skimage库中通过filters模块进行滤波操作。

1、sobel算子

sobel算子可用来检测边缘

函数格式为:skimage.filters.sobel(image,mask=None)

from skimage import data,filters
import matplotlib.pyplot as plt
img = data.camera()
edges = filters.sobel(img)
plt.imshow(edges,plt.cm.gray)

2、roberts算子

roberts算子和sobel算子一样,用于检测边缘

调用格式也是一样的:

edges = filters.roberts(img)

3、scharr算子

功能同sobel,调用格式:

edges = filters.scharr(img)

4、prewitt算子

功能同sobel,调用格式:

edges = filters.prewitt(img)

5、canny算子

canny算子也是用于提取边缘特征,但它不是放在filters模块,而是放在feature模块

函数格式:skimage.feature.canny(image,sigma=1.0)

可以修改sigma的值来调整效果

from skimage import data,filters,feature
import matplotlib.pyplot as plt
img = data.camera()
edges1 = feature.canny(img)   #sigma=1
edges2 = feature.canny(img,sigma=3)   #sigma=3
plt.figure("canny",figsize=(8,8))
plt.subplot(121)
plt.imshow(edges1,plt.cm.gray)  
plt.subplot(122)
plt.imshow(edges2,plt.cm.gray)
plt.show()

从结果可以看出,sigma越小,边缘线条越细小。

6、gabor滤波

gabor滤波可用来进行边缘检测和纹理特征提取。

函数调用格式:skimage.filters.gabor_filter(image,frequency)

通过修改frequency值来调整滤波效果,返回一对边缘结果,一个是用真实滤波核的滤波结果,一个是想象的滤波核的滤波结果。

from skimage import data,filters
import matplotlib.pyplot as plt
img = data.camera()
filt_real, filt_imag = filters.gabor_filter(img,frequency=0.6)   
plt.figure("gabor",figsize=(8,8))
plt.subplot(121)
plt.title("filt_real")
plt.imshow(filt_real,plt.cm.gray)  
plt.subplot(122)
plt.title("filt-imag")
plt.imshow(filt_imag,plt.cm.gray)
plt.show()

以上为frequency=0.6的结果图。

以上为frequency=0.1的结果图

7、gaussian滤波

多维的滤波器,是一种平滑滤波,可以消除高斯噪声。

调用函数为:skimage.filters.gaussian_filter(image,sigma)

通过调节sigma的值来调整滤波效果

from skimage import data,filters
import matplotlib.pyplot as plt
img = data.astronaut()
edges1 = filters.gaussian_filter(img,sigma=0.4)   #sigma=0.4
edges2 = filters.gaussian_filter(img,sigma=5)   #sigma=5
plt.figure("gaussian",figsize=(8,8))
plt.subplot(121)
plt.imshow(edges1,plt.cm.gray)  
plt.subplot(122)
plt.imshow(edges2,plt.cm.gray)
plt.show()

可见sigma越大,过滤后的图像越模糊

8、median

中值滤波,一种平滑滤波,可以消除噪声。

需要用skimage.morphology模块来设置滤波器的形状。

from skimage import data,filters
import matplotlib.pyplot as plt
from skimage.morphology import disk
img = data.camera()
edges1 = filters.median(img,disk(5))
edges2= filters.median(img,disk(9))
plt.figure("median",figsize=(8,8))
plt.subplot(121)
plt.imshow(edges1,plt.cm.gray)  
plt.subplot(122)
plt.imshow(edges2,plt.cm.gray)
plt.show()

从结果可以看出,滤波器越大,图像越模糊。

9、水平、垂直边缘检测

上边所举的例子都是进行全部边缘检测,有些时候我们只需要检测水平边缘,或垂直边缘,就可用下面的方法。

水平边缘检测:sobel_h, prewitt_h, scharr_h

垂直边缘检测: sobel_v, prewitt_v, scharr_v

from skimage import data,filters
import matplotlib.pyplot as plt
img = data.camera()
edges1 = filters.sobel_h(img)  
edges2 = filters.sobel_v(img) 
plt.figure("sobel_v_h",figsize=(8,8))
plt.subplot(121)
plt.imshow(edges1,plt.cm.gray)  
plt.subplot(122)
plt.imshow(edges2,plt.cm.gray)
plt.show()

上边左图为检测出的水平边缘,右图为检测出的垂直边缘。

10、交叉边缘检测

可使用Roberts的十字交叉核来进行过滤,以达到检测交叉边缘的目的。这些交叉边缘实际上是梯度在某个方向上的一个分量。

其中一个核:

0 1
-1 0

对应的函数:

roberts_neg_diag(image)

例:

from skimage import data,filters
import matplotlib.pyplot as plt
img =data.camera()
dst =filters.roberts_neg_diag(img) 
plt.figure("filters",figsize=(8,8))
plt.subplot(121)
plt.title("origin image")
plt.imshow(img,plt.cm.gray)
plt.subplot(122)
plt.title("filted image")
plt.imshow(dst,plt.cm.gray)

另外一个核:

1 0
0 -1

对应函数为:

roberts_pos_diag(image)

from skimage import data,filters
import matplotlib.pyplot as plt
img =data.camera()
dst =filters.roberts_pos_diag(img) 
plt.figure("filters",figsize=(8,8))
plt.subplot(121)
plt.title("origin image")
plt.imshow(img,plt.cm.gray)
plt.subplot(122)
plt.title("filted image")
plt.imshow(dst,plt.cm.gray)

以上就是python数字图像处理之图像简单滤波实现的详细内容,更多关于python数字图像处理简单滤波的资料请关注脚本之家其它相关文章!

关键词: 边缘检测 数字图像处理 特征提取 滤波效果 可以看出

上一篇:

下一篇:

X 关闭

X 关闭