• 读取并显示图像

    • opencv3库
    • scikit-image库
    • PIL库
    • 读取图像结果分析
  • 打印图像信息
    • skimage获取图像信息
    • PIL获取图像信息
  • 读取并显示图像方法总结
    • PIL库读取图像
    • Opencv3读取图像
    • scikit-image库读取图像
    • 参考资料

学习数字图像处理,第一步就是读取图像。这里我总结下如何使用 opencv3,scikit-image, PIL 图像处理库读取图片并显示。

读取并显示图像

opencv3库

opencv 读取图像,返回的是矩阵数据,RGB 图像的 shape 是 (height, weight, channel),dtype 是 uint8。

示例代码如下:

import cv2
# 读入一副彩色图像
img_cv2 = cv2.imread('test.jpg',cv2.IMREAD_COLOR)
# 打印图像尺寸,形状,图像元素数据类型
print(type(img_cv2))
print(img_cv2.shape)    # (height, width, channel)
print(img_cv2.dtype)    # uint8
# matplotlib绘制显示图像
plt.figure(1)
plt.imshow(img_PIL)
plt.show()
# cv2绘制显示图像
# cv2.imshow()
# cv2.namedWindow('image', cv2.WINDOW_NORMAL)
# cv2.imshow('image',img_cv2)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

scikit-image库

示例代码如下:

from skimage import io
img_skimage = io.imread('test.jpg')
# 打印图像尺寸
print(img_skimage.shape)    #(height, width, channel)
# 绘制显示图像
io.imshow(img_skimage)
# import matplotlib.pyplot as plt
# plt.imshow(img_skimage)

注意:io.imshow(img_skimage),这一行代码的实质是利用matplotlib包对图片进行绘制,绘制成功后,返回一个matplotlib类型的数据。也就是说scikit-image库对图像的绘制实际上是调用了matplotlib库imshow显示函数。

cv2和skimage读取图像,图像的尺寸可以通过其shape属性来获取,shape返回的是一个tuple元组,第一个元素表示图像的高度,第二个表示图像的宽度,第三个表示像素的通道数。

PIL库

示例代码如下:

# PIL库读取绘制显示图像
# plt 用于显示图片
from PIL import Image
import matplotlib.pyplot as pltimport numpy as np
img_PIL = Image.open('test.jpg')
img_PIL = np.array(img_PIL)
# 打印图像类型,尺寸和总像素个数
print(type(img_PIL)) # <class 'numpy.ndarray'>
print(img_PIL.shape) # (height, width, channel), (1200, 1793, 3)
print(img_PIL.size)  # 6454800 = 1200*1793*3
# 绘制显示图像
plt.figure(1)
plt.imshow(img_PIL)
plt.show()

读取图像结果分析

分别用Opnecv3和sckit-image读取图像,并用matplotlib库显示。示例代码如下:

import cv2
from skimage import io
import matplotlib.pyplot as plt
img_cv2 = cv2.imread('test.jpg',cv2.IMREAD_COLOR)
img_skimage = io.imread('test.jpg')
# matplotlib显示cv2库读取的图像
plt.figure('imread picture',figsize=(25,25))
plt.subplot(121)
plt.title('cv2 imread picture')
plt.imshow(img_cv2)
# matplotlib显示skimage库读取的图像
plt.subplot(122)
plt.title('skimage imread picture')
plt.imshow(img_skimage)
# 打印图像尺寸,总像素个数,和图像元素数据类型
print(img_cv2.shape)
print(img_cv2.size)
print(img_cv2.dtype)

通过以上输出结果对比图,我们会发现,matplotlib绘制显示的cv2库读取的图像与原图有所差别,这是因为opencv3库读取图像的通道时BGR,而正常图像读取的通道都是RGB,matplotlib库显示图像也是按照RGB顺序通道来的,解释完毕。

一点疑惑,我通过查询库函数可知plt.show()第一个参数为要显示的对象(array_like),字面意思理解为类似数组的对象,但是很明显,PIL库返回的不是’numpy.ndarray’对象,而是’PIL.JpegImagePlugin.JpegImageFile’对象,那为什么plt.show()函数还是能显示Image.open()函数读取图像返回的结果呢?

程序如下图所示:

打印图像信息

图像常用信息有图像尺寸,像素个数,通道数等。

skimage获取图像信息

注意:scikit-image 库读取和缩放图像速度要慢 opencv 库 近 4 倍。

from skimage import io, data
# create coffee image, return (300, 451, 3) uint8 ndarray
img = data.coffee()
io.imshow(img)      # 显示图片
print(type(img))    # 显示类型
print(img.dtype)    # 显示图像元素数据类型
print(img.shape)    # 显示尺寸
print(img.shape[0]) # 图片高度
print(img.shape[1]) # 图片宽度
print(img.shape[2]) # 图片通道数
print(img.size)     # 显示总像素个数=shape[0]*shape[1]*shape[2]
print(img.max())    # 最大像素值
print(img.min())    # 最小像素值
print(img.mean())   # 像素平均值
print(img[0][0])    # 图像第一行第一列的像素值

输出结果如下图:

PIL获取图像信息

# 获取PIL image图片信息
im = Image.open('test.jpg')
print (type(im))
print (im.size) #图片的尺寸
print (im.mode) #图片的模式
print (im.format) #图片的格式
print (im.getpixel((0,0)))#得到像素:
# img读出来的图片获得某点像素用getpixel((w,h))可以直接返回这个点三个通道的像素值

输出结果如下:

plt.show函数定义如下:

