基础读写

基础读写

图片读取

读取单张彩色 rgb 图片,使用 skimage.io.imread(fname) 函数,带一个参数,表示需要读取的文件路径。显示图片使用 skimage.io.imshow(arr) 函数,带一个参数,表示需要显示的 arr 数组(读取的图片以 numpy 数组形式计算)。

from skimage import io
img=io.imread('d:/dog.jpg')
io.imshow(img)

读取单张灰度图片,使用 skimage.io.imread(fname,as_grey=True) 函数,第一个参数为图片路径,第二个参数为 as_grey, bool 型值,默认为 False。

from skimage import io
img=io.imread('d:/dog.jpg',as_grey=True)
io.imshow(img)

内置图片

skimage 程序自带了一些示例图片,如果我们不想从外部读取图片,就可以直接使用这些示例图片:

astronaut     航员图片      coffee     一杯咖啡图片
lena          lena美女图片   camera   拿相机的人图片
coins           硬币图片     moon    月亮图片
checkerboard   棋盘图片       horse   马图片
page   书页图片              chelsea   小猫图片
hubble_deep_field    星空图片   text   文字图片
clock    时钟图片   immunohistochemistry   结肠图片

显示这些图片可用如下代码,不带任何参数:

from skimage import io, data
img=data.lena()
io.imshow(img)

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

from skimage import data_dir
print(data_dir)

保存图片

使用 io 模块的 imsave(fname,arr) 函数来实现。第一个参数表示保存的路径和名称,第二个参数表示需要保存的数组变量。

from skimage import io,data
img=data.chelsea()
io.imshow(img)
io.imsave('d:/cat.jpg',img)

保存图片的同时也起到了转换格式的作用。如果读取时图片格式为 jpg 图片,保存为 png 格式,则将图片从 jpg 图片转换为 png 图片并保存。

图片属性

其他的 skimage 中常用的图片属性的方法有:

from skimage import io, data
img = data.chelsea()
io.imshow(img)
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()) # 像素平均值
print(img[0][0])# 图像的像素值

# 获取图像的灰度值范围
width = img.size[0]
height = img.size[1]

# 输出图片的像素值
count = 0
for i in range(0, width):
    for j in range(0, height):
        if img.getpixel((i, j))>=0 and img.getpixel((i, j))<=255:
            count +=1
print count
print(height*width)

图像的批量处理

有些时候,我们不仅要对一张图片进行处理,可能还会对一批图片处理。这时候,我们可以通过循环来执行处理,也可以调用程序自带的图片集合来处理。

批量读取

图片集合函数为:

skimage.io.ImageCollection(load_pattern,load_func=None)

这个函数是放在 io 模块内的,带两个参数,第一个参数 load_pattern, 表示图片组的路径,可以是一个 str 字符串。第二个参数 load_func 是一个回调函数,我们对图片进行批量处理就可以通过这个回调函数实现。回调函数默认为 imread(),即默认这个函数是批量读取图片。先看一个例子:

import skimage.io as io
from skimage import data_dir
str=data_dir + '/*.png'
coll = io.ImageCollection(str)
print(len(coll))

显示结果为 25, 说明系统自带了 25 张 png 的示例图片,这些图片都读取了出来,放在图片集合 coll 里。如果我们想显示其中一张图片,则可以在后加上一行代码:

io.imshow(coll[10])

如果一个文件夹里,我们既存放了一些 jpg 格式的图片,又存放了一些 png 格式的图片,现在想把它们全部读取出来,该怎么做呢?

import skimage.io as io
from skimage import data_dir
str='d:/pic/*.jpg:d:/pic/*.png'
coll = io.ImageCollection(str)
print(len(coll))

注意这个地方’d:/pic/.jpg:d:/pic/.png’,是两个字符串合在一起的,第一个是’d:/pic/.jpg’, 第二个是’d:/pic/.png’,合在一起后,中间用冒号来隔开,这样就可以把 d:/pic/文件夹下的 jpg 和 png 格式的图片都读取出来。如果还想读取存放在其它地方的图片,也可以一并加进去,只是中间同样用冒号来隔开。

批量处理

io.ImageCollection() 这个函数省略第二个参数,就是批量读取。如果我们不是想批量读取,而是其它批量操作,如批量转换为灰度图,那又该怎么做呢?那就需要先定义一个函数,然后将这个函数作为第二个参数,如:

from skimage import data_dir,io,color
def convert_gray(f):
       rgb=io.imread(f)
       return color.rgb2gray(rgb)

str=data_dir+'/*.png'
coll = io.ImageCollection(str,load_func=convert_gray)
io.imshow(coll[10])

视频处理

这种批量操作对视频处理是极其有用的,因为视频就是一系列的图片组合:

from skimage import data_dir,io,color
class AVILoader:
        video_file = 'myvideo.avi'
        def __call__(self, frame):
                return video_read(self.video_file, frame)
avi_load = AVILoader()

frames = range(0, 1000, 10) # 0, 10, 20, ...ic =io.ImageCollection(frames, load_func=avi_load)

这段代码的意思,就是将 myvideo.avi 这个视频中每隔 10 帧的图片读取出来,放在图片集合中。得到图片集合以后,我们还可以将这些图片连接起来,构成一个维度更高的数组,连接图片的函数为:

skimage.io.concatenate_images(ic)

带一个参数,就是以上的图片集合,如:

from skimage import data_dir,io,color
coll = io.ImageCollection('d:/pic/*.jpg')
mat=io.concatenate_images(coll)

使用 concatenate_images(ic)函数的前提是读取的这些图片尺寸必须一致,否则会出错。我们看看图片连接前后的维度变化:

from skimage import data_dir,io,color
coll = io.ImageCollection('d:/pic/*.jpg')
print(len(coll)) #连接的图片数量
print(coll[0].shape) #连接前的图片尺寸,所有的都一样
mat=io.concatenate_images(coll)
print(mat.shape) #连接后的数组尺寸

2
(870, 580, 3)
(2, 870, 580, 3)

可以看到,将 2 个 3 维数组,连接成了一个 4 维数组。如果我们对图片进行批量操作后,想把操作后的结果保存起来,也是可以办到的。例:把系统自带的所有 png 示例图片,全部转换成 256256 的 jpg 格式灰度图,保存在 d:/data/文件夹下。改变图片的大小,我们可以使用 tranform 模块的 resize()函数:

from skimage import data_dir,io,transform,color
import numpy as np
def convert_gray(f):
        rgb=io.imread(f) #依次读取rgb图片
        gray=color.rgb2gray(rgb) #将rgb图片转换成灰度图
        dst=transform.resize(gray,(256,256)) #将灰度图片大小转换为256*256
        return dst str=data_dir+'/*.png'
coll = io.ImageCollection(str,load_func=convert_gray)
for i in range(len(coll)):
    io.imsave('d:/data/'+np.str(i)+'.jpg',coll[i]) #循环保存图片
上一页
下一页