【神經網路與深度學習-TensorFlow實踐】-中國大學MOOC課程(七)(數字影像基礎)
- 第7講 數字影像基礎
- 7.1 數字影像基本概念
- 7.1.1 影像的離散化
- 7.1.1.1 連續影像和數字影像
- 7.1.1.2 像素、位圖、色彩深度/位深度、BMP格式
- 7.1.1.3 色彩模式
- 7.1.1.3.1 二值影像(Binary Image)
- 7.1.1.3.2 灰度影像(Gray Image)
- 7.1.1.3.3 彩色影像(RGB)
- 7.1.1.3.4 RGBA影像
- 7.1.1.3.5 256色彩色影像
- 7.1.1.3.6 CMYK-印刷四粉色
- 7.1.1.3.7 YCbCr
- 7.1.1.3.8 HSI 色彩模型
- 7.1.1.4 影像格式
- 7.1.1.5 影像壓縮
- 7.1.1.5.1 JPEG格式
- 7.1.1.5.2 PNG格式(Portable Network Graphics,PNG)
- 7.1.1.5.3 GIF格式(Graphics Interchange Format)
- 7.1.1.5.4 TIFF格式(Tag Image File Format)
- 7.1.1.6 影像型別
- 7.1.1.6.1 平面二維影像
- 7.1.1.6.2 序列影像
- 7.1.1.6.3 深度影像(Depth Map):
- 7.2 Pillow影像處理庫
- 7.2.1 一些影像處理庫
- 7.2.1.1 matplotlib.image方式
- 7.2.1.2 PIL(Python Imaging Library)
- 7.2.2 Pillow庫
- 7.2.2.1 安裝和匯入包/模塊
- 7.2.2.1.1 Pillow的安裝
- 7.2.2.1.2 匯入PIL.image模塊
- 7.2.2.1.3 匯入matplotlib.pyplot模塊
- 7.2.2.2 打開影像--Image.open()函式
- 7.2.2.3 保存影像-save()方法
- 7.2.2.4 影像物件的主要屬性
- 7.2.2.5 顯示影像
- 7.2.2.6 分別顯示不同類別的影像
- 7.2.2.7 轉換影像的色彩模式
- 7.2.2.8 顏色通道的分離與合并
- 7.2.2.9 轉化為陣列
- 7.2.2.9.1 將灰度影像lena_gray.bmp轉化為陣列(反色)
- 7.2.2.10 對影像的縮放、旋轉和鏡像
- 7.2.2.10.1 縮放影像
- 7.2.2.10.1.1 img.resize()方法
- 7.2.2.10.1.2 img.thumbnail()方法
- 7.2.2.10.2 旋轉、鏡像(即左右翻轉)
- 7.2.2.11 裁剪影像
- 7.2.3 常用的影像處理庫
- 7.3 實體:手寫數字資料集MNIST
- 7.3.1 影像操作匯總表
- 7.3.2 MNIST資料集
- 7.3.2.1 下載MNIST資料集
- 7.3.2.2 輸出訓練集和測驗集的長度
- 7.3.2.3 輸出影像資料和標記資料的形狀
- 7.3.2.4 顯示手寫數字圖片
- 7.3.2.4.1 輸出資料集中的第1個樣本
- 7.3.2.4.2 顯示圖片
- 7.3.2.4.3 隨機顯示4幅手寫數字圖片
- 7.3.3 習題及相關庫補充(未作,有時間寫)
第7講 數字影像基礎
7.1 數字影像基本概念
- 有人說:計算機視覺是人工智能的大門(我不信),倒是一道門
- 計算機視覺成為人工智能應用方面的領頭羊
- 本課實體都是與影像有關的
7.1.1 影像的離散化
7.1.1.1 連續影像和數字影像
- 連續影像:人眼直接感受到的影像
- 數字影像:把連續的影像數字化、離散化之后的影像,它是對連續影像的一種近似
7.1.1.2 像素、位圖、色彩深度/位深度、BMP格式
影像是如何被離散化的?
- 像素(pixel):是影像中的一個最小單位
- 位圖(bitmap):通過記錄每一個像素值來存盤和表達的影像
- 色彩深度/位深度:位圖中每個像素點要用多少個二進制位來表示
- BMP格式:Windows系統的標準位圖格式,他能夠很好的兼容各種windows程式
可以通過windows圖片屬性查看位深度,決定存盤的位元組數,這里稱為24位真彩色

