注解
此笔记本可在此处下载: 00_Basics.ipynb
基础
在本笔记本中,我们介绍了阅读、显示、浏览和保存图像的基本方法。
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from scipy import ndimage
import os
%matplotlib nbagg
您可以在此处下载本示例中使用的图像: rabbit.jpg .如果图像与笔记本本身位于同一目录中,则以下代码将起作用。
首先,让我们检查一下 rabbit.jpg
在当前目录中。
files = os.listdir("./")
if "rabbit.jpg" in files:
print("Ok, the file is in {0}".format(files))
else:
print("The file is not in {0} , retry !".format(files))
Ok, the file is in ['rabbit.jpg', '.ipynb_checkpoints', '00_Basics.ipynb']
现在让我们用 python图像库(又称pil) :
im = Image.open("rabbit.jpg")
im
数字图像
数字图像主要有两种:
矢量图像 由基本的几何图形组成,如直线和多边形。它们非常有效地存储方案或曲线。它们通常存储为
.svg
,.pfg
或.eps
文件夹。在本教程中,我们将不处理此类图像。栅格图像 ,也称为 位图 其中数据是作为矩阵的结构 像素 .每个像素可以包含1到4个调用的值 渠道 .然后,图像可以按其频道数进行子分类:
单通道图像称为灰度,
大多数彩色图像使用3个通道,一个用于红色(R),一个用于绿色(G),一个用于蓝色(B)。它们被称为RGB图像。
一些图像格式使用第四个通道 阿尔法 对应于给定像素的透明度级别。
在当前图像中,可以得到如下的信道结构:
im.getbands()
('R', 'G', 'B')
从图像到 numpy
现在,可以提取如下信道数据:
R, G, B = im.split()
R = np.array(R)
G = np.array(G)
B = np.array(B)
R
array([[ 78, 85, 96, ..., 79, 70, 64],
[ 72, 76, 84, ..., 99, 93, 89],
[ 69, 71, 75, ..., 108, 101, 95],
...,
[120, 115, 101, ..., 73, 64, 38],
[130, 109, 80, ..., 73, 58, 31],
[113, 84, 60, ..., 72, 68, 53]], dtype=uint8)
fig = plt.figure()
ax1 = fig.add_subplot(1, 3, 1)
plt.title("R")
plt.imshow(R, cmap = cm.gray)
ax1.axis("off")
ax1 = fig.add_subplot(1, 3, 2)
plt.title("G")
plt.imshow(G, cmap = cm.gray)
ax1.axis("off")
ax1 = fig.add_subplot(1, 3, 3)
plt.title("B")
plt.imshow(B, cmap = cm.gray)
ax1.axis("off")
plt.show()
<IPython.core.display.Javascript object>
从 numpy
到图像
现在让我们看看如何从numpy创建图像。
r2 = np.arange(256).astype(np.uint8)
g2 = np.arange(256).astype(np.uint8)
R2, G2 = np.meshgrid(r2, g2)
B2 = np.zeros_like(R2).astype(np.uint8)
im2 = Image.fromarray(np.dstack([R2, G2, B2]))
im2
让我们把它应用到兔子图像中。例如,我们可以切换频道:
im3 = Image.fromarray(np.dstack([G, R, B]))
im3