前言:

基于python的图片处理包还是很多的,比如PIL,Pillow, opencv, scikit-image等。其中,PIL和Pillow只提供最基础的数字图像处理,功能有限;opencv本质上是一个c++库,只是提供了python的接口,官方更新速度非常慢,而且安装很不容易。综合来看,scikit-image是基于scipy的一款图像处理包,它功能非常齐全,同时将图片作为numpy数组进行处理,几乎集合了matlab的所有图像处理功能,在数据的处理方式,函数名字等方面对matlab的模仿姿势非常到位。

更为重要的是,作为python的一个图像处理包,这个包是完全开源免费的,而且可以依托于python强大的功能,与tensorflow等软件配合使用于主流的深度学习等领域。因此,用scikit-image进行图像处理是一个非常好的选择,matlab能干的事情它都能干,matlab不能干的事情他也可以,个人认为在数字图像处理领域,它是完全可以代替matlab的。价格昂贵且界面并不怎么美观的matlab简直要哭晕在厕所。

当然,如果有一定的编程基础,学习这个包最好的方法是去看官方文档,scikit-image官方文档,对于初学者来说,可以先看以下通俗版的介绍入门。

一、安装。

这个包使用pip安装会报错,推荐使用离线安装,具体安装方法参见:windows下python3安装cv2,skimage(scikit-image)模块的方法

二、导入scikit-image包

这个包有非常多的子模块,分别负责不同的功能,所以在导入的时候,对于不同的功能可以分别导入不同的模块,各模块的功能如下:

子模块名称 主要实现功能
io 读取、保存和显示图片或视频
data 提供一些测试图片和样本数据
color 颜色空间变换
filters 图像增强、边缘检测、排序滤波器、自动阈值等
draw 操作于numpy数组上的基本图形绘制,包括线条、矩形、圆和文本等
transform 几何变换或其它变换,如旋转、拉伸和拉东变换等
morphology 形态学操作,如开闭运算、骨架提取等
exposure 图片强度调整,如亮度调整、直方图均衡等
feature 特征检测与提取等
measure 图像属性的测量,如相似性或等高线等
segmentation 图像分割
restoration 图像恢复
util 通用函数

下边分别叙述

from skimage import 函数名

1、读取,显示图像。(用到的模块:io)

from skimage import io
img=io.imread('图片路径',as_grey = bool值)
io.imshow(img)

其中,as_grey属性如果是True,则读入彩图之后自动转换成灰度图像,否则读入彩图,默认为False。
读入图片之后,可以获取图片的各种属性

print(type(img))  #显示类型
print(img.shape)  #显示尺寸
print(img.shape[0])  #图片宽度
print(img.shape[1])  #图片高度
print(img.shape[2])  #图片通道数
print(img.size)   #显示总像素个数
print(img.max())  #最大像素值
print(img.min())  #最小像素值
print(img.mean()) #像素平均值

2、保存图像

读取时matlab的语法几乎相同,写入图片文件时,将matlab中的imwrite()函数改成imsave()函数即可。

from skimage import io,data
img=io.imread('图片路径',as_grey = bool值)#以上的读取图片函数
io.imshow(img)
io.imsave('保存路径',img)

保存图片的时候也可以随便保存为不同的格式(jpg,png等)。

对于二值图像来说,用io.imsave()函数直接保存会得到一张黑色的图像,个人觉得是因为保存的时候程序依旧以为图片的数值范围是0~255,需要转换一下数据类型,有知道的更方便的解决办法的可以在评论区交流

3、图像的裁剪,缩放。(用到的模块:transform)

1)改变图片尺寸resize

同样,提供了skimage.transform.resize(image, output_shape)函数,和matlab里重新调整图像大小的语法没有丝毫区别。

image: 需要改变尺寸的图片

output_shape: 新的图片尺寸

from skimage import transform,io
import matplotlib.pyplot as plt#用于显示图像
img=io.imread('图片路径',as_grey = bool值)
dst=transform.resize(img, (长, 宽))
plt.figure('resize')
plt.subplot(121)
plt.title('before resize')
plt.imshow(img,plt.cm.gray)
plt.subplot(122)
plt.title('before resize')
plt.imshow(dst,plt.cm.gray)
plt.show()