7.1.1.3 色彩模式
為什么稱為真彩色,除了24位,還有那些喃?
7.1.1.3.1 二值影像(Binary Image)
- 每個像素只有2種可能的取值,使用1位二進制來表示,位深度為1;最簡單的影像表示方式

- 在影像處理和分析時,常常首先對影像進行二值化處理
凸顯出感興趣的目標,有效的減少資料量 - 只要是僅有兩種顏色的影像,都可以被稱為二進制影像
7.1.1.3.2 灰度影像(Gray Image)
- 每個像素使用1個位元組表示,位深度為8,可以表示256種級別的灰度;
- 0表示黑色;255表示白色 ;1-254表示不同級別的灰色
- 其他任何一種單一顏色不同亮度的影像都可以稱為灰度影像

7.1.1.3.3 彩色影像(RGB)
- 每個像素都有紅(R)、綠(G)、藍(B)三個分量
- 1個像素點使用3個位元組,位深度為24位
- 可以表示256×256×256=16777216種顏色
- 對于人眼,已經可以反映出真實世界,所以稱為24位真彩色
- 通常講RGB三種分量稱為通道,如紅色通道

7.1.1.3.4 RGBA影像
- RGB影像+8位透明度資訊Alpha
- 這個透明度稱為透明度通道,或者Alpha通道

