python:几种常使用读取图像的方法总结

方法一:利用PIL中的Image函数;

Note: 这个函数读取出来不是array格式

这时需要用 np.asarray(im) 或者np.array()函数将其转化成array,然后可以使用如下的方法来查看图像的格式(下面是基于python3的编程格式):

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()) #像素平均值

我做测试的结果显示如下:

结果输出:

<class 'numpy.ndarray'>
(300, 451, 3)
300
451
3
405900
231
0
115.305141661

区别是 np.array() 是深拷贝,np.asarray() 是浅拷贝

[python]  view plain  copy
  1. from PIL import Image  
  2. import numpy as np  
  3. I = Image.open('/data/person.png')   
  4. I.show()      
  5. I.save('/data/person_save.png')  
  6. I_array = np.array(I)  
  7. print I_array.shape  

#方法二:利用matplotlib.pyplot as plt用于显示图片

# matplotlib.image as mpimg 用于读取图片

# 并且读取出来就是array格式

[python]  view plain  copy
  1. import matplotlib.pyplot as plt  
  2. import matplotlib.image as mpimg  
  3. import numpy as np  
  4. I = mpimg.imread('/data/person.png')  
  5. print I.shape  
  6. plt.imshow(I)  

#方法三:OpenCV目前支持读取bmp、jpg、png、tiff等常用格式。更详细的请参考OpenCV的参考文档。

#利用opencv-python接口

#cv2.imread()读出来同样是array形式,
[python]  view plain  copy
  1. import cv2  
  2. img = cv2.imread('/data/person.png')  #读取一张图片
  3. cv2.namedWindow('image', cv2.WINDOW_NORMAL)#给显示的窗口命名,后面的flag默认为cv2.WINDOW_AUTOSIZE,自动调整边框#,但是在条形图过长时,使用windownormal我们可以自行调整边框
  4. cv2.imshow('image',img)#展示图片
  5. cv2.waitKey(0)#等待按键按下,如果不添最后一句,在IDLE中执行窗口直接无响应。在命令行中执行的话,则是一闪而过。
  6. cv2.destroyAllWindows()#清除所有窗口
  7. #参数中填入图片的完全路径或者相对路径
  8. print(img.shape)  
  9. 我们可以使用imwrite来存储一张图片,接受一个numpy的数组作为参数.

    cv2.imwrite('cope_lenna_img.jpg',img)
    #result: True
  10. 他会返回一个bool值来表示它是否成功存储.
    我们成功在当前目录存储了一个叫做copy_lenna_img.jpg的图像.

#读取一张图片
cv2.imread(img,flag)
#img这一参数中填入图片的完全路径或者相对路径

这里我们需要稍微了解下flag这个参数,这决定了opencv是如何读入我们的图像的
我们知道通常图像每个像素点的颜色我们以RGB的格式来描述(或者RGBA),可以通过三基色(red,green,blue)来描述所有颜色,对于透明图片我们会增加一个a(alpha)来描述其颜色的透明度.

    cv2.IMREAD_COLOR : 读入图片,任何与透明度相关通道的会被忽视,默认以这种方式读入.
    cv2.IMREAD_GRAYSCALE : 以灰度图的形式读入图片.
    cv2.IMREAD_UNCHANGED : 保留读取图片原有的颜色通道.

可以简单的用-1,0,1来分别表示这3个flag

举例如下:

#在开头引入必要的库

import matplotlib.pyplot as plt

import numpy as np

import cv2

#ipython %matplotlib inline

gray_lenna_img = cv2.imread("lena.jpg",0)

orign_lenna_img=cv2.imread("lena.jpg",1)

plt.subplot(121)

plt.imshow(gray_lenna_img,cmap=plt.cm.gray)

plt.axis("off")

plt.subplot(122)

orign_lenna_img = cv2.cvtColor(orign_lenna_img,cv2.COLOR_BGR2RGB)

plt.imshow(orign_lenna_img)

plt.axis("off")

plt.show()

因为lenna图并没有包含透明度这一通道,读入的仍然是BGR格式,所以我们从lenna图是看不出区别的


读取和显示图像(使用opencv,该部分以定义一个函数的形式读取图像)

[python]  view plain  copy
  1. #读取和显示图像  
  2. def showimg(imagePath):  
  3.     img = cv2.imread(imagePath)  #读取本地图片,目前OpevCV支持bmp、jpg、png、tiff  
  4.     cv2.namedWindow("Image")     #创建一个窗口用来显示图片  
  5.     cv2.imshow("Image", img)     #显示图片  
  6.     cv2.waitKey (0)              #等待输入,这里主要让图片持续显示。  
  7.     cv2.destroyAllWindows()      #释放窗口  
  8.   
  9. if __name__ == '__main__':   
  10.     imagePath = '/data/person.jpg'  
  11.     showimg(imagePath)  
第一个参数是保存文件名和路径,第二个是图像矩阵。imwrite() 有个可选的第三个参数
cv2.imwrite("/data/person_test.jpg",img,[int(cv2.IMWRITE_JPEG_QUALITY),5])
5 -- 是第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95
      注意: cv2.IMWRITE_JPEG_QUALITY类型为 long ,必须转换成 int.,对于png ,第三个参数表示的是压缩级别。
      cv2.IMWRITE_PNG_COMPRESSION, 从0到9 压缩级别越高图像越小。默认为3.

#方法四:图像的存取用scipy这个库里的东西,读出来是矩阵形式,并且按照(H,W,C)形式保存

[python]  view plain  copy
  1. import matplotlib.pyplot as plt  
  2. from scipy import misc  
  3. import scipy  
  4. I = misc.imread('/data/person.png')  
  5. scipy.misc.imsave('/data/person_save1.png', I)  
  6. plt.imshow(I)  
  7. plt.show()  
#方法五:用skimage库
from skimage import io,data
img=data.lena() #详细解释如下,使用data可以直接调用skimage程序中自带的图像
io.imread('/data/person.png',as_grey=True) #读取制定路径下的图像,第一个参数为图片路径,第二个参数为as_grey, bool型值,默认为False
io.imshow(img)
skimage程序自带了一些示例图片,如果我们不想从外部读取图片,就可以直接使用这些示例图片,图片名对应的就是函数名,如camera图片对应的函数名为camera(). 这些示例图片存放在skimage的安装目录下面,路径名称为data_dir,我们可以将这个路径打印出来看看:
from skimage import data_dir
print(data_dir)
显示:
>>> print(data_dir)
/usr/lib/python3/dist-packages/skimage/data
 
 

#下面两段代码输出的结果是一样的
from skimage import data_dir,data,io
img1=data.lena()  #读取lena图片
img2=io.imread(data_dir+'/lena.png')  #读取lena图片

astronaut

宇航员图片

coffee

一杯咖啡图片

lena

lena美女图片

camera

拿相机的人图片

coins

硬币图片

moon

月亮图片

checkerboard

棋盘图片

horse

马图片

page

书页图片

chelsea

小猫图片

hubble_deep_field

星空图片

text

文字图片

clock

 时钟图片

immunohistochemistry

结肠图片

 

 
  • 15
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值