可以将图片变成80*60大小。

4、图片的连通域标记与选择(用到的模块:measure)

1)获取连通域及其属性

获取图像连通域是图像处理中比较高级的功能,matlab可以通过函数直接获取图像的连通域,在skimage包中,我们同样可以采用measure子模块下的label()函数来实现相同的效果。

函数格式:

from skimage import measure
labels = measure.label(二值图像,connectivity=None)
  • connectivity表示连接的模式,1代表4邻接,2代表8邻接。

返回一个与图像同样大小的数组,背景都是0,对于前景的连通域从1开始往上标记。

当然,此时做到的只是对连通域进行标记给人看,如果想分别对每一个连通区域进行操作,比如计算面积、外接矩形、凸包面积等,则需要调用measure子模块的regionprops()函数。在同上导入measure包之后,该函数格式为:
label_att = measure.regionprops(label_image)
这样,我们就可以从“label_att”这个数组里获取图像里任意一个连通域的属性,属性列表如下:

属性名称 类型 描述
area int 区域内像素点总数
bbox tuple 边界外接框(min_row, min_col, max_row, max_col)
centroid array 质心坐标
convex_area int 凸包内像素点总数
convex_image ndarray 和边界外接框同大小的凸包
coords ndarray 区域内像素点坐标
Eccentricity float 离心率
equivalent_diameter float 和区域面积相同的圆的直径
euler_number int 区域欧拉数
extent float 区域面积和边界外接框面积的比率
filled_area int 区域和外接框之间填充的像素点总数
perimeter float 区域周长
label int 区域标记

这里需要注意的是:measure.label函数获取的连通域背景是0,前景的连通域其实是从1开始计算,而measure.regionprops函数获取的连通域不包含背景,前景的连通域属性就是从0开始的。
下面举一个例子:
随便找一张图片如下:

运行代码如下:

from skimage import io,filters,measure
img = io.imread('test.jpg',as_grey=True) #读取图片
thresh = filters.threshold_otsu(img)  #用otsu算法确定最佳分割阈值
bwimg =(img>=(thresh))  #用阈值进行分割,生成二值图像
labels = measure.label(bwimg)  #标记连通域
label_att = measure.regionprops(labels) #获取各个连通域的属性。


可以看到labels找出了5个连通域,而label_att却只有四个连通域的属性,这是因为不包括背景的连通域的属性。

2)删除小块区域

图片难免会有噪声,在以上获取连通域处理的时候,噪点也会算作是一个很小的连通域,morphology子模块的remove_small_objects()函数提供了方便的噪点去除功能。函数格式(一般与上一个函数连用):

from skimage import morphology
img1 = morphology.remove_small_objects(ar, min_size=要删除的连通域大小阈值, connectivity=1,in_place=False)

img1是删除了小于连通域面积阈值的二值图像。
其中,各参数含义如下:

  • ar: 上边的获取的标记好连通域的数组
  • connectivity: 邻接模式,1表示4邻接,2表示8邻接
  • in_place: bool型值,如果为True,表示直接在输入图像中删除小块区域,否则进行复制后再删除。默认为False.

附录:

scikit-image这个包对matlab的模仿甚至还体现在很多细节上,比如说,matlab会自带一些图片让用户进行测试,如果我们不想从外部读取图片,就可以直接使用这些示例图片对函数进行测试,scikit-image包同样也有如下功能:
而且使用方法也很简单:

from skimage import io,data
img=data.lena()
io.imshow(img)
astronaut 宇航员图片
coffee 一杯咖啡图片
lena lena美女图片
camera 拿相机的人图片
coins 硬币图片
moon 月亮图片
checkerboard 棋盘图片
horse 马图片
page 书页图片
chelsea 小猫图片
hubble_deep_field 星空图片
text 文字图片
clock 时钟图片
immunohistochemistry 结肠图片

图片名对应的就是函数名,这些示例图片存放在skimage的安装目录下面,路径名称为data_dir,也可以将这个路径打印出来:

from skimage import data_dir
print(data_dir)

参考资料:

1 . python数字图像处理(18):高级形态学处理

2. python skimage图像处理(一)有一些图片裁剪相关的内容

