educoder:Numpy图像处理

时间:2022-12-17 11:54:18

第1关:图像翻转

任务描述

本关任务:读取一副图片,实现图片的翻转。

相关知识

为了完成本关任务,你需要掌握:1.如何读取和保存图像,2.图像的数组表示。

彩色图像

与人脑不同,计算机读入一张图像后,是转换成了数字来处理的,而Numny正是对这些数字化图像再加工的强大工具。

彩色图像 一幅彩色图像可以看成是由许多的点组成的,如图所示 图像中的单个点称为像素(pixel),每个像素都有一个值,称为像素值,它表示特定颜色的强度 一个像素值通常用R,G,B三个分量表示。 32位颜色中每个像素的每个颜色分量用8位表示,表示亮度,取值范围是0~255,0最暗,255最亮,也可用浮点数表示,范围是0~1 对于浮点数形式, (0, 0, 0)代表黑色; (1.0, 1.0, 1.0)代表白色; (1.0, 0, 0)代表红色

载入和显示图像

用来处理图像的软件包 PIL是Python的一个广泛使用的图像软件包,此处用于载入图片文件 matplotlib是Python的一个绘图库,此处用于显示图片

  1. from PIL import Image
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. #载入图片并转成numpy数组
  5. im = np.array(Image.open('numpy/证件照.jpeg'))
  6. im = im/255 #转到定义域[0,1]
  7. print(im.shape) #(638, 504, 3) 图像的宽、高、通道数
  8. plt.imshow(im) #显示图像

查看图像数据

图像的左上角像素 print(im[0,0]) 输出结果:[0.99607843 0.99607843 1. ] 表明左上角的像素为白色,白色的3个通道数据都接近1 有些图像(例如png)有4个通道,多出来的通道是alpha通道,用来指示透明度 图像最下面一行的中间像素 print(im[637,252]) 输出结果:[0.20784314 0.17647059 0.22745098] 这是接近黑色的颜色

垂直翻转图像并存储

  1. #垂直翻转图片,相当于最后一行变第一行
  2. #用切片对第一个纬度(行的维度)进行反转即可
  3. im2=im[::-1,:,:]
  4. plt.imshow(im2) #显示图片
  5. #将数据转回[0,255]区间
  6. im2=(im2*255).astype(np.uint8)
  7. #存储翻转后的图片
  8. Image.fromarray(im2).save('numpy/白色背景照片垂直翻转.jpeg')

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

平台会对你编写的代码进行测试。


开始你的任务吧,祝你成功!

代码:

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

#载入图片并转成numpy数组
im = np.array(Image.open('image/panda.png'))  
im = im/255 #转到定义域[0,1]

#1.水平翻转图片,保存到图片文件filename中
    #代码开始
def Turn_1(filename):
    im2=im[:,::-1,:]
    plt.imshow(im2)
    im2=(im2*255).astype(np.uint8)
    Image.fromarray(im2).save(filename)
    #代码结束
#2.180度翻转图片,保存到图片文件filename中
def Turn_2(filename):
    im2=im[::-1,::-1,:]
    plt.imshow(im2)
    im2=(im2*255).astype(np.uint8)
    Image.fromarray(im2).save(filename)
    #代码结束

第2关:图像伽玛转换

任务描述

本关任务:按要求实现图像的伽玛转换。

相关知识

为了完成本关任务,你需要掌握:1.什么是伽玛转换,2.如何实现伽玛转换。

图像的伽玛转换

1、什么是Gamma变换 Gamma变换是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系: Vout=AVinγ

这个指数即为Gamma。

Gamma变换就是用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正。

2、Gamma变换的基本形式 大于1时,对图像的灰度分布直方图具有拉伸作用(使灰度向高灰度值延展),如果图像整体或者感兴趣区域较暗,则Gamma>1,可以降低图像对比度;而小于1时,对图像的灰度分布直方图具有收缩作用(是使灰度向低灰度值方向靠拢),如果图像整体或者感兴趣区域较亮,则Gamma<1,可以增加图像对比度。

示例:

  1. #图片的伽玛变换
  2. im3=im**0.3 #提高对比度
  3. plt.imshow(im3) #显示图片
  4. #图片的伽玛变换
  5. im4=im**3 #降低对比度
  6. plt.imshow(im4) #显示图片

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

平台会对你编写的代码进行测试。


开始你的任务吧,祝你成功!

代码:

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

#载入图片并转成numpy数组
im = np.array(Image.open('image/panda.png'))  
im = im/255 #转到定义域[0,1]

