深度学习课堂实验学习笔记二: 包括图像读取和显示,使用slicing展示图像,colour maps,展示多个图像
实验环境:Juypter Notebook
读取和显示
-
读取存储在JPEG格式中的图像。该图像有246行和380列的像素。我们将图像读入一个形状为246×380×3的NumPy数组中,其中第三个维度索引了3个RGB颜色通道。每个颜色强度的值位于范围[0, 255]内。
import numpy as np import matplotlib.pyplot as plt import matplotlib.colors %matplotlib inline
im = plt.imread('archway.jpg') print(im.shape) plt.imshow(im)
使用slicing展示图像
-
使用切片来显示图像中的红色通道的值。
-
切片的形式是 i:j:k,表示从索引 i 开始,到 j-1 结束,步长为 k(可以是负数)。如果最后的 :k 被省略,步长默认为1。如果省略了 i 或 j,它们默认为最小或最大索引加1。请注意,数组中的每个值都是8位无符号整数。
-
从图像
im
的红色通道中选择特定区域的像素值。具体来说:im[200:210, 200:205, 0]
:这部分代码使用了Python的切片操作来选择图像im
中的一个子区域。其中,200:210
表示选择行索引从200到209的区域,200:205
表示选择列索引从200到204的区域,0
表示选择红色通道的像素值。因此,这行代码选择了图像im
中行索引从200到209、列索引从200到204的区域,并提取了这个区域内红色通道的像素值。im[200:210,200:205,0]
#输出 array([[ 71, 71, 70, 68, 65], [ 58, 59, 60, 60, 58], [149, 149, 149, 149, 147], [183, 183, 183, 186, 188], [174, 172, 170, 171, 174], [188, 185, 181, 179, 180], [168, 169, 170, 171, 171], [168, 172, 176, 177, 176], [136, 143, 147, 150, 150], [168, 175, 174, 169, 169]], dtype=uint8)
-
-
将像素值重新缩放为区间 [0, 1] 中的浮点数。imshow函数要求输入的浮点数处于这个范围内。
-
im = im/255
: 这行代码将图像im
中的所有像素值除以255,以将像素值重新缩放到区间[0,1]。这样做是因为imshow
函数预期输入的浮点数处于这个范围内。 -
plt.imshow(im)
: 这行代码使用Matplotlib库中的imshow
函数来显示图像im
。这会将重新缩放后的图像显示在屏幕上。 -
im[200:205,200:205,0]
: 这部分代码与之前的解释相同,它选择了图像im
中行索引从200到204、列索引从200到204的区域,并提取了这个区域内红色通道的像素值。 -
代码
im = im/255 plt.imshow(im) im[200:205,200:205,0]
-
输出
array([[0.27843137, 0.27843137, 0.2745098 , 0.26666667, 0.25490196], [0.22745098, 0.23137255, 0.23529412, 0.23529412, 0.22745098], [0.58431373, 0.58431373, 0.58431373, 0.58431373, 0.57647059], [0.71764706, 0.71764706, 0.71764706, 0.72941176, 0.7372549 ], [0.68235294, 0.6745098 , 0.66666667, 0.67058824, 0.68235294]])
-
-
显示图像
im
的上下颠倒版本。-
im[::-1,:,:]
:这部分代码使用切片操作来对图像im
进行反转操作。[::-1]
表示在行方向上以步长为-1进行切片,即从最后一行到第一行,实现了图像的上下翻转。:
表示选择所有的列和通道。因此,im[::-1,:,:]
选择了图像im
的上下颠倒的版本。 -
plt.imshow(im[::-1,:,:])
:这行代码使用Matplotlib库中的imshow
函数来显示上述得到的上下颠倒的图像。 -
代码
plt.imshow(im[::-1,:,:])
-
输出
-
-
显示图像
im
的部分区域,并且在行方向上颠倒显示-
im[200:100:-1,:,:]
:这部分代码使用切片操作选择了图像im
中行索引从200到101(不包括100)的区域,并且以步长为-1进行切片,即从200开始递减到101,实现了对图像的上下翻转。:
表示选择所有的列和通道。因此,im[200:100:-1,:,:]
选择了图像im
的上下翻转并限定了行索引范围的部分区域。 -
plt.imshow(im[200:100:-1,:,:])
:这行代码使用Matplotlib库中的imshow
函数来显示上述得到的部分区域,并且在行方向上颠倒显示。 -
代码
plt.imshow(im[200:100:-1,:,:])
-
输出
-
-
显示图像im的颜色通道颠倒的版本
-
im[:,:,::-1]
:这部分代码使用切片操作来对图像im
的颜色通道进行颠倒操作。::-1
表示以步长为-1对颜色通道进行切片,即颠倒了颜色通道的顺序。:
表示选择所有的行和列。因此,im[:,:,::-1]
选择了图像im
的颜色通道颠倒的版本。 -
plt.imshow(im[:,:,::-1])
:这行代码使用Matplotlib库中的imshow
函数来显示上述得到的颜色通道颠倒的图像。 -
代码
plt.imshow(im[:,:,::-1])
-
输出
-
使用colour maps
- 如何使用颜色映射(colour maps)将提取的红色通道显示为彩色图像。由于现在我们只有一个范围为[0,1]的二维数值数组,
plt.imshow
通过将给定的数值映射到颜色表(一种颜色映射)上生成彩色图像,其中每种颜色由在[0,1]范围内的红、绿、蓝值的三元组表示。有许多内置的颜色映射。这里展示了使用jet颜色映射的结果。默认情况下,plt.imshow将数据值缩放到[0,1]的区间。您还可以在参数中指定自定义的归一化方式(例如对数方式),或指定顶部和底部值vmin和vmax。 - 注意:颜色映射是使用[0,1]范围内的值访问的。因此,plt.imshow执行的重新缩放目标是该范围。如果您的图像包含unit8值,默认情况下imshow使用固定的映射将[0,255]映射到颜色映射的范围内。
- 如何提取图像的红色通道数据,并将其作为彩色图像显示出来。
-
rc = im[:,:,0]
:提取图像中的红色通道数据,即取出所有行和列,但只保留第一个通道(红色通道)的数据。 -
print(rc.shape)
:打印红色通道数据数组的形状,即数组的维度信息。 -
plt.imshow(rc, cmap='jet')
:使用plt.imshow()
函数显示提取的红色通道数据,使用’jet’颜色映射来将数据映射成彩色图像。 -
plt.colorbar()
:添加颜色条,显示图像数据对应的数值与颜色的对应关系。rc = im[:,:,0] print(rc.shape) plt.imshow(rc, cmap='jet') plt.colorbar()
-
展示多个图像
-
使用了
plt.subplot
方法来创建一个包含多个子图的图像布局。每个子图显示不同的图像,并且通过imshow
方法将图像数据显示在子图中。在每个子图中,我们使用了ax.axis('off')
方法来关闭刻度标记,以提高图像的清晰度。-
ax = plt.subplot(2,2,1)
: 创建一个2行2列的子图布局,并指定当前子图的位置为第1个。imshow(im)
方法用于显示图像im
,ax.axis('off')
关闭了刻度标记。 -
ax = plt.subplot(2,2,2)
: 创建一个2行2列的子图布局,并指定当前子图的位置为第2个。imshow(rc, cmap='gray')
方法用于显示灰度图像rc
,ax.axis('off')
关闭了刻度标记。 -
ax = plt.subplot(2,2,3)
: 创建一个2行2列的子图布局,并指定当前子图的位置为第3个。imshow(im[::-1,:,:])
方法用于显示图像im
的上下翻转版本,ax.axis('off')
关闭了刻度标记。 -
ax = plt.subplot(2,2,4)
: 创建一个2行2列的子图布局,并指定当前子图的位置为第4个。imshow(im[:,:,::-1])
方法用于显示图像im
的颜色通道反转版本,ax.axis('off')
关闭了刻度标记。ax = plt.subplot(2,2,1) plt.imshow(im) ax.axis('off') ax = plt.subplot(2,2,2) plt.imshow(rc,cmap='gray') ax.axis('off') ax = plt.subplot(2,2,3) plt.imshow(im[::-1,:,:]) ax.axis('off') ax = plt.subplot(2,2,4) plt.imshow(im[:,:,::-1]) ax.axis('off')
-
-
练习:要求在一个单独的图像中(使用plt.subplot)显示原始图像以及单独的红色、绿色和蓝色分量(分别用红色、绿色和蓝色显示)。
-
方法一:对于每个颜色分量,创建一个与原始图像相同形状的零数组(使用函数np.zeros),然后使用切片将相应的颜色通道复制过去。这样,您创建的彩色图像中两个颜色通道都为零。
# Method 1: Using np.zeros and slicing # Create arrays of zeros for each color channel red_channel = np.zeros_like(im) green_channel = np.zeros_like(im) blue_channel = np.zeros_like(im) # Copy the corresponding color channels red_channel[:,:,0] = im[:,:,0] # Red channel green_channel[:,:,1] = im[:,:,1] # Green channel blue_channel[:,:,2] = im[:,:,2] # Blue channel # Plotting plt.figure(figsize=(10, 6)) # Original image ax = plt.subplot(2, 2, 1) plt.imshow(im) ax.axis('off') plt.title('Original Image') # Red channel ax = plt.subplot(2, 2, 2) plt.imshow(red_channel, cmap='Reds') ax.axis('off') plt.title('Red Channel') # Green channel ax = plt.subplot(2, 2, 3) plt.imshow(green_channel, cmap='Greens') ax.axis('off') plt.title('Green Channel') # Blue channel ax = plt.subplot(2, 2, 4) plt.imshow(blue_channel, cmap='Blues') ax.axis('off') plt.title('Blue Channel') plt.tight_layout() plt.show()
-
方法二:使用切片逐个提取每个颜色通道,然后使用相应的颜色映射(‘Reds’、‘Greens’和’Blues’)显示所需的图像。
# Method 2: Using slicing and color maps # Extracting each color channel using slicing red_channel = im[:, :, 0] green_channel = im[:, :, 1] blue_channel = im[:, :, 2] # Plotting plt.figure(figsize=(10, 6)) # Original image ax = plt.subplot(2, 2, 1) plt.imshow(im) ax.axis('off') plt.title('Original Image') # Red channel ax = plt.subplot(2, 2, 2) plt.imshow(red_channel, cmap='Reds') ax.axis('off') plt.title('Red Channel') # Green channel ax = plt.subplot(2, 2, 3) plt.imshow(green_channel, cmap='Greens') ax.axis('off') plt.title('Green Channel') # Blue channel ax = plt.subplot(2, 2, 4) plt.imshow(blue_channel, cmap='Blues') ax.axis('off') plt.title('Blue Channel') plt.tight_layout() plt.show()
-
Reference
学校资料