图像处理中媲美matlab的python包——scikit-image(skimage)包的用法详解相关推荐

  1. Python setattr()、getattr()、hasattr()函数用法详解

    Python setattr().getattr().hasattr()函数用法详解 除了前面介绍的几个类中的特殊方法外,本节再介绍 3 个常用的函数,分别是 hasattr().getattr() ...

  2. Python中下划线 _ 的最全用法详解

    Python中下划线 _ 的最全用法详解 '_'是什么? _在python中可以作为一个标识符,用于定义变量和方法唯一名称.同时它也是Python中的一个软关键字,指在某些特定上下文中保留的关键字.截 ...

  3. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

  4. python中 for i in range(10)_Python for i in range ()用法详解

    for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...

  5. Python实用技巧:global关键字的用法详解

    这篇文章主要介绍了python global关键字的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下: 想要更好的了解global关键字,首先 ...

  6. python的reshape方法_numpy库reshape用法详解

    numpy.reshape(重塑) 给数组一个新的形状而不改变其数据 numpy.reshape(a, newshape, order='C')参数: a:array_like 要重新形成的数组. n ...

  7. python count函数代码_python count函数用法详解_后端开发

    fgetc函数的作用详解_后端开发 fgetc函数的作用是从指定文件读入一个字符,要求文件的打开方式必须是以读或读写的方式或者追加的方 式,只写方式是不能读的. 在python中可以使用"c ...

  8. linux中的su-命令的功能,linux su命令参数及用法详解(linux切换用户命令)

    linux su命令参数及用法详解(linux切换用户命令) 发布时间:2012-07-21 12:12:39   作者:佚名   我要评论 su的作用是变更为其它使用者的身份,超级用户除外,需要键入 ...

  9. emit python 作用_PyQT5 emit 和 connect的用法详解

    对于PyQT4, PyQT5在一些使用上有着比较明显的变化有很大的变化,让人惊讶是在emit和connect上的一些变化比较有意思,相信也是QT为了更好的和Python相结合做的改进. 先上一张图: ...

最新文章

  1. php 函数静态变量,php 函数中静态变量使用的问题实例分析
  2. 华为鸿蒙加快完善,替换安卓!华为鸿蒙OS生态持续扩大:或适配高通平台
  3. html中属性的作用,html的标签中 unselectable=on 属性的作用
  4. vsftpd FTP Server ‘ls.c‘ 远程拒绝服务漏洞(CVE-2011-0762)漏洞修复方案
  5. 软件工程——理论、方法与实践 之 面相对象分析
  6. 【python】-- Socket接收大数据
  7. python3 自定义排序_Python3中的自定义排序
  8. Linux集群在银行信息化中的应用(2)
  9. golang GUI编程之walk初建
  10. 三菱FX5U和变频器走485通讯连接,程序是FB块写好的,硬件一样可以直接调用
  11. 【Python3】简易爬虫实现船舶的MMSI的获取
  12. 微处理器内部结构(寄存器)
  13. 企业财务报表分析【3】
  14. [MCM] MTSP问题的GA求解 多目标优化 (单起点 与 多起点)
  15. unity二維碼生成(新)
  16. 又来神器推荐嘞xshell与winSCP
  17. 综合布线系统工程中计算机插座的标识符号是,TD是综合布线系统工程中计算机插座的标识符号。...
  18. Linux的进程优先级-邹立巍
  19. 【java8】并行流Stream
  20. react-native抽奖转盘制作

热门文章

  1. 期末android备忘录代码,【私人备忘录】Android P 去电代码流程
  2. 高频电子线路——使用multisim仿真实验:高频小信号谐振放大器
  3. 所有老板看完都会说一句“卧槽”!一套营销方案,彻底颠覆你思维!
  4. STM32F1系列超声波测距程序
  5. Carbon中文使用手册
  6. 最神秘公司Magic Leap全新Demo曝光 深度长文揭秘增强现实黑科技
  7. ios提醒事项同步日历scriptable代码
  8. wvr450g设置虚拟服务器,TP-Link TL-WVR450G V3 无线路由器一对一NAT映射设置方法
  9. PHP初级程序员能力测试参考答案
  10. docker webdav_跨主机容器共享数据卷(webdav 双向同步)