#1.提高对比度,Gamma值设为0.4,保存到图片文件filename中
def gammaTrans_1(filename):
    #代码开始
    im2=im**0.4
    plt.imshow(im2)
    im2=(im2*255).astype(np.uint8)
    Image.fromarray(im2).save(filename)
    #代码结束
#2.降低对比度,Gamma值设为4,保存到图片文件filename中
def gammaTrans_2(filename):
    #代码开始
    im2=im**4
    plt.imshow(im2)
    im2=(im2*255).astype(np.uint8)
    Image.fromarray(im2).save(filename)
    #代码结束

第3关:图像背景颜色改变

任务描述

本关任务:编写程序按要求修改图像背景颜色。

相关知识

为了完成本关任务,你需要掌握:利用 Numpy 数组的布尔值条件筛选,对数组中的值进行更新。

修改背景颜色

educoder:Numpy图像处理

  1. #证件照更换背景颜色为蓝色
  2. #白色背景的颜色大致在0.98-1.0之间
  3. #使用布尔索引替换像素
  4. im5=im.copy() #复制数组
  5. #对轴2方向求和,即求每个像素的3通道之和
  6. im5[np.sum(im5,axis=2)>0.98*3]=[0,0,0.75]
  7. #plt.imshow(im5) #显示图片

由于衣领部分也是白色,因此被误认为是背景而错误地改成了蓝色 处理方案:轮廓搜索 对每一行,找到第一个非白色就是轮廓,将轮廓左边的颜色改成蓝色 对每一行,找到的最后一个非白色也是轮廓,将轮廓右边的颜色改成蓝色

  1. im6=im.copy() #复制数组
  2. for row in im6: #row是一行像素
  3. #where返回一个元组,元组第一个元素是列表,列表中是满足条件的元素的序号
  4. x=np.where(np.sum(row,axis=1)<0.98*3)[0]
  5. if len(x)==0:#没有满足条件的,表示全是白色
  6. row[:]=[0,0,0.75]
  7. else:#满足条件的第一个序号是轮廓左边位置,最后一个是轮廓右边
  8. row[:x[0]]=row[x[-1]:]=[0,0,0.75]
  9. plt.imshow(im6)

numpy.where()函数

numpy.where() 函数返回输入数组中满足给定条件的元素的索引。 示例:

  1. import numpy as np
  2. a = np.arange(9).reshape(3, 3)
  3. print ('我们的数组是:')
  4. print (a)
  5. print ( '大于 3 的元素的索引:')
  6. y = np.where(a > 3)
  7. print (y)
  8. print ('使用这些索引来获取满足条件的元素:')
  9. print (a[y])

输出结果:

  1. 我们的数组是:
  2. [[0 1 2]
  3. [3 4 5]
  4. [6 7 8]]
  5. 大于 3 的元素的索引:
  6. (array([1, 1, 2, 2, 2], dtype=int64), array([1, 2, 0, 1, 2], dtype=int64))
  7. 使用这些索引来获取满足条件的元素:
  8. [4 5 6 7 8]

多个条件式的使用: 多个条件式时,用()将其分开,条件式与条件式之间可以用 &,| 逻辑运算符进行连接。但不可以使用and,or等关键字链接。

  1. print(np.where((a > 2) & (a < 6), -1, 100))
  2. [[100 100 100]
  3. [ -1 -1 -1]
  4. [100 100 100]]
  5. print(np.where((a > 2) & (a < 6) | (a == 7), -1, 100))
  6. [[100 100 100]
  7. [ -1 -1 -1]
  8. [100 -1 100]]

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

平台会对你编写的代码进行测试。 原始图片如下:

educoder:Numpy图像处理


开始你的任务吧,祝你成功!

代码:

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

#载入图片并转成numpy数组
im = np.array(Image.open('image_2/doraemon.webp'))  

#修改背景颜色,保存到图片文件filename中
#背景颜色蓝色(RGB值之和在大于350小于460之间),修改为橙色(RGB的值为[255,165,0])
def Background_change(filename):
    #代码开始
    im2=im.copy()
    for i in im2:
        x=np.where((np.sum(i,axis=1)>=460)|(np.sum(i,axis=1)<=350))[0]
        if len(x)==0:
            i[:]=[255,165,0]
        else:
            i[:x[0]]=i[x[-1]:]=[255,165,0]
            plt.imshow(im2)
    Image.fromarray(im2).save(filename)
    #代码结束