SciPy中两个模块:io 和misc的使用

1、读写.mat文件

如果你有一些数据,或者在网上下载到一些有趣的数据集,这些数据以Matlab的.mat 文件格式存储,那么可以使用scipy.io 模块进行读取。

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

上面代码中,data 对象包含一个字典,字典中的键对应于保存在原始.mat 文件中的变量名。由于这些变量是数组格式的,因此可以很方便地保存到.mat 文件中。

你仅需创建一个字典(其中要包含你想要保存的所有变量),然后使用savemat() 函数:

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

因为上面的脚本保存的是数组x,所以当读入到Matlab 中时,变量的名字仍为x。

2、以图像形式保存数组

因为我们需要对图像进行操作,并且需要使用数组对象来做运算,所以将数组直接保存为图像文件1 非常有用。本书中的很多图像都是这样的创建的。

imsave() 函数可以从scipy.misc 模块中载入。要将数组im 保存到文件中,可以使用下面的命令:

from scipy.misc import imsave
imsave('test.jpg',im) 

scipy.misc 模块同样包含了著名的Lena 测试图像:

lena = scipy.misc.lena() 

该脚本返回一个512×512 的灰度图像数组。

补充:图像预处理的几个模块:PIL、scipy.misc、OpenCV、TensorFlow

1、PIL库

Python Imaging Library (PIL)是PythonWare公司提供的免费的图像处理工具包,是python下的图像处理模块,支持多种格式,并提供强大的图形与图像处理功能。

虽然在这个软件包上要实现类似MATLAB中的复杂的图像处理算法并不太适合,但是Python的快速开发能力以及面向对象等等诸多特点使得它非常适合用来进行原型开发。

对于简单的图像处理或者大批量的简单图像处理任务,python+PIL是很好的选择。

from PIL import Image,ImageEnhance     #调用库

im = Image.open("E:/testdata/01.jpg")  #打开图片
print (im.format, im.size, im.mode)    #打印图像信息
'''
  format:图像属性,如png,jpeg
  size:图像分辨率
  mode:
        1     1位像素,黑和白,存成8位的像素
	L	8位像素,黑白
	P	8位像素,使用调色板映射到任何其他模式
	RGB	3× 8位像素,真彩
	RGBA	4×8位像素,真彩+透明通道
	CMYK	4×8位像素,颜色隔离
	YCbCr	3×8位像素,彩色视频格式
	I	32位整型像素
	F	32位浮点型像素
'''
new_im = im.convert('L')                       # 将图像转为其它模式
new_im.save("E:/testdata/02.png")              # 保存图像,可以改变图像格式

box = (0, 0, 500, 500)                         # 确定拷贝区域大小(左上角坐标,右下角坐标)
region = im.crop(box)                          # 将im表示的图片对象拷贝到region中,大小为box

region = im.resize((400, 400),Image.ANTIALIAS) # 改变图像尺寸
'''
  函数原型:im.resize(size, filter):
    size:所要求的尺寸,是一个二元组:(width, height)
    filter:为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一
'''

im_30 = im.rotate(30, Image.NEAREST,1)         # 图像逆时针旋转30度
'''
  函数原型:im.rotate(angle,filter=NEAREST, expand=0) ⇒ image
    angle:逆时针旋转的角度值
    filter:NEAREST、BILINEAR或者BICUBIC之一
    expand,如果为true,表示输出图像足够大,可以装载旋转后的图像。
            如果为false或者缺省,则输出图像与输入图像尺寸一样大。
'''
r,g,b=im.split()                             # 分割成三个通道,此时r,g,b分别为三个图像对象。
new_im=Image.merge("RGB",(r,g,b))            # 将r,g,b,三通道合并

example = np.random.randint(0,255,size=(300,300,3))  # numpy数组
new_img = Image.fromarray(example, 'RGB')      # 将numpy的narray转为Image类,第二个参数为mode

