python数字图像处理之图像简单滤波实现

目录
  • 引言
  • 1、sobel算子
  • 2、roberts算子
  • 3、scharr算子
  • 4、prewitt算子
  • 5、canny算子
  • 6、gabor滤波
  • 7、gaussian滤波
  • 8.median
  • 9、水平、垂直边缘检测
  • 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数字图像处理简单滤波的资料请关注我们其它相关文章!

(0)

相关推荐

  • python数字图像处理图像的绘制详解

    目录 正文 一.用figure函数和subplot函数分别创建主窗口与子图 二.用subplots来创建显示窗口与划分子图 三.其它方法绘图并显示 正文 实际上前面我们就已经用到了图像的绘制,如: io.imshow(img) 这一行代码的实质是利用matplotlib包对图片进行绘制,绘制成功后,返回一个matplotlib类型的数据.因此,我们也可以这样写: import matplotlib.pyplot as plt plt.imshow(img) imshow()函数格式为: matp

  • python数字图像处理数据类型及颜色空间转换

    目录 一.图像数据类型及转换 1.unit8转float 2.float转uint8 二.颜色空间及其转换 例:rgb转灰度图 其它的转换 例:rgb转hsv 一.图像数据类型及转换 在skimage中,一张图片就是一个简单的numpy数组,数组的数据类型有很多种,相互之间也可以转换.这些数据类型及取值范围如下表所示: Data type Range uint8 0 to 255 uint16 0 to 65535 uint32 0 to 232 float -1 to 1 or 0 to 1

  • python数字图像处理实现图像的形变与缩放

    目录 skimage的transform模块 1.改变图片尺寸resize 2.按比例缩放rescale 3.旋转 rotate 4.图像金字塔 skimage的transform模块 图像的形变与缩放,使用的是skimage的transform模块,函数比较多,功能齐全. 1.改变图片尺寸resize 函数格式为: skimage.transform.resize(image,output_shape) image: 需要改变尺寸的图片 output_shape: 新的图片尺寸 from sk

  • python数字图像处理之图像的批量处理

    目录 正文 图片集合函数 批量读取 批量转换为灰度图 批量保存 正文 有些时候,我们不仅要对一张图片进行处理,可能还会对一批图片处理.这时候,我们可以通过循环来执行处理,也可以调用程序自带的图片集合来处理. 图片集合函数 skimage.io.ImageCollection(load_pattern,load_func=None) 这个函数是放在io模块内的,带两个参数,第一个参数load_pattern, 表示图片组的路径,可以是一个str字符串.第二个参数load_func是一个回调函数,我

  • python数字图像处理像素的访问与裁剪示例

    目录 引言 引言 图片读入程序中后,是以numpy数组存在的.因此对numpy数组的一切功能,对图片也适用.对数组元素的访问,实际上就是对图片像素点的访问. 彩色图片访问方式为: img[i,j,c] i表示图片的行数,j表示图片的列数,c表示图片的通道数(RGB三通道分别对应0,1,2).坐标是从左上角开始. 灰度图片访问方式为: gray[i,j] 例1:输出小猫图片的G通道中的第20行30列的像素值 from skimage import io,data img=data.chelsea(

  • python数字图像处理skimage读取显示与保存图片

    目录 引言 一.从外部读取图片并显示 二.程序自带图片 三.保存图片 四.图片信息 引言 skimage提供了io模块,顾名思义,这个模块是用来图片输入输出操作的.为了方便练习,也提供一个data模块,里面嵌套了一些示例图片,我们可以直接使用. 引入skimage模块可用: from skimage import io 一.从外部读取图片并显示 读取单张彩色rgb图片,使用skimage.io.imread(fname)函数,带一个参数,表示需要读取的文件路径.显示图片使用skimage.io.

  • python数字图像处理之对比度与亮度调整示例

    目录 skimage包的exposure模块 1.gamma调整 2.log对数调整 3.判断图像对比度是否偏低 4.调整强度 skimage包的exposure模块 图像亮度与对比度的调整,是放在skimage包的exposure模块里面 1.gamma调整 对原图像的像素,进行幂运算,得到新的像素值.公式中的g就是gamma值. 如果gamma>1, 新图像比原图像暗 如果gamma<1,新图像比原图像亮 函数格式为:skimage.exposure.adjust_gamma(image,

  • python数字图像处理之图像简单滤波实现

    目录 引言 1.sobel算子 2.roberts算子 3.scharr算子 4.prewitt算子 5.canny算子 6.gabor滤波 7.gaussian滤波 8.median 9.水平.垂直边缘检测 10.交叉边缘检测 引言 对图像进行滤波,可以有两种效果:一种是平滑滤波,用来抑制噪声:另一种是微分算子,可以用来检测边缘和特征提取. skimage库中通过filters模块进行滤波操作. 1.sobel算子 sobel算子可用来检测边缘 函数格式为:skimage.filters.so

  • python数字图像处理之基本形态学滤波

    目录 引言 1.膨胀(dilation) 2.腐蚀(erosion) 3.开运算(opening) 4.闭运算(closing) 5.白帽(white-tophat) 6.黑帽(black-tophat) 引言 对图像进行形态学变换.变换对象一般为灰度图或二值图,功能函数放在morphology子模块内. 1.膨胀(dilation) 原理:一般对二值图像进行操作.找到像素值为1的点,将它的邻近像素点都设置成这个值.1值表示白,0值表示黑,因此膨胀操作可以扩大白色值范围,压缩黑色值范围.一般用来

  • python数字图像处理之图像自动阈值分割示例

    目录 引言 1.threshold_otsu 2.threshold_yen 3.threshold_li 4.threshold_isodata 5.threshold_adaptive 引言 图像阈值分割是一种广泛应用的分割技术,利用图像中要提取的目标区域与其背景在灰度特性上的差异,把图像看作具有不同灰度级的两类区域(目标区域和背景区域)的组合,选取一个比较合理的阈值,以确定图像中每个像素点应该属于目标区域还是背景区域,从而产生相应的二值图像. 在skimage库中,阈值分割的功能是放在fi

  • python数字图像处理之高级滤波代码详解

    本文提供许多的滤波方法,这些方法放在filters.rank子模块内. 这些方法需要用户自己设定滤波器的形状和大小,因此需要导入morphology模块来设定. 1.autolevel 这个词在photoshop里面翻译成自动色阶,用局部直方图来对图片进行滤波分级. 该滤波器局部地拉伸灰度像素值的直方图,以覆盖整个像素值范围. 格式:skimage.filters.rank.autolevel(image, selem) selem表示结构化元素,用于设定滤波器. from skimage im

  • Python OpenCV图像处理之图像滤波特效详解

    目录 1分类 2邻域滤波 2.1线性滤波 2.2非线性滤波 3频域滤波 3.1低通滤波 3.2高通滤波 1 分类 图像滤波按图像域可分为两种类型: 邻域滤波(Spatial Domain Filter),其本质是数字窗口上的数学运算.一般用于图像平滑.图像锐化.特征提取(如纹理测量.边缘检测)等,邻域滤波使用邻域算子——利用给定像素周围像素值以决定此像素最终输出的一种算子 频域滤波(Frequency Domain Filter),其本质是对像素频率的修改.一般用于降噪.重采样.图像压缩等. 按

  • python数字图像处理之边缘轮廓检测

    目录 引言 1.查找轮廓(find_contours) 2.逼近多边形曲线 引言 在前面的python数字图像处理简单滤波 中,我们已经讲解了很多算子用来检测边缘,其中用得最多的canny算子边缘检测. 本篇我们讲解一些其它方法来检测轮廓. 1.查找轮廓(find_contours) measure模块中的find_contours()函数,可用来检测二值图像的边缘轮廓. 函数原型为: skimage.measure.find_contours(array, level) array: 一个二值

  • python数字图像处理之估计噪声参数

    估计噪声参数 周期噪声的参数通常是通过检测图像的傅里叶谱来估计的. 只能使用由传感器生成的图像时,可由一小片恒定的背景灰度来估计PDF的参数. 来自图像条带的数据的最简单用途是,计算灰度级的均值和方差.考虑由 S S S表示的一个条带(子图像),并令 P S ( z i ) P_{S}(z_i) PS​(zi​), i = 0 , 1 , 2 , - , L − 1 i = 0, 1, 2, \dots, L-1 i=0,1,2,-,L−1表示 S S S中的像素灰度的概率估计(归一化直方图值)

随机推荐