iT邦幫忙

2021 iThome 鐵人賽

DAY 20
0
AI & Data

學資料科學的小孩不會變壞- 從入門到實戰全攻略系列 第 20

DAY20 圖片處理套件-OpenCV

昨天我們介紹了深度學習的概念和應用,今天來介紹一下圖片的處理,前一章我們有提到,一張圖片對於神經網路來說就是很多像素組成的矩陣,為了讓神經網路能夠學習它,我們必須將圖片進行一些處理動作,這也是我們在進行任何圖片分類的專案前要先做的,類似於機器學習的資料前處理。


一、圖片組成

首先介紹一下圖片的組成,一張圖片是由mn個像素(pixels)組成的,可以把像素想像成一種顏色的小格子,組成起來就是一張圖片,一張圖片的資訊如下:

Size:圖片的大小,圖片是二維的,大小的表示就是Length*Width
Channel:通道數,簡單來說就是幾種基本顏色組成的,一般的彩色照片通道數就是3(RGB)
Shape: 圖片的完整信息,包括Size及Channel數,EX: (Length,Width,Channel)


二、處理套件-OpenCV

OpenCV是目前相當廣泛的圖片處理套件,它包括簡單的圖片基本處理,也有較進階的使用方法,因為很多人使用,因此在網路上也找的到很多資源,相當方便,下面就帶大家進行一些簡單的處理。

要使用此套件前需先下載資源包(Anaconda)

conda install opencv

載入套件

import cv2  #圖片處理
import matplotlib.pyplot as plt  #畫出圖片

讀取圖片,這邊可以看到讀進來的圖片會以陣列顯示像素

img = cv2.imread("husky.jpg")
img

https://ithelp.ithome.com.tw/upload/images/20210920/20140427HH0IeVN6mU.jpg

顯示圖片

plt.imshow(img,cmap=None) #參數cmap是輸出照片的顏色,如果是黑白照片要設為灰階圖"gray"

https://ithelp.ithome.com.tw/upload/images/20210914/20140427rR6019wVGL.jpg

查看圖片資訊(shape,資料型態,最大最小像素值)

print(f"image shape: {img.shape}")
print(f"data type: {img.dtype}")
print(f"min: {img.min()}, max: {img.max()}")

https://ithelp.ithome.com.tw/upload/images/20210914/20140427cD5elNnc1b.jpg

縮放圖片

img=cv2.resize(img,(512,512))

三、進階圖片處理

直方圖均衡化(Histogram Equalization)

前面有介紹過直方圖的用途,可以方便我們看出資料像素分佈的狀況(0-255),我們可以了解到這張影像是偏亮或偏暗,以便去做處理。

plt.hist(img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)

https://ithelp.ithome.com.tw/upload/images/20210914/20140427CbVYj7cCwL.jpg
我們都知道像素為0是黑色,255是白色,因此直方圖的峰值若靠近左側(0),代表影像整體偏暗,靠印右側(255)代表整體偏亮,如果集中在中間,代表整張圖的明暗對比不明顯,而直方圖最理想的狀況就是平均分布,因此我們會傾向將圖片實施直方圖均衡化,讓它平均分布在0到255之間。

這邊我們就不具體說明它的演算方式,直接以程式碼來做示範。

這邊我們以一張灰階圖做示範

#Histogram Equalization
equalize_img = cv2.equalizeHist(img) 

plt.figure(figsize=(14, 9))
plt.subplot(2, 2, 1)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.title(f"Original")

plt.subplot(2, 2, 2)
plt.imshow(equalize_img, cmap="gray")
plt.axis("off")
plt.title(f"Histogram")

plt.subplot(2, 2, 3)
plt.hist(img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)

plt.subplot(2, 2, 4)
plt.hist(equalize_img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)
plt.show()

https://ithelp.ithome.com.tw/upload/images/20210914/20140427j3Z6xJ4nNs.jpg
可以看到經過直方圖均衡化後,像素分布更為平均,明暗對比也提高了許多。

局部均衡化(createCLAHE)

使用Histogram Equalization是對全局圖片進行調整,因此也會存在著一些問題,像是因為整體影像的亮度增加,可能有些小地方會變得模糊,因此有了另一種方法:createCLAHE,這種方法是對部分影像分別做均衡化,限制局部明暗對比太大的狀況。

clahe = cv2.createCLAHE()
clahe_img = clahe.apply(img)

plt.figure(figsize=(20, 12))
plt.subplot(2, 3, 1)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.title(f"Original")

plt.subplot(2, 3, 2)
plt.imshow(equalize_img, cmap="gray")
plt.axis("off")
plt.title(f"Histogram")

plt.subplot(2, 3, 3)
plt.imshow(clahe_img, cmap="gray")
plt.axis("off")
plt.title(f"CLAHE")

plt.subplot(2, 3, 4)
plt.hist(img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)
plt.title(f"Original")

plt.subplot(2, 3, 5)
plt.hist(equalize_img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)
plt.title(f"Histogram")

plt.subplot(2, 3, 6)
plt.hist(clahe_img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)
plt.title(f"CLAHE")
plt.show()

https://ithelp.ithome.com.tw/upload/images/20210914/20140427N4gBafO2po.jpg


四、結論

今天介紹了圖片處理套件Opencv以及一些基本的影像處理方法,可以把這個步驟視為影像資料的前處理,我們也可以進一步了解接下來要處理的影像,若一開始能把影像處理的妥當,在丟給神經網路學習時也會得到較好的效果。


上一篇
DAY19 淺談深度學習
下一篇
DAY21 資料正規化與資料增強(Data Normalization & Data Augmentation)
系列文
學資料科學的小孩不會變壞- 從入門到實戰全攻略30

尚未有邦友留言

立即登入留言