new_im.show()                                # 显示图像
# ---------将索引图变成彩色图-------------------
cmap = [np.random.randint(0, 255) for x in range(768)]  # 生成色彩隐射图,大小需要为256*3=768
img = img.convert('P')                       # 转换为P模式
img.putpalette(cmap)                         # 给索引图着色
img.show()                                   # 显示图像

#----------图像增强-----------------------
# 增强亮度
enhanceImg = ImageEnhance.Brightness(img)
# 图片尖锐化
enhanceImg = ImageEnhance.Sharpness(img)
# 对比度增强
enhanceImg = ImageEnhance.Contrast(img)
# 色彩增强
enhanceImg = ImageEnhance.Color(img)
enhanceImg.enhance(2.0).show()    # 2.0表示增强两倍,1.0表示不增强。
 

注意:Image只接收uint8类型的数据,如果传入float32类型的数据就会出错。

2、scipy.misc

python在科学计算领域有三个非常受欢迎库,numpy、SciPy、matplotlib。

numpy是一个高性能的多维数组的计算库,SciPy是构建在numpy的基础之上的,它提供了许多的操作numpy的数组的函数。SciPy是一款方便、易于使用、专为科学和工程设计的python工具包,它包括了统计、优化、整合以及线性代数模块、傅里叶变换、信号和图像图例,常微分方差的求解等。

下面就简单的介绍一下SciPy在图像处理方面的应用,如果专业做图像处理当然还是建议使用opencv。

from scipy.misc import imread,imsave,imresize
import scipy.io

img = imread("E:/testdata/01.jpg")    # 读取图像
print (img)                           # numpy 数组

img_type = img.dtype                  # 获取图片的数据类型
print(img_type)                       # uint8

img_shape = img.shape                 # 获取图片的大小
print(img_shape)                      # (310, 493, 3)  

newimg=imresize(img,(100,100))        # 图像裁剪
'''
  函数原型:imresize(arr, size, interp='bilinear', mode=None)
    arr:ndarray类型的图像
    size:裁剪后的尺寸,是一个元组
    interp : 插值方法,为‘nearest', ‘lanczos', ‘bilinear', ‘bicubic' or ‘cubic'
    mode:PIL中的图像模式 (‘P', ‘L'等等),在resize之前先转换模式
'''

imsave("timg_color.png",newimg)       # 保存图片

# ------------使用scipy加载.mat文件-------------
data = scipy.io.loadmat('Data.mat')
print (data)                         # 一般data为一个字典类型的数据

3、OpenCV

OpenCV是一个开放源代码的计算机视觉应用平台,由英特尔公司下属研发中心俄罗斯团队发起该项目,开源BSD证书,OpenCV的目标是实现实时计算机视觉,,是一个跨平台的计算机视觉库。从开发之日起就得到了迅猛发展,获得了众多公司和业界大牛的鼎力支持与贡献,因为是BSD开源许可,因此可以免费应用在科研和商业应用领域。

OpenCV中已经包含如下应用领域功能:二维和三维特征工具箱、运动估算、人脸识别系统、姿势识别、人机交互、移动机器人、运动理解、对象鉴别、分割与识别、立体视觉、运动跟踪、增强现实(AR技术)。基于上述功能实现需要,OpenCV中还包括以下基于统计学机器学习库:Boosting算法、Decision Tree(决策树)学习、Gradient Boosting算法、EM算法(期望最大化)、KNN算法、朴素贝叶斯分类、人工神经网络、随机森林、支掌向量机。

编程语言:OpenCV中多数模块是基于C++实现,其中有少部分是基于C语言实现,当前OpenCV提供的SDK已经支持C++、Java、Python等语言应用开发。当前OpenCV本身新开发的算法和模块接口都是基于C++产生。OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库,具有MATLAB风格的语法。所有OpenCV数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)集成更容易。接下来介绍OpenCV的核心操作:

import cv2

img = cv2.imread('E:/testdata/01.jpg')  # 读取图像
print( img.shape )
print (img)

b,g,r = cv2.split(img)                   # 拆分图像通道
img = cv2.merge((b,g,r))                 # 合并图像通道

