您的位置:首页 > 编程语言 > Python开发

阿齐兹的PyCV学习笔记——SciPy

2018-03-02 14:19 295 查看

SciPy

[SciPy][4]是基于Python生态的开源工具包,可用于数值运算。SciPy可以实现很多高效操作,例如数值积分、优化、统计、信号处理,以及图像处理功能

图像模糊本质上就是将灰度图像和一个高斯核进行卷积操作,通常是其他图像处理操作的一部分,例如图像插值操作、兴趣点计算

SciPy中有做滤波操作的scipy.ndimage.filters模块,该模块使用快速一维分离的方式计算卷积

使用guassian_filter()函数可以进行高维度的高斯滤波,第一个参数是数组式的对象,第二个参数表示标准差,标准差越大图像丢失的细节越多

from PIL import Image
from numpy import *
from scipy.ndimage import filters

im = array(Image.open('C:/Users/0AQZ0/Documents/exercisecode/Python/PyCV/Images/002.jpg').convert('L'))
im2 = filters.gaussian_filter(im,5)


模糊一张彩色图像,需要对每一个颜色通道进行高斯模糊:

im = array(Image.open('C:/Users/0AQZ0/Documents/exercisecode/Python/PyCV/Images/001.jpg'))
im2 = zeros(im.shape)
#print(im.shape)
for i in range(3):
im2[:,:,i] = filters.gaussian_filter(im[:,:,i],5)
im2 = unit8(im2)
#or
#im2 = array(im,'unit8')


图像强度的变化可以用灰度图像的x和y方向导数(或者彩色图像每个颜色通道的方向导数)描述

图像的梯度向量有两个重要的属性,一是梯度的大小,描述了图像强度变化的强弱,意识梯度的角度,描述了强度变化的最大方向

NumPy中的artan2()方法可以返回弧度表示的角度

图像导数大多数可以通过卷积实现,选择Prewitt滤波器或者Sobel滤波器

使用scipy.ndimage.filters模块中的sobel()方法计算方向导数,第一个参数是数组式的对象,第二个可选参数是计算时沿着的轴(选择x或y方向导数),第三个参数是存储输出的数组

from PIL import Image
from numpy import *
from scipy.ndimage import filters

im = array(Image.open('C:/Users/0AQZ0/Documents/exercisecode/Python/PyCV/Images/001.jpg').convert('L'))

#Sobel滤波器
imx = zeros(im.shape)
filters.sobel(im,1,imx)

imy = zeros(im.shape)
filters.sobel(im,0,imy)

magnitude = sqrt(imx**2+imy**2)


缺陷:滤波器尺度随图像的分辨率变化而变化

使用guassian_filter()函数计算高斯导数,第一个参数还是数组式对象,第二个参数还是标准差,第三个参数指定对哪个方向计算哪种类型的导数,第四个参数是存储输出的对象

sigma = 5

imx = zeros(im.shape)
filters.gaussian_filter(im,(sigma,sigma),(0,1),imx)

imy = zeros(im.shape)
filters.gaussian_filter(im,(sigma,sigma),(1,0),imy)


优点:高斯导数滤波器在图像噪声更稳健,可以在任意尺度上计算导数

形态学研究度量和分析基本形状的图像处理方法,常用于处理二值图像,也能够用于灰度图像。二值图像是指在计算物体数量或者度量大小时对一副图像进行阈值化后的结果,图像的每个像素只能取两个值:0和1

scipy.ndimage中的morpholopy模块能进行形态学操作,measurements模块可以实现二值图像的计数和度量

from scipy.ndimage import measurements,morphology
from numpy import *
from PIL import Image

im = array(Image.open('C:/Users/0AQZ0/Documents/exercisecode/Python/PyCV/Images/001.jpg').convert('L'))
im = 1*(im<128) #阈值化处理

labels, nbr_objects = measurements.label(im)
print('Number of objects:', nbr_objects)


measurements模块中的label()方法可以给二值图像的中特征贴标签,第一个参数是数组式对象,任何非零值会被记为特征而零值会被记为背景,第一个返回值是一个数组,数组中每个特征都被赋予一个标签,第二个返回值是找到的物体的个数

使用binary_opening()方法进行二进制开(binary open)操作来更好地分离对象,第一个参数是数组式对象,第二个参数指定一个数组结构元素,表示以一个像素为中心时使用哪些相邻像素,第三个参数指定迭代的次数

im_open = morphology.binary_opening(im,ones((9,5)),iterations=2)

label_open,nbr_objects_open = measurements.label(im_open)
print('Number of objects:', nbr_objects_open)


binary_closing()方法实现相反的操作

scipy.ndimage模块的参考文档:https://docs.scipy.org/doc/scipy/reference/ndimage.html

使用scipy.io模块中的loadmat()方法读取Matlab的.mat文件格式存储的数据,返回的是一个字典,字典的键是文件中的变量名,对应存储的数据

data = scipy.io.loadmat('test.mat')


使用savemat()方法将数据保存成Matlab的.mat文件格式,第一个参数是文件名,第二个参数是包含数据的字典

data = {}
data['x'] = x
scipy.io.savemat('test.mat',data)


scipy.io模块的参考文档:https://docs.scipy.org/doc/scipy/reference/io.html

使用scipy.misc模块中的imsave()方法将数组直接保存为图像文件

from scipy.misc import imsave
imsave('test.jpg',im)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 图像处理