Signature: plt.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, data=None, **kwargs)
Docstring:
Display an image on the axes.

Parameters
———-
X : array_like, shape (n, m) or (n, m, 3) or (n, m, 4). Display the image in XX to current axes. XX may be an array or a PIL image. If XX is an array, it can have the following shapes and types:

– MxN — values to be mapped (float or int)
– MxNx3 — RGB (float or uint8)
– MxNx4 — RGBA (float or uint8)

The value for each component of MxNx3 and MxNx4 float arrays should be in the range 0.0 to 1.0. MxN arrays are mapped to colors based on the ∥∥∥∥ (mapping scalar to scalar) and the cmapcmap (mapping the normed scalar to a color).

读取并显示图像方法总结

PIL库读取图像

PIL.Image.open + numpy
scipy.misc.imread
scipy.ndimage.imread
这些方法都是通过调用PIL.Image.open 读取图像的信息;
PIL.Image.open 不直接返回numpy对象,可以用numpy提供的函数进行转换,参考Image和Ndarray互相转换;
scipy.ndimage.imread直接返回numpy.ndarray对象,通道顺序为RGB,通道值得默认范围为0-255。

Opencv3读取图像

cv2.imread: 使用opencv读取图像,直接返回numpy.ndarray 对象,通道顺序为BGR ,注意是BGR,通道值默认范围0-255。

scikit-image库读取图像

skimage.io.imread: 直接返回numpy.ndarray 对象,通道顺序为RGB,通道值默认范围0-255。

参考资料

  • https://blog.csdn.net/renelian1572/article/details/78761278
  • https://pillow.readthedocs.io/en/5.3.x/index.html
  • http://scikit-image.org/docs/stable/user_guide.html

Python 读取图像方式总结相关推荐

  1. python读取图像方式问题(RGB)

    我们在读取图片时由于个人习惯不同,使用不同的包读取,显示图片的结果也不同.所以我们需要作出一些区分. MATLAB生成一张渐变图片来区分几种图片读取方式 分别用PIL,Matplot,Opencv读取 ...

  2. 图像处理基础 || (一) python 读取图像的常用方式

    python 读取图像的常用方式 图像的读取与保存是图像处理或计算机视觉领域中最基本的操作,python中有众多的库支持图像的读取.显示与存储,常用的库包括 matplotlib.skimage 和 ...

  3. python读取图像的几种方式

    python读取图像的几种方式 本文介绍几种基于python的图像读取方式: 基于PIL库的图像读取.保存和显示 基于opencv-python的图像读取.保存和显示 基于matplotlib的图像读 ...

  4. python读取图像的exif信息

    python读取图像的exif信息 python 读取图像的exif信息 import exifread PIL函数实现 python 读取图像的exif信息 前几天用PYQT做了一个工具,打开图片发 ...

  5. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...

  6. python读取图像数据流_【NUKE教程】Nuke Python 获取图像数据

    通过python有两种方式读取图像的像素数据: 创建分析图像的节点(比如,MinColor, CurveTool),执行,然后读取其结果的knob数值 sample方法可以直接抽样节点的像素. 使用C ...

  7. python的image读取的图片是什么类型的-opencv python 读取图像/显示图像/保存图像...

    以前也用过opencv, 不过都是按需使用, 掌握的知识很零散, 这次希望能够系统学习opencv-python 本文直接从Gui Features开始. 1 读取图片 使用cv2.imread()函 ...

  8. python读取图像并相加_python给图像加上mask,并提取mask区域实例

    python对图像提取mask部分: 代码: #coding:utf-8 import os import cv2 import numpy as np def add_mask2image_bina ...

  9. python读取图像的几种方法

    方法一:利用PIL中的Image函数,这个函数读取出来不是array格式 这时候需要用 np.asarray(im) 或者np.array()函数 区别是 np.array() 是深拷贝,np.asa ...

最新文章

  1. PHP 格式化文件大小
  2. 日文版visual studio2005的安装
  3. CV】keras_resnet 在cifar10数据集上分类
  4. Swoole Interview
  5. 字节输出流写入数据到文件
  6. ubuntu 查找qt是否安装_Ubuntu Qt 安装教程--快速下载连接(网盘)
  7. Python day2 数据类型 字符类型 文件处理
  8. android 系统(108)---Android getevent sendevent用法
  9. 过滤html标签 去除html标签
  10. 用于处理分数的Objective-C类
  11. Android 安全 (一)
  12. mysql如何给一个数据库所有表都增加一个字段?
  13. SpringBoot个人博客项目——相册模块开发(一)
  14. JAVA之socket编程服务器与客户端通信--实现简易聊天室
  15. Win10自带的SSH服务 scp功能传输文件(linux)
  16. Python Opencv 之 简单的视频裁剪功能的实现
  17. 一文了解EpiQuik CUT&RUN m6A RNA富集(MeRIP)试剂盒
  18. python练习(1)
  19. mysql中real数据类型,SQLite 数据类型 | 菜鸟教程
  20. 转载 fstring用法

热门文章

  1. 这个队列的思路真的好,现在它是我简历上的亮点了。
  2. 关于树莓派Pi2通过UART连接攀藤G5传感器的python
  3. 微信小程序打造本地宝(3)——消息列表
  4. Git的安装和使用教程
  5. 2022化工自动化控制仪表试题及模拟考试
  6. 拼多多用户数7.88亿,成为中国电商第一
  7. OPENGL学习笔记之八
  8. [读书]井深大-“索尼精神”的缔造者
  9. 一个文字版Java双人对抗游戏源码
  10. 浴谷P1540 机器翻译