res=cv2.resize(img,(50,50),interpolation=cv2.INTER_CUBIC)   # 图像缩放
'''
	INTER_NEAREST	最近邻插值
	INTER_LINEAR	双线性插值(默认设置)
	INTER_AREA	使用像素区域关系进行重采样。 它可能是图像抽取的首选方法,因为它会产生无云纹理的结果。 但是当图像缩放时,它类似于INTER_NEAREST方法。
	INTER_CUBIC	4x4像素邻域的双三次插值
	INTER_LANCZOS4	8x8像素邻域的Lanczos插值
'''

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转换读取图像的通道顺序,cv2默认为BGR顺序,这里转为RGB,其它软件均为RGB

cv2.imwrite("hehe.jpg",res)               # 保存图像

cv2.imshow("res",res)                     # 显示图像
cv2.waitKey(0)
cv2.destroyAllWindows()

注意:cv2默认为 BGR顺序,而其他软件(PIL、scopy.misc)一般使用RGB,所以当cv2和其它混用时需要用cv2.cvtColor()转换通道

4、tf.image模块

(1)编解码(编解码中处理的数据类型均为tf.uint8):

tf.image.decode_jpeg(contents, channels=None, ratio=None, fancy_upscaling=None, try_recover_truncated=None, acceptable_fraction=None, name=None)
tf.image.encode_jpeg(image, format=None, quality=None, progressive=None, optimize_size=None, chroma_downsampling=None, density_unit=None, x_density=None, y_density=None, xmp_metadata=None, name=None)
tf.image.decode_png(contents, channels=None, name=None)
tf.image.encode_png(image, compression=None, name=None)

(2)缩放(第一个函数和后面四个等价,这几个函数接受任意的数据类型,但是输出的类型为tf.float32):

tf.image.resize_images(images, new_height, new_width, method=0)
tf.image.resize_area(images, size, name=None)
tf.image.resize_bicubic(images, size, name=None)
tf.image.resize_bilinear(images, size, name=None)
tf.image.resize_nearest_neighbor(images, size, name=None)

(3)裁剪:

tf.image.resize_image_with_crop_or_pad(image, target_height, target_width)
tf.image.pad_to_bounding_box(image, offset_height, offset_width, target_height, target_width)
tf.image.crop_to_bounding_box(image, offset_height, offset_width, target_height, target_width)
tf.image.random_crop(image, size, seed=None, name=None)
tf.image.extract_glimpse(input, size, offsets, centered=None, normalized=None, uniform_noise=None, name=None)

(4)翻转:

tf.image.flip_up_down(image)
tf.image.random_flip_up_down(image, seed=None)
tf.image.flip_left_right(image)
tf.image.random_flip_left_right(image, seed=None)
    #coding=utf-8
    import tensorflow as tf
    import numpy as np
    import os
    from PIL import Image

    # 从文件读取数据,得到的是二进制文件
    image_data = tf.gfile.FastGFile("D:/test/2.jpg", 'rb').read()
    with tf.Session() as sess:
      # 将二进制数据解码为一个Tensor,此时的数据类型为tf.uint8
      img_data = tf.image.decode_jpeg(image_data)
      print (img_data.eval().shape)  

      # 对图像进行resize,0:双线性差值。1:最近邻居法。2:双三次插值法。3:面积插值法。
      resized = tf.image.resize_images(img_data, [500, 500], method=0)

      # TensorFlow的函数处理图片后存储的数据是float32格式的,需要转换成uint8才能正确打印图片。
      resized = np.asarray(resized.eval(), dtype='uint8') 

      # 显示图片
      new_img = Image.fromarray(resized, 'RGB')
      new_img.show()  

      # 对图像进行编码,并且保存图像
      encoded_image = tf.image.encode_jpeg(resized)
      print (type(encoded_image))
      with tf.gfile.GFile("./3.jpg","wb") as f:
        f.write(encoded_image.eval())   

(5)转换图像的数据类型:

tf.image.convert_image_dtype(image,dtype)