7.1.1.3.5 256色彩色影像
- 每個像素用8位二進制表示,是調色版中的索引值
- 二進制數并不代表確定的顏色,而是調色板中的索引值,對應的顏色是按照索引值在調色板中查詢出來的
- 對于不同的影像,所對應的這256種顏色的集合是不一樣的
- 在保存和加載這種型別的位圖時,需要將調色板和影像一同保存和加載
7.1.1.3.6 CMYK-印刷四粉色
- 每個像素用32位二進制表示
- C:Cyan = 青色
- M:Magenta = 洋紅色
- Y:Yellow = 黃色
- K:black = 黑色
7.1.1.3.7 YCbCr
- 是DVD、攝像機、數字電視等消費類視頻產品中色彩編碼方案
- Y:亮度分量
- Cb:藍色亮度分量
- Cr:紅色亮度分量
7.1.1.3.8 HSI 色彩模型
- 用H、S、I三個分量來描述
- H:色調
- S:飽和度
- I:亮度
7.1.1.4 影像格式
- BMP格式:占用存盤空間大,不支持檔案壓縮,不適用于網頁
7.1.1.5 影像壓縮
- 適當降低影像質量來減小它所占用的空間
- 不同的影像壓縮演算法,對應不同得影像格式
7.1.1.5.1 JPEG格式
- 它是一種有損壓縮方案
- 可以在保證高質量得前提下去除冗余的色彩和影像資料
- 壓縮率高,所占空間小
- 可以壓縮到原圖的1/20大小,而圖片的質量不會有明顯的下降,非常適合存盤照片以及在網頁中顯示照片
- 適合于色彩豐富、細節清晰細膩得大影像
- 不適合所含顏色較少,具有大塊顏色相近得區域,或亮度差異十分明顯的簡單圖片
- 每次編輯都會降低影像質量,不適合需要進行多次編輯的情況
7.1.1.5.2 PNG格式(Portable Network Graphics,PNG)
- 無損壓縮,對影像本身質量的減損非常低,逐漸流行起來
- 適合于有規律漸變色彩的影像
- 對于色彩豐富,細節清晰細膩的大圖表現效果不如JPEG格式
7.1.1.5.3 GIF格式(Graphics Interchange Format)
- 支持靜態格式和動態格式
- 靜態格式于JPEG格式的圖片類似
- 動態圖片由多幅圖片保存為一個圖片,回圈顯示,形成影片效果
- 只支持256色,適用于色彩簡單、顏色較少的小影像
7.1.1.5.4 TIFF格式(Tag Image File Format)
- 是最復雜的一種影像格式
- 定義了4類不同型別的格式
- 二值影像(TIFF-B)
- 黑白灰度影像(TIFF-G)
- 帶調色板的彩色影像(TIFF-P)
- RGB真彩影像(TIFF-R)
- 支持RGB、JPEG等多種編碼方法
- 具有非常好的擴展性、方便性、可改性,是印刷行業中最常用的格式
- Web瀏覽器不支持TIFF格式
7.1.1.6 影像型別
7.1.1.6.1 平面二維影像
- 前面介紹的所有影像都是平面二維影像
7.1.1.6.2 序列影像
- 序列影像:時間上有一定順序和間隔、內容上相關的一組影像
- 視頻影像就是一種特殊的序列影像
- 其中的每幅影像稱為幀影像
- 幀影像之間的時間間隔是固定的
7.1.1.6.3 深度影像(Depth Map):
- 是一種三維場景資訊的表達方式
- 每個像素點的取值,代表這個點離攝像機的距離
- 采用灰度圖表示,每個像素點由一個位元組表示
- 深度影像中,像素點的取值并不代表實際的距離,顏色的深淺只是代表相對距離的遠近
7.2 Pillow影像處理庫
上節回顧
- 位圖:通過記錄每一個像素的顏色值,來存盤和表達影像
- 影像格式:BMP、JPEG、PNG、GIF、TIFF
- 色彩模式:二值影像、灰度影像、RGB影像、RGBA影像、256色影像、CMYK、YCbCr、HSI
7.2.1 一些影像處理庫
7.2.1.1 matplotlib.image方式
- 僅支持匯入PBG格式的影像,且功能有限
7.2.1.2 PIL(Python Imaging Library)
- 功能豐富,且簡單易用
- 但是僅支持Python2.x版本,且已經停止更新
7.2.2 Pillow庫
- 在PIL的基礎上發展而成的兼容版本
- 支持python 3
7.2.2.1 安裝和匯入包/模塊
7.2.2.1.1 Pillow的安裝
- 使用Anaconda已經安裝好
- 使用pip命令安裝
pip install pillow
7.2.2.1.2 匯入PIL.image模塊
- pillow的核心仍是PIL,所以在使用之前仍要匯入PIL中image模塊
from PIL import Image
- iamge模塊中有一個image類,通過image類的函式和方法和屬性完成對影像的讀取、顯示和簡單的操作
7.2.2.1.3 匯入matplotlib.pyplot模塊
- 要使用matplotlib.pyplot來顯示圖片
import matplotlib.pyplot as plt
7.2.2.2 打開影像–Image.open()函式
Image.open(路徑)# 回傳image物件
有一個經常使用的影像叫做lena.tiff可以在網上下載,網址為http://www.lenna.org/
然后可以在該檔案目錄下打開
img = Image.open('lena.tiff')
得到影像物件img
7.2.2.3 保存影像-save()方法
影像物件.save(檔案路徑)
- 引數是被保存的檔案路徑
- 對于上述lena.tiff圖片就是
img.save('test.tiff')
- save()方法不僅能夠保存影像,還可以改變檔案名的后綴,就可以轉換影像格式
img.save('lena.jpg') # 將原圖存盤為jpg格式
img.save('lena.bmp') # 將原圖存盤為bpm格式
7.2.2.4 影像物件的主要屬性
| 屬性 | 說明 |
|---|---|
| 影像物件.format | 影像格式 |
| 影像物件.size | 影像尺寸 |
| 影像物件.mode | 色彩模式 |
例如:
>>> from PIL import Image
>>> import matplotlib.pyplot as plt
>>> img = Image.open('lena.tiff')
>>> img.save('test.tiff')
>>> img.save('test.jpg')
>>> img.save('test.bmp')
>>> img1 = Image.open("test.jpg")
>>> img2 = Image.open("test.bmp")
>>> print("image:",img.format)
image: TIFF
>>> print("image1:",img1.format)
image1: JPEG
>>> print("image2:",img2.format)
image2: BMP
>>> print("size:",img.size)
size: (512, 512)
>>> print("mode:",img.mode)
mode: RGB
7.2.2.5 顯示影像
*可以使用matpltlib.pyplot模塊中的 imshow()函式和show()函式顯示影像
- **plt.figure()**首先創建畫布
- **imshow()**函式負責對影像進行處理,并且顯示它的格式
- 引數cmap=“gray”;意思是影像都是以灰度影像顯示的
plt.imshow(image物件/Numpy陣列)
- 然后呼叫**show()**函式顯示出來
>>> plt.figure(figsize=(5,5))
<Figure size 500x500 with 0 Axes>
>>> plt.imshow(img)
<matplotlib.image.AxesImage object at 0x0000022508D1B908>
>>> plt.show()
運行結果為:

7.2.2.6 分別顯示不同類別的影像
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('lena.tiff')
img.save('test.tiff')
img.save('test.jpg')
img.save('test.bmp')
img = Image.open("test.tiff")
img1 = Image.open("test.jpg")
img2 = Image.open("test.bmp")
plt.figure(figsize=(15,5))
plt.subplot(131)
plt.axis("off")
plt.imshow(img)
plt.title(img.format)
plt.subplot(132)
plt.axis("off")
plt.imshow(img1)
plt.title(img1.format)
plt.subplot(133)
plt.axis("off")
plt.imshow(img2)
plt.title(img2.format)
plt.show()
結果輸出為:

7.2.2.7 轉換影像的色彩模式
| 取值 | 色彩模式 |
|---|---|
| 1 | 二值影像(每個像素8位二進制) |
| L | 灰度影像 |
| P | 8位彩色影像 |
| RGB | 24位彩色影像 |
| RGBA | 32位彩色影像 |
| CMYK | CMYK彩色影像 |
| YCbCr | YCbCr彩色影像 |
| I | 32位整型灰度影像 |
| F | 32位浮點灰度影像 |
影像物件.convert(色彩模式)
例如:
img_gray = img.convert("L")
print("mode=",img_gray.mode)
plt.figure(figsize=(5,5))
plt.imshow(img_gray)
plt.show()
輸出結果為:

本來我尋思著為啥我這個還帶點青色,難道我運行錯了,本來想留著這個疑問,但是當我存盤以后,發現是這樣的:

還可以使用save()方法將其存盤為新的檔案
img_gray.save("lena_gray.bmp")
- 雖然使用convert()函式也可以把灰度影像轉換為彩色影像,但是實際上很難恢復到原來的樣子
7.2.2.8 顏色通道的分離與合并
影像物件.split()
Image.merge(色彩模式,影像串列)
例如:
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('lena.tiff')
img_r,img_g,img_b = img.split()
plt.figure(figsize=(8,8))
plt.subplot(221)
plt.axis("off")
plt.imshow(img_r,cmap="gray")# cmap是以灰度的方式顯示
plt.title("R",fontsize=20)
plt.subplot(222)
plt.axis("off")
plt.imshow(img_g,cmap="gray")
plt.title("G",fontsize=20)
plt.subplot(223)
plt.axis("off")
plt.imshow(img_b,cmap="gray")
plt.title("B",fontsize=20)
img_rgb = Image.merge("RGB",[img_r,img_g,img_b])
# 使用merge方法將所有的通道合并
plt.subplot(224)
plt.axis("off")
plt.imshow(img_rgb)
plt.title("RGB",fontsize=20)
plt.show()
輸出結果為:

- RGB通道采用灰度圖表示顏色的亮度,R圖R通道中中,顏色越淺,表示紅色越亮,顏色越深,表示紅色越暗
7.2.2.9 轉化為陣列
- 計算機處理圖象時,有時候會先把轉化為陣列
- 陣列中的元素對應像素中的各個像素點,然后再逐像素的進行計算和處理
- 將影像物件轉化為numpy陣列
np.array(影像物件)
import numpy as np
arr_img = np.array(img)
print("shape:",arr_img.shape,"\n")
print(arr_img)
輸出結果為
shape: (512, 512, 3)
[[[226 137 125]
[226 137 125]
[223 137 133]
...
[230 148 122]
[221 130 110]
[200 99 90]]
[[226 137 125]
[226 137 125]
[223 137 133]
...
[[ 82 22 57]
[ 82 22 57]
[ 96 32 62]
...
[179 70 79]
[181 71 81]
[185 74 81]]]
7.2.2.9.1 將灰度影像lena_gray.bmp轉化為陣列(反色)
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
# 已經創建了lena_gray.bmp檔案
img_gray = Image.open("lena_gray.bmp")
arr_img_gray = np.array(img_gray)
print("\nshape:",arr_img_gray.shape)
print(arr_img_gray)
輸出結果為:
shape: (512, 512)
[[162 162 162 ... 170 155 128]
[162 162 162 ... 170 155 128]
[162 162 162 ... 170 155 128]
...
[ 43 43 50 ... 104 100 98]
[ 44 44 55 ... 104 105 108]
[ 44 44 55 ... 104 105 108]]
我們可以對這個值做一些處理:
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
img_gray = Image.open("lena_gray.bmp")
arr_img_gray = np.array(img_gray)
# 新陣列每個值都是原來的灰度值被255減去
arr_img_new = 255 - arr_img_gray
plt.figure(figsize=(10,5))
plt.subplot(221)
plt.axis("off")
plt.imshow(arr_img_gray,cmap="gray")
plt.subplot(222)
plt.axis("off")
plt.imshow(arr_img_new,cmap="gray")
plt.show()
輸出結果為:

- 可以看到影像中的灰度和原圖正好相反
- Image模塊中還提供了很多封裝好的函式,可以直接對圖片進行更上層的處理,不用轉換為陣列,對像素進行運算
7.2.2.10 對影像的縮放、旋轉和鏡像
7.2.2.10.1 縮放影像
7.2.2.10.1.1 img.resize()方法
影像物件.resize((width,height))
例如:
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
img = Image.open("lena.tiff")
plt.figure(figsize=(5,5))
img_small = img.resize((64,64))
#將其保存起來
img_small.save("lena_s.jpg")
plt.imshow(img_small)
plt.show()
輸出結果為:

- 可以看到圖片的質量明顯下降了,出現了類似馬賽克的效應,可以看到現在圖片的尺寸已經變成了64*64,這個操作是一個降采樣的程序
7.2.2.10.1.2 img.thumbnail()方法
- 該方法是原地操作,回傳值是none
- 也就是說直接對img物件進行了縮放
7.2.2.10.2 旋轉、鏡像(即左右翻轉)
影像物件.transpose(旋轉方式)
- 通過引數選擇旋轉或者翻轉的方式
| 引數 | 說明 |
|---|---|
| Image.FLIP_LEFT_RIGHT | 水平翻轉 |
| Image.FLIP_TOP_BOTTOM | 上下翻轉 |
| Image.ROTATE_90 | 逆時針旋轉90° |
| Image.ROTATE_180 | 逆時針旋轉180° |
| Image.ROTATE_270 | 逆時針旋轉270° |
| Image.TRANSPOSE | 將影像進行轉置 |
| Image.TRANSVERSE | 將影像進行轉置,再水平翻轉 |
例如:
img_flr = img.transpose(Image.FLIP_LEFT_RIGHT)
img_r90 = img.transpose(Image.ROTATE_90)
img_tp = img.transpose(Image.TRANSPOSE)
例如,下面將這些變換的結果分別顯示在不同的子途中
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = "SimHei"
img = Image.open("lena.tiff")
plt.figure(figsize=(10,10))
plt.subplot(221)
plt.axis("off")
plt.imshow(img)
plt.title("原圖",fontsize=20)
plt.subplot(222)
plt.axis("off")
img_flr = img.transpose(Image.FLIP_LEFT_RIGHT)
plt.imshow(img_flr)
plt.title("左右翻轉",fontsize=20)
plt.subplot(223)
plt.axis("off")
img_r90 = img.transpose(Image.ROTATE_90)
plt.imshow(img_r90)
plt.title("逆時針旋轉90度",fontsize=20)
plt.subplot(224)
plt.axis("off")
img_tp = img.transpose(Image.TRANSPOSE)
plt.imshow(img_tp)
plt.title("轉置",fontsize=20)
plt.show()
輸出結果為:

7.2.2.11 裁剪影像
- 裁剪影像:再影像上指定的位置裁剪出一個矩形區域
影像物件.crop((x0,y0,x1,y1))
- x0,y0 為左上角
- x1,y1 為右下角
- 回傳值:影像物件
```python
img_region = img.crop((100,100,400,400))
例如:
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open("lena.tiff")
plt.figure(figsize=(10,5))
plt.subplot(121)
plt.imshow(img)
plt.subplot(122)
img_region = img.crop((100,100,400,400))# 注意y軸是從上往下而從小到大的
plt.imshow(img_region)
plt.show()
輸出結果為:

7.2.3 常用的影像處理庫
- skimage
- cv2
7.3 實體:手寫數字資料集MNIST
7.3.1 影像操作匯總表
| 影像操作 | 方法/函式/屬性 |
|---|---|
| 打開影像 | Image.open(路徑) |
| 保存影像 | 影像物件.save() |
| 查看影像的屬性 | 影像物件.format、影像物件.size、影像物件.mode |
| 顯示影像 | plt.imshow(Image物件/Numpy陣列) |
| 轉移影像的色彩模式 | 影像物件.convert(色彩模式) |
| 顏色通道的分離和合并 | 影像物件.split()、Image.merge(色彩模式,影像串列) |
| 將影像轉換為陣列 | np.array(影像物件) |
| 影像的縮放 | 影像物件.resize((width,height)) |
| 旋轉和鏡像 | 影像物件.transpose(旋轉方式) |
7.3.2 MNIST資料集
- Mixed National Institute of standards and Technology and Technology database
- New York University, Yann LeCun
- 60000條訓練資料和10000條測驗資料
- 由250個不同的人手寫而成
- 都是28*28像素,灰度影像
- 將每一副圖片存盤在28*28的二維陣列中,陣列中的每個元素對應著圖片中的每個像素
- MNIST資料集已經被集成在keras中了,可以使用keras中的datasets模塊來訪問它
7.3.2.1 下載MNIST資料集
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()
第一次會先進行下載:
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 12s 1us/step
- 下載路徑:
C:\Users\Administrator\.keras\datasets\mnist.npz
7.3.2.2 輸出訓練集和測驗集的長度
print("Training set:",len(train_x))
print("testing set:",len(test_x))
輸出結果為:
Training set: 60000
testing set: 10000
7.3.2.3 輸出影像資料和標記資料的形狀
print("train_x:",train_x.shape,train_x.dtype)
print("trian_y:",train_y.shape,train_y.dtype)
輸出結果為:
train_x: (60000, 28, 28) uint8
trian_y: (60000,) uint8
7.3.2.4 顯示手寫數字圖片
7.3.2.4.1 輸出資料集中的第1個樣本
- 這是一個28*28中的陣列,陣列中的每個元素對應影像的一個像素
- 因為數字的背景為黑色,數字不為零的元素就是手寫的筆畫的部分
>>> train_x[0]
array([[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 3,
18, 18, 18, 126, 136, 175, 26, 166, 255, 247, 127, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 30, 36, 94, 154, 170,
253, 253, 253, 253, 253, 225, 172, 253, 242, 195, 64, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 49, 238, 253, 253, 253, 253,
253, 253, 253, 253, 251, 93, 82, 82, 56, 39, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 18, 219, 253, 253, 253, 253,
253, 198, 182, 247, 241, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 80, 156, 107, 253, 253,
205, 11, 0, 43, 154, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 14, 1, 154, 253,
90, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 139, 253,
190, 2, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 11, 190,
253, 70, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 35,
241, 225, 160, 108, 1, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
81, 240, 253, 253, 119, 25, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 45, 186, 253, 253, 150, 27, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 16, 93, 252, 253, 187, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 249, 253, 249, 64,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 46, 130, 183, 253, 253, 207, 2,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 39,
148, 229, 253, 253, 253, 250, 182, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 24, 114, 221,
253, 253, 253, 253, 201, 78, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 23, 66, 213, 253, 253,
253, 253, 198, 81, 2, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 18, 171, 219, 253, 253, 253, 253,
195, 80, 9, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 55, 172, 226, 253, 253, 253, 253, 244, 133,
11, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 136, 253, 253, 253, 212, 135, 132, 16, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0]], dtype=uint8)
7.3.2.4.2 顯示圖片
import tensorflow as tf
import matplotlib.pyplot as plt
mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()
plt.axis("off")
plt.imshow(train_x[0],cmap="gray")
plt.show()
輸出結果為:

- 下面輸出這個圖片的標簽
>>> train_y[0]
5
7.3.2.4.3 隨機顯示4幅手寫數字圖片
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()
for i in range(4):
num = np.random.randint(1,60000)
plt.subplot(1,4,i+1)
plt.axis("off")
plt.imshow(train_x[num],cmap="gray")
plt.title(train_y[num])
plt.show()
輸出結果為:

7.3.3 習題及相關庫補充(未作,有時間寫)




轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/350795.html
標籤:AI
上一篇:手把手寫深度學習(3)——用RNN回圈神經網路自動生成歌詞之理論篇
下一篇:機器學習中的距離計算方法
