深度学习笔记二 Python中表示和操作图像

深度学习课堂实验学习笔记二: 包括图像读取和显示,使用slicing展示图像,colour maps,展示多个图像
实验环境:Juypter Notebook

读取和显示

  1. 读取存储在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展示图像

  1. 使用切片来显示图像中的红色通道的值。

    1. 切片的形式是 i:j:k,表示从索引 i 开始,到 j-1 结束,步长为 k(可以是负数)。如果最后的 :k 被省略,步长默认为1。如果省略了 i 或 j,它们默认为最小或最大索引加1。请注意,数组中的每个值都是8位无符号整数。

    2. 从图像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)
      
  2. 将像素值重新缩放为区间 [0, 1] 中的浮点数。imshow函数要求输入的浮点数处于这个范围内。

    1. im = im/255: 这行代码将图像im中的所有像素值除以255,以将像素值重新缩放到区间[0,1]。这样做是因为imshow函数预期输入的浮点数处于这个范围内。

    2. plt.imshow(im): 这行代码使用Matplotlib库中的imshow函数来显示图像im。这会将重新缩放后的图像显示在屏幕上。

    3. im[200:205,200:205,0]: 这部分代码与之前的解释相同,它选择了图像im中行索引从200到204、列索引从200到204的区域,并提取了这个区域内红色通道的像素值。

    4. 代码

      im = im/255
      plt.imshow(im)
      im[200:205,200:205,0]
      
    5. 输出

      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]])
      
  3. 显示图像im的上下颠倒版本。

    • im[::-1,:,:]:这部分代码使用切片操作来对图像im进行反转操作。[::-1]表示在行方向上以步长为-1进行切片,即从最后一行到第一行,实现了图像的上下翻转。:表示选择所有的列和通道。因此,im[::-1,:,:]选择了图像im的上下颠倒的版本。

    • plt.imshow(im[::-1,:,:]):这行代码使用Matplotlib库中的imshow函数来显示上述得到的上下颠倒的图像。

    • 代码

      plt.imshow(im[::-1,:,:])
      
    • 输出

      在这里插入图片描述

  4. 显示图像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,:,:])
      
    • 输出

      在这里插入图片描述

  5. 显示图像im的颜色通道颠倒的版本

    • im[:,:,::-1]:这部分代码使用切片操作来对图像im的颜色通道进行颠倒操作。::-1表示以步长为-1对颜色通道进行切片,即颠倒了颜色通道的顺序。:表示选择所有的行和列。因此,im[:,:,::-1]选择了图像im的颜色通道颠倒的版本。

    • plt.imshow(im[:,:,::-1]):这行代码使用Matplotlib库中的imshow函数来显示上述得到的颜色通道颠倒的图像。

    • 代码

      plt.imshow(im[:,:,::-1])
      
    • 输出

      在这里插入图片描述

使用colour maps

  1. 如何使用颜色映射(colour maps)将提取的红色通道显示为彩色图像。由于现在我们只有一个范围为[0,1]的二维数值数组,plt.imshow通过将给定的数值映射到颜色表(一种颜色映射)上生成彩色图像,其中每种颜色由在[0,1]范围内的红、绿、蓝值的三元组表示。有许多内置的颜色映射。这里展示了使用jet颜色映射的结果。默认情况下,plt.imshow将数据值缩放到[0,1]的区间。您还可以在参数中指定自定义的归一化方式(例如对数方式),或指定顶部和底部值vmin和vmax。
  2. 注意:颜色映射是使用[0,1]范围内的值访问的。因此,plt.imshow执行的重新缩放目标是该范围。如果您的图像包含unit8值,默认情况下imshow使用固定的映射将[0,255]映射到颜色映射的范围内。
  3. 如何提取图像的红色通道数据,并将其作为彩色图像显示出来。
    1. rc = im[:,:,0]:提取图像中的红色通道数据,即取出所有行和列,但只保留第一个通道(红色通道)的数据。

    2. print(rc.shape):打印红色通道数据数组的形状,即数组的维度信息。

    3. plt.imshow(rc, cmap='jet'):使用plt.imshow()函数显示提取的红色通道数据,使用’jet’颜色映射来将数据映射成彩色图像。

    4. plt.colorbar():添加颜色条,显示图像数据对应的数值与颜色的对应关系。

      rc = im[:,:,0]
      print(rc.shape)
      plt.imshow(rc, cmap='jet')
      plt.colorbar()
      

      在这里插入图片描述

展示多个图像

  1. 使用了plt.subplot方法来创建一个包含多个子图的图像布局。每个子图显示不同的图像,并且通过imshow方法将图像数据显示在子图中。在每个子图中,我们使用了ax.axis('off')方法来关闭刻度标记,以提高图像的清晰度。

    • ax = plt.subplot(2,2,1): 创建一个2行2列的子图布局,并指定当前子图的位置为第1个。imshow(im)方法用于显示图像imax.axis('off')关闭了刻度标记。

    • ax = plt.subplot(2,2,2): 创建一个2行2列的子图布局,并指定当前子图的位置为第2个。imshow(rc, cmap='gray')方法用于显示灰度图像rcax.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')
      

      在这里插入图片描述

  2. 练习:要求在一个单独的图像中(使用plt.subplot)显示原始图像以及单独的红色、绿色和蓝色分量(分别用红色、绿色和蓝色显示)。

    1. 方法一:对于每个颜色分量,创建一个与原始图像相同形状的零数组(使用函数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()
      
      

      在这里插入图片描述

    2. 方法二:使用切片逐个提取每个颜色通道,然后使用相应的颜色映射(‘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

学校资料

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值