第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的一个绘图库,此处用于显示图片
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
#载入图片并转成numpy数组
im = np.array(Image.open('numpy/证件照.jpeg'))
im = im/255 #转到定义域[0,1]
print(im.shape) #(638, 504, 3) 图像的宽、高、通道数
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] 这是接近黑色的颜色
垂直翻转图像并存储
#垂直翻转图片,相当于最后一行变第一行
#用切片对第一个纬度(行的维度)进行反转即可
im2=im[::-1,:,:]
plt.imshow(im2) #显示图片
#将数据转回[0,255]区间
im2=(im2*255).astype(np.uint8)
#存储翻转后的图片
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,可以增加图像对比度。
示例:
#图片的伽玛变换
im3=im**0.3 #提高对比度
plt.imshow(im3) #显示图片
#图片的伽玛变换
im4=im**3 #降低对比度
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 数组的布尔值条件筛选,对数组中的值进行更新。
修改背景颜色
#证件照更换背景颜色为蓝色
#白色背景的颜色大致在0.98-1.0之间
#使用布尔索引替换像素
im5=im.copy() #复制数组
#对轴2方向求和,即求每个像素的3通道之和
im5[np.sum(im5,axis=2)>0.98*3]=[0,0,0.75]
#plt.imshow(im5) #显示图片
由于衣领部分也是白色,因此被误认为是背景而错误地改成了蓝色 处理方案:轮廓搜索 对每一行,找到第一个非白色就是轮廓,将轮廓左边的颜色改成蓝色 对每一行,找到的最后一个非白色也是轮廓,将轮廓右边的颜色改成蓝色
im6=im.copy() #复制数组
for row in im6: #row是一行像素
#where返回一个元组,元组第一个元素是列表,列表中是满足条件的元素的序号
x=np.where(np.sum(row,axis=1)<0.98*3)[0]
if len(x)==0:#没有满足条件的,表示全是白色
row[:]=[0,0,0.75]
else:#满足条件的第一个序号是轮廓左边位置,最后一个是轮廓右边
row[:x[0]]=row[x[-1]:]=[0,0,0.75]
plt.imshow(im6)
numpy.where()函数
numpy.where() 函数返回输入数组中满足给定条件的元素的索引。 示例:
import numpy as np
a = np.arange(9).reshape(3, 3)
print ('我们的数组是:')
print (a)
print ( '大于 3 的元素的索引:')
y = np.where(a > 3)
print (y)
print ('使用这些索引来获取满足条件的元素:')
print (a[y])
输出结果:
我们的数组是:
[[0 1 2]
[3 4 5]
[6 7 8]]
大于 3 的元素的索引:
(array([1, 1, 2, 2, 2], dtype=int64), array([1, 2, 0, 1, 2], dtype=int64))
使用这些索引来获取满足条件的元素:
[4 5 6 7 8]
多个条件式的使用: 多个条件式时,用()将其分开,条件式与条件式之间可以用 &,| 逻辑运算符进行连接。但不可以使用and,or等关键字链接。
print(np.where((a > 2) & (a < 6), -1, 100))
[[100 100 100]
[ -1 -1 -1]
[100 100 100]]
print(np.where((a > 2) & (a < 6) | (a == 7), -1, 100))
[[100 100 100]
[ -1 -1 -1]
[100 -1 100]]
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试。 原始图片如下:
开始你的任务吧,祝你成功!
代码:
-
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)
-
#代码结束
转载:https://blog.csdn.net/weixin_62174595/article/details/128347692