如果传入的数据类型为uint8,该函数可以将0-255的uint8类型的像素值归一化为0-1。如果传入的数据类型为tf.float32,则该函数对图像不做任何处理。如果传入的数据类型为tf.int32,则处理后会变成极小的小数。

(0)

相关推荐

  • Python使用scipy保存图片的一些注意点

    首先我们载入一张灰度图片,一般灰度图片像素为0-255. 可以发现该图片的最大像素为254,最小像素为2.一般处理图片时会转化为double类型. 我们将图片使用scipy保存为pgm格式. 然后我们重新读取该图片信息. 其像素值发生了变化,自动标准化到了0-255范围,最小值变为0,最大值变为255. 所以,使用scipy保存图像时,加上2个参数,cmin和cmax.就可以了 重新读取图片.结果正确 补充:from scipy import misc 读取和保存图片 from scipy im

  • python scipy.misc.imsave()函数的用法说明

    这个函数用于储存图片,将数组保存为图像 此功能仅在安装了Python Imaging Library(PIL)时可用.版本也比较老了,新的替代它的是imageio.imwrite() 用法: imsave(*args, **kwds) 参数: name :文件名或者文件名加目录 arr:np-array的矩阵,MxN or MxNx3 or MxNx4这三种格式,分别对应灰度图像,RGB图像和RGB+alpha图像 format :str型,图像输出的类型,省略的话,图片直接输出图片的扩展名.

  • 详解Python Opencv和PIL读取图像文件的差别

    前言 之前在进行深度学习训练的时候,偶然发现使用PIL读取图片训练的效果要比使用python-opencv读取出来训练的效果稍好一些,也就是训练更容易收敛.可能的原因是两者读取出来的数据转化为pytorch中Tensor变量稍有不同,这里进行测试. 之后的代码都导入了: from PIL import Image import matplotlib.pyplot as plt import numpy as np import torch import cv2 测试 使用PIL和cv2读取图片时

  • 在import scipy.misc 后找不到 imsave的解决方案

    在想把CIFAR-10 的16进制数据转为图像的时候需要用到imsave(),但是在import scipy.misc 之后显示该库内没有imsave() 后来发现还需要安装 Pillow这个包 解决: pip install Pillow 原因分析: 在安装Pillow之前,通过dir(scipy.misc) 可以查看里面的包,然后发现找不到imsave()函数 安装Pillow之后,再次查看就能发现多了很多函数,其中包括imsave(), imread() Pillow是python的一个十

  • 详解python opencv、scikit-image和PIL图像处理库比较

    进行深度学习时,对图像进行预处理的过程是非常重要的,使用pytorch或者TensorFlow时需要对图像进行预处理以及展示来观看处理效果,因此对python中的图像处理框架进行图像的读取和基本变换的掌握是必要的,接下来python中几个基本的图像处理库进行纵向对比. 项目地址:https://github.com/Oldpan/Pytorch-Learn/tree/master/Image-Processing 比较的图像处理框架: PIL scikit-image opencv-python

  • SciPy中两个模块:io 和misc的使用

    1.读写.mat文件 如果你有一些数据,或者在网上下载到一些有趣的数据集,这些数据以Matlab的.mat 文件格式存储,那么可以使用scipy.io 模块进行读取. data = scipy.io.loadmat('test.mat') 上面代码中,data 对象包含一个字典,字典中的键对应于保存在原始.mat 文件中的变量名.由于这些变量是数组格式的,因此可以很方便地保存到.mat 文件中. 你仅需创建一个字典(其中要包含你想要保存的所有变量),然后使用savemat() 函数: data

  • Python中使用select模块实现非阻塞的IO

    Socket的英文原义是"孔"或"插座".作为BSD UNIX的进程通信机制,取后一种意思.通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务.Socket正如其英文原意那样,像一个多孔插座.一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110

  • nginx中的两个模块的proxy_pass的区别解析

    1.ngx_stream_proxy_module模块的proxy_pass指令 只能在server段使用使用, 只需要提供域名或ip地址和端口. 可以理解为端口转发,可以是tcp端口,也可以是udp端口. server { listen 127.0.0.1:12345; proxy_pass 127.0.0.1:8080; } server { listen 12345; proxy_connect_timeout 1s; proxy_timeout 1m; proxy_pass exampl

  • Python3中的json模块使用详解

    1. 概述 JSON (JavaScript Object Notation)是一种使用广泛的轻量数据格式. Python标准库中的json模块提供了JSON数据的处理功能. Python中一种非常常用的基本数据结构就是字典(Dictionary). 它的典型结构如下: d = { 'a': 123, 'b': { 'x': ['A', 'B', 'C'] } } 而JSON的结构如下: { "a": 123, "b": { "x": [&quo

  • 关于Qt6中QtMultimedia多媒体模块的重大改变分析

    一.前言 1.Qt 6.2 的第一个测试版刚刚发布,并在多个其他新附加组件中加入了全新的 Qt 多媒体模块.Qt Multimedia 是一个模块,它在 Qt 6 中发生了一些相当大的变化. 2.在很多方面,它是一个新的 API 和实现,即使我们重新使用了 Qt 5.15 中的一些代码.虽然我们试图为我们的大多数模块保持 Qt 5 和 Qt 6 之间尽可能多的源代码兼容性,但我们不得不在此处进行大量更改以使 API 和实现适合未来,最终决定以最好的为目标API 而不是最大的兼容性. 二.目标 Q

  • Python中的Matplotlib模块入门教程

    1 关于 Matplotlib 模块 Matplotlib 是一个由 John Hunter 等开发的,用以绘制二维图形的 Python 模块.它利用了 Python 下的数值计算模块 Numeric 及 Numarray,克隆了许多 Matlab 中的函数, 用以帮助用户轻松地获得高质量的二维图形.Matplotlib 可以绘制多种形式的图形包括普通的线图,直方图,饼图,散点图以及误差线图等:可以比较方便的定制图形的各种属性比如图线的类型,颜色,粗细,字体的大小等:它能够很好地支持一部分 Te

  • Nodejs中使用captchapng模块生成图片验证码

    Nodejs项目,在做图片验证码的时候遇到了难题.Nodejs没有图片库,以后会有,但是现在没有. 网络上搜索一圈,有几个解决方案: 1.采用第三方验证码程序,有的时候,项目可能不允许: 2.使用Java或者PHP生成图片,Nodejs调用,中间采用Redies共享: 这两种方式都不太理想,好在终于找到了可以支持Nodejs图片验证码的一个库,虽然只支持数字,但是也还不错.原理是使用Base64的图片编码方式. 这个库的Gighub地址是:https://github.com/GeorgeCha

  • 在Python中使用itertools模块中的组合函数的教程

    理解新概念 Python V2.2 中引入了迭代器的思想.唔,这并不十分正确:这种思想的"苗头"早已出现在较老的函数 xrange() 以及文件方法 .xreadlines() 中了.通过引入 yield 关键字,Python 2.2 在内部实现的许多方面推广了这一概念,并使编程定制迭代器变得更为简单( yield 的出现使函数转换成生成器,而生成器反过来又返回迭代器). 迭代器背后的动机有两方面.将数据作为序列处理通常是最简单的方法,而以线性顺序处理的序列通常并不需要都同时实际 存在

  • 详解python时间模块中的datetime模块

    Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.time模块我在之前的文章已经有所介绍,它提供的接口与C标准库time.h基本一致.相比于time模块,datetime模块的接口则更直观.更容易调用. 1.datetime中包含三个类date ,time,datetime 函数datetime.combine(date,time)可以得到dateime,datetime.date().datetime.time()可以获得date和time 2.d

  • 深入理解python中的select模块

    简介 Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue方法(freeBSD系统) select方法 进程指定内核监听哪些文件描述符(最多监听1024个fd)的哪些事件,当没有文件描述符事件发生时,进程被阻塞:当一个或者多个文件描述符事件发生时,进程被唤醒. 当我们调用select()时: 1.上下文切换转换为内核态 2.将fd从用户空间复制到内核空

随机推荐